summaryrefslogtreecommitdiff
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2015-03-11 12:53:25 +0000
committerMark Brown <broonie@kernel.org>2015-03-11 12:53:25 +0000
commit11dd60447e3b1018f9cae66737cb902b519d3454 (patch)
treea33d8bcb18a3becae2161aa215c25d5674626c57 /drivers/md/raid5.c
parent8d0c38a3f2a6bb70e952f127ed817fc7a08db52c (diff)
parent9eccca0843205f87c00404b663188b88eb248051 (diff)
downloadlwn-11dd60447e3b1018f9cae66737cb902b519d3454.tar.gz
lwn-11dd60447e3b1018f9cae66737cb902b519d3454.zip
Merge tag 'v4.0-rc3' into asoc-intel
Linux 4.0-rc3
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r--drivers/md/raid5.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index e75d48c0421a..cd2f96b2c572 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5121,12 +5121,17 @@ static inline sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int
schedule_timeout_uninterruptible(1);
}
/* Need to check if array will still be degraded after recovery/resync
- * We don't need to check the 'failed' flag as when that gets set,
- * recovery aborts.
+ * Note in case of > 1 drive failures it's possible we're rebuilding
+ * one drive while leaving another faulty drive in array.
*/
- for (i = 0; i < conf->raid_disks; i++)
- if (conf->disks[i].rdev == NULL)
+ rcu_read_lock();
+ for (i = 0; i < conf->raid_disks; i++) {
+ struct md_rdev *rdev = ACCESS_ONCE(conf->disks[i].rdev);
+
+ if (rdev == NULL || test_bit(Faulty, &rdev->flags))
still_degraded = 1;
+ }
+ rcu_read_unlock();
bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, still_degraded);