aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/raid5.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index d26767246d26..95fcbbf3d6c9 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5465,10 +5465,9 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
5465 if (rdev->saved_raid_disk >= 0 && 5465 if (rdev->saved_raid_disk >= 0 &&
5466 rdev->saved_raid_disk >= first && 5466 rdev->saved_raid_disk >= first &&
5467 conf->disks[rdev->saved_raid_disk].rdev == NULL) 5467 conf->disks[rdev->saved_raid_disk].rdev == NULL)
5468 disk = rdev->saved_raid_disk; 5468 first = rdev->saved_raid_disk;
5469 else 5469
5470 disk = first; 5470 for (disk = first; disk <= last; disk++) {
5471 for ( ; disk <= last ; disk++) {
5472 p = conf->disks + disk; 5471 p = conf->disks + disk;
5473 if (p->rdev == NULL) { 5472 if (p->rdev == NULL) {
5474 clear_bit(In_sync, &rdev->flags); 5473 clear_bit(In_sync, &rdev->flags);
@@ -5477,8 +5476,11 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
5477 if (rdev->saved_raid_disk != disk) 5476 if (rdev->saved_raid_disk != disk)
5478 conf->fullsync = 1; 5477 conf->fullsync = 1;
5479 rcu_assign_pointer(p->rdev, rdev); 5478 rcu_assign_pointer(p->rdev, rdev);
5480 break; 5479 goto out;
5481 } 5480 }
5481 }
5482 for (disk = first; disk <= last; disk++) {
5483 p = conf->disks + disk;
5482 if (test_bit(WantReplacement, &p->rdev->flags) && 5484 if (test_bit(WantReplacement, &p->rdev->flags) &&
5483 p->replacement == NULL) { 5485 p->replacement == NULL) {
5484 clear_bit(In_sync, &rdev->flags); 5486 clear_bit(In_sync, &rdev->flags);
@@ -5490,6 +5492,7 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
5490 break; 5492 break;
5491 } 5493 }
5492 } 5494 }
5495out:
5493 print_raid5_conf(conf); 5496 print_raid5_conf(conf);
5494 return err; 5497 return err;
5495} 5498}