aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-07-26 21:00:36 -0400
committerNeilBrown <neilb@suse.de>2011-07-26 21:00:36 -0400
commit5389042ffa36976caa45a79af16081d759001fa7 (patch)
treeeb303de141a50f41ccac438e734b65dbfe25825e /drivers/md/md.c
parenta478a069b6adf186373a6648c54fc5f1d3c2f8eb (diff)
md: change managed of recovery_disabled.
If we hit a read error while recovering a mirror, we want to abort the recovery without necessarily failing the disk - as having a disk this a read error is better than not having an array at all. Currently this is managed with a per-array flag "recovery_disabled" and is only implemented for RAID1. For RAID10 we will need finer grained control as we might want to disable recovery for individual devices separately. So push more of the decision making into the personality. 'recovery_disabled' is now a 'cookie' which is copied when the personality want to disable recovery and is changed when a device is added to the array as this is used as a trigger to 'try recovery again'. This will allow RAID10 to get the control that it needs. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 77bd8d8708e4..c7d9c6af4634 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1922,7 +1922,7 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
1922 bd_link_disk_holder(rdev->bdev, mddev->gendisk); 1922 bd_link_disk_holder(rdev->bdev, mddev->gendisk);
1923 1923
1924 /* May as well allow recovery to be retried once */ 1924 /* May as well allow recovery to be retried once */
1925 mddev->recovery_disabled = 0; 1925 mddev->recovery_disabled++;
1926 1926
1927 return 0; 1927 return 0;
1928 1928
@@ -7070,7 +7070,7 @@ static int remove_and_add_spares(mddev_t *mddev)
7070 } 7070 }
7071 } 7071 }
7072 7072
7073 if (mddev->degraded && !mddev->recovery_disabled) { 7073 if (mddev->degraded) {
7074 list_for_each_entry(rdev, &mddev->disks, same_set) { 7074 list_for_each_entry(rdev, &mddev->disks, same_set) {
7075 if (rdev->raid_disk >= 0 && 7075 if (rdev->raid_disk >= 0 &&
7076 !test_bit(In_sync, &rdev->flags) && 7076 !test_bit(In_sync, &rdev->flags) &&