md/raid10: recognise replacements when assembling array.
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>
This commit is contained in:
parent
4ca40c2ce0
commit
56a2559bb6
@ -3201,6 +3201,16 @@ static int run(struct mddev *mddev)
|
|||||||
continue;
|
continue;
|
||||||
disk = conf->mirrors + disk_idx;
|
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->rdev = rdev;
|
||||||
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
||||||
rdev->data_offset << 9);
|
rdev->data_offset << 9);
|
||||||
@ -3228,6 +3238,13 @@ static int run(struct mddev *mddev)
|
|||||||
|
|
||||||
disk = conf->mirrors + i;
|
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 ||
|
if (!disk->rdev ||
|
||||||
!test_bit(In_sync, &disk->rdev->flags)) {
|
!test_bit(In_sync, &disk->rdev->flags)) {
|
||||||
disk->head_position = 0;
|
disk->head_position = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user