summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2017-04-06 00:01:29 +0200
committerHeinz Mauelshagen <heinzm@redhat.com>2017-04-06 00:03:16 +0200
commit1ef1bdab27b2e2d3fb2491b42e3f7afa3b93140e (patch)
tree9c60ff3c2d8dff2a606e46423fc7fb6b13febb6a
parent7ccb4825c7c5f40e93afea065100105f3d5f3551 (diff)
downloadlvm2-1ef1bdab27b2e2d3fb2491b42e3f7afa3b93140e.tar.gz
lvconvert: allow --type with --regionsize
Allow the combination of both arguments keeping the raid level but changing the regionssize (e.g. "lvconvert --type raid1 --regionsize 1M RaidLV" on an existing raid1 LV). Resolves: rhbz1438396
-rw-r--r--lib/metadata/raid_manip.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 63a2a6c57..c7d1d7604 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -5355,7 +5355,7 @@ static int _takeover_from_raid1_to_raid0_meta(TAKEOVER_FN_ARGS)
static int _takeover_from_raid1_to_raid1(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _takeover_unsupported(lv, new_segtype, 0, 0, 0, 0, new_stripes, 0, 0, NULL);
}
static int _takeover_from_raid1_to_raid10(TAKEOVER_FN_ARGS)
@@ -5975,7 +5975,29 @@ int lv_raid_convert(struct logical_volume *lv,
/* Exit without doing activation checks if the combination isn't possible */
if (_takeover_not_possible(takeover_fn))
return takeover_fn(lv, new_segtype, yes, force, new_image_count, 0, new_stripes, stripe_size,
- region_size, allocate_pvs);
+ region_size, allocate_pvs);
+
+ /*
+ * User requested "--type raid*" without neither
+ * requesting a reshape nor a takeover.
+ *
+ * I.e. the raid level is the same but no layout,
+ * stripesize or number of stripes change is required.
+ *
+ * Check if a regionsize change is required.
+ */
+ if (seg->segtype == new_segtype && new_region_size) {
+ if (seg->region_size != new_region_size) {
+ log_verbose("Converting %s LV %s to regionsize %s.",
+ lvseg_name(first_seg(lv)), display_lvname(lv),
+ display_size(lv->vg->cmd, new_region_size));
+ return _region_size_change_requested(lv, yes, new_region_size);
+ } else {
+ log_error("Can't convert %s LV %s without a region size change.",
+ lvseg_name(seg), display_lvname(lv));
+ return 0;
+ }
+ }
log_verbose("Converting %s from %s to %s.",
display_lvname(lv), lvseg_name(first_seg(lv)),