]> sourceware.org Git - lvm2.git/commitdiff
raid: reject conversion request to striped/raid0 on 2-legged raid4/5
authorHeinz Mauelshagen <heinzm@redhat.com>
Wed, 8 Nov 2017 16:49:04 +0000 (17:49 +0100)
committerHeinz Mauelshagen <heinzm@redhat.com>
Wed, 8 Nov 2017 16:49:04 +0000 (17:49 +0100)
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

lib/metadata/raid_manip.c

index da00905cd0a36be62156a1e234239e2c96d7eba5..816c6d4dc3edf00e12c5dbf8e4aa47a4da367f55 100644 (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;
                }
This page took 0.041837 seconds and 5 git commands to generate.