|
@@ -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;
|