|
@@ -1597,6 +1597,19 @@ void md_update_sb(mddev_t * mddev)
|
|
|
|
|
|
repeat:
|
|
|
spin_lock_irq(&mddev->write_lock);
|
|
|
+
|
|
|
+ if (mddev->degraded && mddev->sb_dirty == 3)
|
|
|
+ /* If the array is degraded, then skipping spares is both
|
|
|
+ * dangerous and fairly pointless.
|
|
|
+ * Dangerous because a device that was removed from the array
|
|
|
+ * might have a event_count that still looks up-to-date,
|
|
|
+ * so it can be re-added without a resync.
|
|
|
+ * Pointless because if there are any spares to skip,
|
|
|
+ * then a recovery will happen and soon that array won't
|
|
|
+ * be degraded any more and the spare can go back to sleep then.
|
|
|
+ */
|
|
|
+ mddev->sb_dirty = 1;
|
|
|
+
|
|
|
sync_req = mddev->in_sync;
|
|
|
mddev->utime = get_seconds();
|
|
|
if (mddev->sb_dirty == 3)
|