From 64cdb724ea2f65fb9327d430cab82cd51e751cc9 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 23 Dec 2011 10:17:57 +1100 Subject: [PATCH] --- yaml --- r: 280525 b: refs/heads/master c: 7ef449d1ec3668acbba6af6a500d0c84636b436f h: refs/heads/master i: 280523: ce2760ff31f607d73072c5d6496dd49348c6b552 v: v3 --- [refs] | 2 +- trunk/drivers/md/raid1.c | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 0eaf46bd8630..1c4d6e5cfca0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c19d57980b38a5bb613a898937a1cf85f422fb9b +refs/heads/master: 7ef449d1ec3668acbba6af6a500d0c84636b436f diff --git a/trunk/drivers/md/raid1.c b/trunk/drivers/md/raid1.c index 6df0c41578af..e3cfca7cde16 100644 --- a/trunk/drivers/md/raid1.c +++ b/trunk/drivers/md/raid1.c @@ -1315,8 +1315,9 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; - for (mirror = first; mirror <= last; mirror++) - if ( !(p=conf->mirrors+mirror)->rdev) { + for (mirror = first; mirror <= last; mirror++) { + p = conf->mirrors+mirror; + if (!p->rdev) { disk_stack_limits(mddev->gendisk, rdev->bdev, rdev->data_offset << 9); @@ -1343,6 +1344,18 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) rcu_assign_pointer(p->rdev, rdev); break; } + if (test_bit(WantReplacement, &p->rdev->flags) && + p[conf->raid_disks].rdev == NULL) { + /* Add this device as a replacement */ + clear_bit(In_sync, &rdev->flags); + set_bit(Replacement, &rdev->flags); + rdev->raid_disk = mirror; + err = 0; + conf->fullsync = 1; + rcu_assign_pointer(p[conf->raid_disks].rdev, rdev); + break; + } + } md_integrity_add_rdev(rdev, mddev); print_conf(conf); return err;