From 6d4b67aebd24b36340eb76f4a4cb2743b641fa99 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Tue, 7 Feb 2017 11:52:13 -0600 Subject: lvconvert: add command to change region size of a raid LV --- lib/metadata/metadata-exported.h | 2 ++ lib/metadata/raid_manip.c | 6 ++++++ tools/command-lines.in | 6 ++++++ tools/lvconvert.c | 15 +++++++++++++++ tools/lvmcmdline.c | 1 + tools/tools.h | 1 + 6 files changed, 31 insertions(+) diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index 235f634a2..88ccb0be4 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -1224,6 +1224,8 @@ int lv_raid_replace(struct logical_volume *lv, int force, struct dm_list *remove_pvs, struct dm_list *allocate_pvs); int lv_raid_remove_missing(struct logical_volume *lv); int partial_raid_lv_supports_degraded_activation(const struct logical_volume *lv); +int lv_raid_change_region_size(struct logical_volume *lv, + int yes, int force, uint32_t new_region_size); /* -- metadata/raid_manip.c */ /* ++ metadata/cache_manip.c */ diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c index 6efbc5cbe..f543f2591 100644 --- a/lib/metadata/raid_manip.c +++ b/lib/metadata/raid_manip.c @@ -4092,6 +4092,12 @@ int lv_raid_convert(struct logical_volume *lv, new_region_size, allocate_pvs); } +int lv_raid_change_region_size(struct logical_volume *lv, + int yes, int force, uint32_t new_region_size) +{ + return _region_size_change_requested(lv, yes, new_region_size); +} + static int _remove_partial_multi_segment_image(struct logical_volume *lv, struct dm_list *remove_pvs) { diff --git a/tools/command-lines.in b/tools/command-lines.in index 501c9c3ee..9ae419573 100644 --- a/tools/command-lines.in +++ b/tools/command-lines.in @@ -352,6 +352,12 @@ ID: lvconvert_raid_types DESC: Convert LV to raid1 or mirror, or change number of mirror images. RULE: all not lv_is_locked lv_is_pvmove +lvconvert --regionsize SizeMB LV +OO: OO_LVCONVERT +ID: lvconvert_change_region_size +DESC: Change the region size of an LV. +RULE: all not lv_is_locked lv_is_pvmove + --- # lvconvert raid-related utilities diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 72d9db7a9..d4821c261 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -4402,6 +4402,21 @@ out: return ret; } +static int _lvconvert_change_region_size_single(struct cmd_context *cmd, struct logical_volume *lv, + struct processing_handle *handle) +{ + if (!lv_raid_change_region_size(lv, arg_is_set(cmd, yes_ARG), arg_count(cmd, force_ARG), + arg_int_value(cmd, regionsize_ARG, 0))) + return ECMD_FAILED; + return ECMD_PROCESSED; +} + +int lvconvert_change_region_size_cmd(struct cmd_context * cmd, int argc, char **argv) +{ + return process_each_lv(cmd, 1, cmd->position_argv, NULL, NULL, READ_FOR_UPDATE, + NULL, &_lvconvert_visible_check, &_lvconvert_change_region_size_single); +} + /* * split mirror images */ diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c index 1345c453d..a1964b3ec 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -152,6 +152,7 @@ struct command_function command_functions[CMD_COUNT] = { { lvconvert_split_mirror_images_CMD, lvconvert_split_mirror_images_cmd}, { lvconvert_change_mirrorlog_CMD, lvconvert_change_mirrorlog_cmd }, { lvconvert_merge_mirror_images_CMD, lvconvert_merge_mirror_images_cmd }, + { lvconvert_change_region_size_CMD, lvconvert_change_region_size_cmd }, /* redirected to merge_snapshot/merge_thin/merge_mirrors */ { lvconvert_merge_CMD, lvconvert_merge_cmd }, diff --git a/tools/tools.h b/tools/tools.h index 4e1d87f01..00476d106 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -284,6 +284,7 @@ int lvconvert_raid_types_cmd(struct cmd_context * cmd, int argc, char **argv); int lvconvert_split_mirror_images_cmd(struct cmd_context * cmd, int argc, char **argv); int lvconvert_merge_mirror_images_cmd(struct cmd_context *cmd, int argc, char **argv); int lvconvert_change_mirrorlog_cmd(struct cmd_context * cmd, int argc, char **argv); +int lvconvert_change_region_size_cmd(struct cmd_context * cmd, int argc, char **argv); int lvconvert_merge_cmd(struct cmd_context *cmd, int argc, char **argv); -- cgit v1.2.1