diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2017-04-06 00:01:29 +0200 |
---|---|---|
committer | Heinz Mauelshagen <heinzm@redhat.com> | 2017-04-06 00:03:16 +0200 |
commit | 1ef1bdab27b2e2d3fb2491b42e3f7afa3b93140e (patch) | |
tree | 9c60ff3c2d8dff2a606e46423fc7fb6b13febb6a | |
parent | 7ccb4825c7c5f40e93afea065100105f3d5f3551 (diff) | |
download | lvm2-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.c | 26 |
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)), |