]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
FIX: disks added beyond array should be counted during reshape
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 23 Feb 2011 13:51:39 +0000 (14:51 +0100)
committerNeilBrown <neilb@suse.de>
Sun, 27 Feb 2011 06:26:42 +0000 (17:26 +1100)
During expansion there is more working disks that array can have.
Disks with set raid_disk (not a spare disk) during reshape should be counted
to allow array state transition to read_only state.

Array reconfiguration to new geometry should be done before reshape will
be started.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c

index 317be8b7314595adef30df09f3482418818b2aaa..4d4108122d6b537ef393d63a06c117dd65dac06d 100644 (file)
@@ -1504,6 +1504,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
 {
        struct mdinfo *dev, *sra;
        int working = 0, preexist = 0;
+       int expansion = 0;
        struct map_ent *map = NULL;
 
        sysfs_init(content, mdfd, 0);
@@ -1522,6 +1523,9 @@ int assemble_container_content(struct supertype *st, int mdfd,
                        working++;
                else if (errno == EEXIST)
                        preexist++;
+               else if (dev->disk.raid_disk >= content->array.raid_disks &&
+                         content->reshape_active)
+                       expansion++;
        if (working == 0) {
                close(mdfd);
                return 1;/* Nothing new, don't try to start */
@@ -1532,7 +1536,8 @@ int assemble_container_content(struct supertype *st, int mdfd,
                   content->uuid, chosen_name);
 
        if (runstop > 0 ||
-                (working + preexist) >= content->array.working_disks) {
+                (working + preexist + expansion) >=
+                       content->array.working_disks) {
                int err;
 
                switch(content->array.level) {
@@ -1566,6 +1571,9 @@ int assemble_container_content(struct supertype *st, int mdfd,
                                        chosen_name, working + preexist);
                        if (preexist)
                                fprintf(stderr, " (%d new)", working);
+                       if (expansion)
+                               fprintf(stderr, " ( + %d for expansion)",
+                                       expansion);
                        fprintf(stderr, "\n");
                }
                if (!err)