1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

raid: reject conversion request to striped/raid0 on 2-legged raid4/5

raid4/5 LVs may only be converted to striped or raid0/raid0_meta
in case they have at least 3 legs. 2-legged raid4/5 are a result
of either converting a raid1 to raid4/5 (takeover) or converting
a raid4/5 with more than 2 legs to raid1 with 2 legs (reshape).

The raid4/5 personalities map those as raid1,
thus reject conversion to striped/raid0.

Resolves: rhbz1511047
This commit is contained in:
Heinz Mauelshagen 2017-11-08 17:49:04 +01:00
parent b78add3df5
commit 763db8aab0

View File

@ -5163,15 +5163,23 @@ static int _takeover_downconvert_wrapper(TAKEOVER_FN_ARGS)
return 0;
}
if (seg_is_any_raid5(seg) &&
segtype_is_raid1(new_segtype)) {
if (seg->area_count != 2) {
log_error("Can't convert %s LV %s to %s with != 2 legs.",
lvseg_name(seg), display_lvname(lv), new_segtype->name);
return 0;
if (seg_is_raid4(seg) || seg_is_any_raid5(seg)) {
if (segtype_is_raid1(new_segtype)) {
if (seg->area_count != 2) {
log_error("Can't convert %s LV %s to %s with != 2 legs.",
lvseg_name(seg), display_lvname(lv), new_segtype->name);
return 0;
}
if (seg->area_count != new_image_count) {
log_error(INTERNAL_ERROR "Bogus new_image_count converting %s LV %s to %s.",
lvseg_name(seg), display_lvname(lv), new_segtype->name);
return 0;
}
}
if (seg->area_count != new_image_count) {
log_error(INTERNAL_ERROR "Bogus new_image_count converting %s LV %s to %s.",
if ((segtype_is_striped_target(new_segtype) || segtype_is_any_raid0(new_segtype)) &&
seg->area_count < 3) {
log_error("Can't convert %s LV %s to %s with < 3 legs.",
lvseg_name(seg), display_lvname(lv), new_segtype->name);
return 0;
}