diff options
author | NeilBrown <neilb@suse.de> | 2011-07-27 11:00:36 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-07-27 11:00:36 +1000 |
commit | 5389042ffa36976caa45a79af16081d759001fa7 (patch) | |
tree | eb303de141a50f41ccac438e734b65dbfe25825e /drivers/md/raid1.c | |
parent | a478a069b6adf186373a6648c54fc5f1d3c2f8eb (diff) | |
download | op-kernel-dev-5389042ffa36976caa45a79af16081d759001fa7.zip op-kernel-dev-5389042ffa36976caa45a79af16081d759001fa7.tar.gz |
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/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 1d79a04..44069b3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -956,7 +956,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) * However don't try a recovery from this drive as * it is very likely to fail. */ - mddev->recovery_disabled = 1; + conf->recovery_disabled = mddev->recovery_disabled; return; } if (test_and_clear_bit(In_sync, &rdev->flags)) { @@ -1052,6 +1052,9 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int first = 0; int last = mddev->raid_disks - 1; + if (mddev->recovery_disabled == conf->recovery_disabled) + return -EBUSY; + if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; @@ -1107,7 +1110,7 @@ static int raid1_remove_disk(mddev_t *mddev, int number) * is not possible. */ if (!test_bit(Faulty, &rdev->flags) && - !mddev->recovery_disabled && + mddev->recovery_disabled != conf->recovery_disabled && mddev->degraded < conf->raid_disks) { err = -EBUSY; goto abort; |