From bedadf5d39bf6a3bd878ade0df9559f32095e0c8 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 23 Dec 2011 10:17:55 +1100 Subject: [PATCH] --- yaml --- r: 280518 b: refs/heads/master c: 56a2559bb654ae2555b2ae3b29c837615d0c45c9 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/raid10.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 8db56ecbdae5..edb4e85b6845 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4ca40c2ce099e4f1ce35445994f49836662596c8 +refs/heads/master: 56a2559bb654ae2555b2ae3b29c837615d0c45c9 diff --git a/trunk/drivers/md/raid10.c b/trunk/drivers/md/raid10.c index 90e951730a23..011827d0df25 100644 --- a/trunk/drivers/md/raid10.c +++ b/trunk/drivers/md/raid10.c @@ -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;