]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
md/raid10: recognise replacements when assembling array.
authorNeilBrown <neilb@suse.de>
Fri, 9 Dec 2011 03:27:07 +0000 (14:27 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 9 Dec 2011 03:27:07 +0000 (14:27 +1100)
If a Replacement is seen, file it as such.

If we see two replacements (or two normal devices) for the one slot,
abort.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid10.c

index 7d3d34f6c246a8443ae222a8365692dcd5a5b9ce..e1b029fd22690c4d47cfb3ee192ced1ffc48bb9e 100644 (file)
@@ -3201,6 +3201,16 @@ static int run(struct mddev *mddev)
                        continue;
                disk = conf->mirrors + disk_idx;
 
+               if (test_bit(Replacement, &rdev->flags)) {
+                       if (disk->replacement)
+                               goto out_free_conf;
+                       disk->replacement = rdev;
+               } else {
+                       if (disk->rdev)
+                               goto out_free_conf;
+                       disk->rdev = rdev;
+               }
+
                disk->rdev = rdev;
                disk_stack_limits(mddev->gendisk, rdev->bdev,
                                  rdev->data_offset << 9);
@@ -3228,6 +3238,13 @@ static int run(struct mddev *mddev)
 
                disk = conf->mirrors + i;
 
+               if (!disk->rdev && disk->replacement) {
+                       /* The replacement is all we have - use it */
+                       disk->rdev = disk->replacement;
+                       disk->replacement = NULL;
+                       clear_bit(Replacement, &disk->rdev->flags);
+               }
+
                if (!disk->rdev ||
                    !test_bit(In_sync, &disk->rdev->flags)) {
                        disk->head_position = 0;