summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2016-12-09 10:08:26 -0600
committerDavid Teigland <teigland@redhat.com>2016-12-09 10:08:26 -0600
commit2023297736cde3c7491f5e65fba8050f980b9d8e (patch)
tree3a12dd9bc389b2e66a3a8acd1527c43bac665950
parentc0a356561aab01cedcdd603e580162aea2b4e0de (diff)
downloadlvm2-2023297736cde3c7491f5e65fba8050f980b9d8e.tar.gz
lvconvert: use command defs for thin merge
-rw-r--r--test/shell/thin-merge.sh4
-rw-r--r--test/shell/thin-vglock.sh2
-rw-r--r--tools/args.h1
-rw-r--r--tools/command-lines.in8
-rw-r--r--tools/lvconvert.c24
-rw-r--r--tools/lvmcmdline.c9
-rw-r--r--tools/tools.h1
7 files changed, 38 insertions, 11 deletions
diff --git a/test/shell/thin-merge.sh b/test/shell/thin-merge.sh
index b3ad00760..d9329247c 100644
--- a/test/shell/thin-merge.sh
+++ b/test/shell/thin-merge.sh
@@ -44,7 +44,7 @@ touch mntsnap/test_snap
lvs -o+tags,thin_id $vg
-lvconvert --merge $vg/snap
+lvconvert --mergethin $vg/snap
umount mnt
@@ -107,7 +107,7 @@ fsck -n "$DM_DEV_DIR/$vg/$lv1"
check lv_not_exists $vg oldsnapof_${lv1}
# Add old snapshot to thin snapshot
lvcreate -s -L10 -n oldsnapof_snap $vg/snap
-lvconvert --merge $vg/snap
+lvconvert --mergethin $vg/snap
lvremove -f $vg/oldsnapof_snap
vgremove -ff $vg
diff --git a/test/shell/thin-vglock.sh b/test/shell/thin-vglock.sh
index e59636dc3..381d9fa4c 100644
--- a/test/shell/thin-vglock.sh
+++ b/test/shell/thin-vglock.sh
@@ -34,7 +34,7 @@ mount "$DM_DEV_DIR/$vg/$lv1" mnt
lvcreate -s -n snap $vg/$lv1
check lv_field $vg/snap thin_id "3"
-lvconvert --merge $vg/snap
+lvconvert --mergethin $vg/snap
umount mnt
vgchange -an $vg
diff --git a/tools/args.h b/tools/args.h
index 654f7189e..c90460977 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -61,6 +61,7 @@ arg(logonly_ARG, '\0', "logonly", 0, 0, 0)
arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0)
arg(merge_ARG, '\0', "merge", 0, 0, 0)
arg(mergesnapshot_ARG, '\0', "mergesnapshot", 0, 0, 0)
+arg(mergethin_ARG, '\0', "mergethin", 0, 0, 0)
arg(mergedconfig_ARG, '\0', "mergedconfig", 0, 0, 0)
arg(metadatacopies_ARG, '\0', "metadatacopies", metadatacopies_VAL, 0, 0)
arg(metadataignore_ARG, '\0', "metadataignore", bool_VAL, 0, 0)
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 521dd8ded..ac4b4011b 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -892,6 +892,14 @@ DESC: (infers --type thin).
---
+lvconvert --mergethin LV_thin ...
+OO: --background, --interval Number, OO_LVCONVERT
+ID: lvconvert_merge_thin
+DESC: Merge thin LV into its origin LV.
+RULE: all not lv_is_locked lv_is_pvmove lv_is_merging_origin lv_is_virtual_origin lv_is_external_origin lv_is_merging_cow
+
+---
+
# stripes option is not intuitive when creating a thin LV,
# but here it applies to creating the new thin pool that
# is used for the thin LV
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 0c0fbd9f5..6d3e949bc 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2242,8 +2242,7 @@ static int _lvconvert_merge_old_snapshot(struct cmd_context *cmd,
}
static int _lvconvert_merge_thin_snapshot(struct cmd_context *cmd,
- struct logical_volume *lv,
- struct lvconvert_params *lp)
+ struct logical_volume *lv)
{
int origin_is_active = 0, r = 0;
struct lv_segment *snap_seg = first_seg(lv);
@@ -3698,7 +3697,7 @@ static int _lvconvert_to_pool(struct cmd_context *cmd,
}
if (metadata_lv && (meta_extents > metadata_lv->le_count)) {
- log_error("Pool metadata LV %s is too small (%s extents) for required metadata (%s extents).",
+ log_error("Pool metadata LV %s is too small (%u extents) for required metadata (%u extents).",
display_lvname(metadata_lv), metadata_lv->le_count, meta_extents);
return 0;
}
@@ -4125,7 +4124,7 @@ static int _lvconvert_to_cache_vol(struct cmd_context *cmd,
static int _convert_thin_volume_merge(struct cmd_context *cmd, struct logical_volume *lv,
struct lvconvert_params *lp)
{
- return _lvconvert_merge_thin_snapshot(cmd, lv, lp);
+ return _lvconvert_merge_thin_snapshot(cmd, lv);
}
/*
@@ -6078,3 +6077,20 @@ int lvconvert_swap_pool_metadata_noarg_cmd(struct cmd_context *cmd, int argc, ch
return lvconvert_swap_pool_metadata_cmd(cmd, argc, argv);
}
#endif
+
+static int _lvconvert_merge_thin_single(struct cmd_context *cmd,
+ struct logical_volume *lv,
+ struct processing_handle *handle)
+{
+ if (!_lvconvert_merge_thin_snapshot(cmd, lv))
+ return ECMD_FAILED;
+
+ return ECMD_PROCESSED;
+}
+
+int lvconvert_merge_thin_cmd(struct cmd_context *cmd, int argc, char **argv)
+{
+ return process_each_lv(cmd, cmd->position_argc, cmd->position_argv, NULL, NULL, READ_FOR_UPDATE,
+ NULL, NULL, &_lvconvert_merge_thin_single);
+}
+
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 857147768..91178014a 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -144,6 +144,11 @@ struct command_function command_functions[COMMAND_ID_COUNT] = {
{ lvconvert_to_cache_vol_CMD, lvconvert_to_cache_vol_cmd },
{ lvconvert_swap_pool_metadata_CMD, lvconvert_swap_pool_metadata_cmd },
{ lvconvert_swap_pool_metadata_deprecated_CMD, lvconvert_swap_pool_metadata_cmd },
+ { lvconvert_merge_thin_CMD, lvconvert_merge_thin_cmd },
+#if 0
+ { lvconvert_split_and_keep_cachepool_CMD, lvconvert_split_cachepool_cmd },
+ { lvconvert_split_and_delete_cachepool_CMD, lvconvert_split_cachepool_cmd },
+#endif
};
#if 0
@@ -154,10 +159,6 @@ struct command_function command_functions[COMMAND_ID_COUNT] = {
{ lvconvert_split_mirror_images_CMD, lvconvert_split_mirror_images_fn },
{ lvconvert_change_mirrorlog_CMD, lvconvert_change_mirrorlog_fn },
- /* utilities for creating/maintaining thin and cache objects. */
- { lvconvert_split_and_keep_cachepool_CMD, lvconvert_split_and_keep_cachepool_fn },
- { lvconvert_split_and_delete_cachepool_CMD, lvconvert_split_and_delete_cachepool_fn },
-
/* directed to one of the other merges (snap,thin,mirror) when all are implemented */
{ lvconvert_merge_CMD, lvconvert_merge_fn },
#endif
diff --git a/tools/tools.h b/tools/tools.h
index de672b68a..e3094b2f4 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -265,5 +265,6 @@ int lvconvert_to_pool_noarg_cmd(struct cmd_context *cmd, int argc, char **argv);
int lvconvert_to_cache_vol_cmd(struct cmd_context *cmd, int argc, char **argv);
int lvconvert_to_thin_with_external_cmd(struct cmd_context *cmd, int argc, char **argv);
int lvconvert_swap_pool_metadata_cmd(struct cmd_context *cmd, int argc, char **argv);
+int lvconvert_merge_thin_cmd(struct cmd_context *cmd, int argc, char **argv);
#endif