diff options
author | Eric Mei <eric.mei@seagate.com> | 2015-01-06 12:35:02 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2015-02-24 19:38:26 -0500 |
commit | 16d9cfab930bb6f4946cff8ba7429701fd15b414 (patch) | |
tree | a1a31cbe4685b2d49eebd883a402cb0727685391 /drivers/md | |
parent | d1901ef099c38afd11add4cfb3312c02ef21ec4a (diff) |
raid5: check faulty flag for array status during recovery.
When we have more than 1 drive failure, it's possible we start
rebuild one drive while leaving another faulty drive in array.
To determine whether array will be optimal after building, current
code only check whether a drive is missing, which could potentially
lead to data corruption. This patch is to add checking Faulty flag.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5.c | 13 |
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 | |||
5121 | schedule_timeout_uninterruptible(1); | 5121 | schedule_timeout_uninterruptible(1); |
5122 | } | 5122 | } |
5123 | /* Need to check if array will still be degraded after recovery/resync | 5123 | /* Need to check if array will still be degraded after recovery/resync |
5124 | * We don't need to check the 'failed' flag as when that gets set, | 5124 | * Note in case of > 1 drive failures it's possible we're rebuilding |
5125 | * recovery aborts. | 5125 | * one drive while leaving another faulty drive in array. |
5126 | */ | 5126 | */ |
5127 | for (i = 0; i < conf->raid_disks; i++) | 5127 | rcu_read_lock(); |
5128 | if (conf->disks[i].rdev == NULL) | 5128 | for (i = 0; i < conf->raid_disks; i++) { |
5129 | struct md_rdev *rdev = ACCESS_ONCE(conf->disks[i].rdev); | ||
5130 | |||
5131 | if (rdev == NULL || test_bit(Faulty, &rdev->flags)) | ||
5129 | still_degraded = 1; | 5132 | still_degraded = 1; |
5133 | } | ||
5134 | rcu_read_unlock(); | ||
5130 | 5135 | ||
5131 | bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, still_degraded); | 5136 | bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, still_degraded); |
5132 | 5137 | ||