]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: fix problem with reshaping RAID4 to RAID0.
authorNeilBrown <neilb@suse.de>
Thu, 21 Feb 2013 06:02:21 +0000 (17:02 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 21 Feb 2013 06:02:21 +0000 (17:02 +1100)
As 'layout' doesn't map neatly from RAID4 to RAID5, we need to
set it correctly for RAID4.
Also, when no reshape is needed we should set re->level to the final
desired level.

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

diff --git a/Grow.c b/Grow.c
index 1ab6f4064a37a9a6092a7dd04acdeb8d7d193305..2cc93578c9461c2dfc8c0eeda907be235937bde1 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1321,6 +1321,7 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
 
                switch (re->level) {
                case 4:
+                       re->before.layout = 0;
                        re->after.layout = 0;
                        break;
                case 5:
@@ -1336,6 +1337,7 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
 
                switch (re->level) {
                case 4:
+                       re->before.layout = 0;
                        re->after.layout = 0;
                        break;
                case 5:
@@ -1428,12 +1430,14 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
        if (re->after.data_disks == re->before.data_disks &&
            re->after.layout == re->before.layout &&
            info->new_chunk == info->array.chunk_size) {
-               /* Nothing to change */
+               /* Nothing to change, can change level immediately. */
+               re->level = info->new_level;
                re->backup_blocks = 0;
                return NULL;
        }
        if (re->after.data_disks == 1 && re->before.data_disks == 1) {
                /* chunk and layout changes make no difference */
+               re->level = info->new_level;
                re->backup_blocks = 0;
                return NULL;
        }