|
@@ -7027,7 +7027,7 @@ static int remove_and_add_spares(mddev_t *mddev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (mddev->degraded && ! mddev->ro && !mddev->recovery_disabled) {
|
|
|
+ if (mddev->degraded && !mddev->recovery_disabled) {
|
|
|
list_for_each_entry(rdev, &mddev->disks, same_set) {
|
|
|
if (rdev->raid_disk >= 0 &&
|
|
|
!test_bit(In_sync, &rdev->flags) &&
|
|
@@ -7150,7 +7150,20 @@ void md_check_recovery(mddev_t *mddev)
|
|
|
/* Only thing we do on a ro array is remove
|
|
|
* failed devices.
|
|
|
*/
|
|
|
- remove_and_add_spares(mddev);
|
|
|
+ mdk_rdev_t *rdev;
|
|
|
+ list_for_each_entry(rdev, &mddev->disks, same_set)
|
|
|
+ if (rdev->raid_disk >= 0 &&
|
|
|
+ !test_bit(Blocked, &rdev->flags) &&
|
|
|
+ test_bit(Faulty, &rdev->flags) &&
|
|
|
+ atomic_read(&rdev->nr_pending)==0) {
|
|
|
+ if (mddev->pers->hot_remove_disk(
|
|
|
+ mddev, rdev->raid_disk)==0) {
|
|
|
+ char nm[20];
|
|
|
+ sprintf(nm,"rd%d", rdev->raid_disk);
|
|
|
+ sysfs_remove_link(&mddev->kobj, nm);
|
|
|
+ rdev->raid_disk = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
|
|
|
goto unlock;
|
|
|
}
|