diff options
| -rw-r--r-- | drivers/md/md.c | 30 | ||||
| -rw-r--r-- | drivers/md/raid5.c | 16 |
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 | } |
