Commit fb73b357 authored by Mariusz Tkaczyk's avatar Mariusz Tkaczyk Committed by Shaohua Li

raid5: block failing device if raid will be failed

Currently there is an inconsistency for failing the member drives
for arrays with different RAID levels. For RAID456 - there is a possibility
to fail all of the devices. However - for other RAID levels - kernel blocks
removing the member drive, if the operation results in array's FAIL state
(EBUSY is returned). For example - removing last drive from RAID1 is not
possible.
This kind of blocker was never implemented for raid456 and we cannot see
the reason why.

We had tested following patch and did not observe any regression, so do you
have any comments/reasons for current approach, or we can send the proper
patch for this?
Signed-off-by: default avatarMariusz Tkaczyk <mariusz.tkaczyk@intel.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent f151f57b
...@@ -2681,6 +2681,18 @@ static void raid5_error(struct mddev *mddev, struct md_rdev *rdev) ...@@ -2681,6 +2681,18 @@ static void raid5_error(struct mddev *mddev, struct md_rdev *rdev)
pr_debug("raid456: error called\n"); pr_debug("raid456: error called\n");
spin_lock_irqsave(&conf->device_lock, flags); spin_lock_irqsave(&conf->device_lock, flags);
if (test_bit(In_sync, &rdev->flags) &&
mddev->degraded == conf->max_degraded) {
/*
* Don't allow to achieve failed state
* Don't try to recover this device
*/
conf->recovery_disabled = mddev->recovery_disabled;
spin_unlock_irqrestore(&conf->device_lock, flags);
return;
}
set_bit(Faulty, &rdev->flags); set_bit(Faulty, &rdev->flags);
clear_bit(In_sync, &rdev->flags); clear_bit(In_sync, &rdev->flags);
mddev->degraded = raid5_calc_degraded(conf); mddev->degraded = raid5_calc_degraded(conf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment