]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/md/raid5.c
Merge tag 'v4.20-rc3' into for-4.21/block
[linux.git] / drivers / md / raid5.c
index e4e98f47865def0449979058c6c7e51228b9b42b..4990f0319f6cf729165a2c55a73aaf7e9bf3f567 100644 (file)
@@ -2681,6 +2681,18 @@ static void raid5_error(struct mddev *mddev, struct md_rdev *rdev)
        pr_debug("raid456: error called\n");
 
        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);
        clear_bit(In_sync, &rdev->flags);
        mddev->degraded = raid5_calc_degraded(conf);