]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: allow a RAID1 to be reshaped directly to 3-drive RAID5
authorNeilBrown <neilb@suse.de>
Wed, 9 Mar 2011 07:30:03 +0000 (18:30 +1100)
committerNeilBrown <neilb@suse.de>
Wed, 9 Mar 2011 07:30:03 +0000 (18:30 +1100)
Self-tests require this but code didn't allow it any more.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c

diff --git a/Grow.c b/Grow.c
index 88c8ad75b287a7140fddc9828af205d361e7aaef..387bdbd58aee540e499a2246c721e1282d61a393 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -952,13 +952,17 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
                }
                if (info->array.raid_disks == 2 &&
                    info->new_level == 5) {
                }
                if (info->array.raid_disks == 2 &&
                    info->new_level == 5) {
-                       if (info->delta_disks != UnSet &&
-                           info->delta_disks != 0)
-                               return "Cannot change number of disks "
-                                       "with RAID1->RAID5 conversion";
+
                        re->level = 5;
                        re->before.data_disks = 1;
                        re->level = 5;
                        re->before.data_disks = 1;
-                       re->after.data_disks = 1;
+                       if (info->delta_disks != UnSet &&
+                           info->delta_disks != 0)
+                               re->after.data_disks = 1 + info->delta_disks;
+                       else
+                               re->after.data_disks = 1;
+                       if (re->after.data_disks < 1)
+                               return "Number of disks too small for RAID5";
+
                        re->before.layout = ALGORITHM_LEFT_SYMMETRIC;
                        info->array.chunk_size = 65536;
                        break;
                        re->before.layout = ALGORITHM_LEFT_SYMMETRIC;
                        info->array.chunk_size = 65536;
                        break;