aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/md.c30
-rw-r--r--drivers/md/raid5.c16
2 files changed, 28 insertions, 18 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index be569eb41a93..1c1c562f63dc 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7399,23 +7399,21 @@ static int remove_and_add_spares(struct mddev *mddev)
7399 } 7399 }
7400 } 7400 }
7401 7401
7402 if (mddev->degraded) { 7402 list_for_each_entry(rdev, &mddev->disks, same_set) {
7403 list_for_each_entry(rdev, &mddev->disks, same_set) { 7403 if (rdev->raid_disk >= 0 &&
7404 if (rdev->raid_disk >= 0 && 7404 !test_bit(In_sync, &rdev->flags) &&
7405 !test_bit(In_sync, &rdev->flags) && 7405 !test_bit(Faulty, &rdev->flags))
7406 !test_bit(Faulty, &rdev->flags)) 7406 spares++;
7407 if (rdev->raid_disk < 0
7408 && !test_bit(Faulty, &rdev->flags)) {
7409 rdev->recovery_offset = 0;
7410 if (mddev->pers->
7411 hot_add_disk(mddev, rdev) == 0) {
7412 if (sysfs_link_rdev(mddev, rdev))
7413 /* failure here is OK */;
7407 spares++; 7414 spares++;
7408 if (rdev->raid_disk < 0 7415 md_new_event(mddev);
7409 && !test_bit(Faulty, &rdev->flags)) { 7416 set_bit(MD_CHANGE_DEVS, &mddev->flags);
7410 rdev->recovery_offset = 0;
7411 if (mddev->pers->
7412 hot_add_disk(mddev, rdev) == 0) {
7413 if (sysfs_link_rdev(mddev, rdev))
7414 /* failure here is OK */;
7415 spares++;
7416 md_new_event(mddev);
7417 set_bit(MD_CHANGE_DEVS, &mddev->flags);
7418 }
7419 } 7417 }
7420 } 7418 }
7421 } 7419 }
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index c80f8c2471cc..b2c83859f75b 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5376,8 +5376,9 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
5376 disk = rdev->saved_raid_disk; 5376 disk = rdev->saved_raid_disk;
5377 else 5377 else
5378 disk = first; 5378 disk = first;
5379 for ( ; disk <= last ; disk++) 5379 for ( ; disk <= last ; disk++) {
5380 if ((p=conf->disks + disk)->rdev == NULL) { 5380 p = conf->disks + disk;
5381 if (p->rdev == NULL) {
5381 clear_bit(In_sync, &rdev->flags); 5382 clear_bit(In_sync, &rdev->flags);
5382 rdev->raid_disk = disk; 5383 rdev->raid_disk = disk;
5383 err = 0; 5384 err = 0;
@@ -5386,6 +5387,17 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
5386 rcu_assign_pointer(p->rdev, rdev); 5387 rcu_assign_pointer(p->rdev, rdev);
5387 break; 5388 break;
5388 } 5389 }
5390 if (test_bit(WantReplacement, &p->rdev->flags) &&
5391 p->replacement == NULL) {
5392 clear_bit(In_sync, &rdev->flags);
5393 set_bit(Replacement, &rdev->flags);
5394 rdev->raid_disk = disk;
5395 err = 0;
5396 conf->fullsync = 1;
5397 rcu_assign_pointer(p->replacement, rdev);
5398 break;
5399 }
5400 }
5389 print_raid5_conf(conf); 5401 print_raid5_conf(conf);
5390 return err; 5402 return err;
5391} 5403}