md/raid1, raid10: don't recheck "Faulty" flag in read-balance.
Re-checking the faulty flag here brings no value. The comment about "risk" refers to the risk that the device could be in the process of being removed by ->hot_remove_disk(). However providing that the ->nr_pending count is incremented inside an rcu_read_locked() region, there is no risk of that happening. This is because the rdev pointer (in the personalities array) is set to NULL before synchronize_rcu(), and ->nr_pending is tested afterwards. If the rcu_read_locked region happens before the synchronize_rcu(), the test will see that nr_pending has been incremented. If it happens afterwards, the rdev pointer will be NULL so there is nothing to increment. Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Shaohua Li <shli@fb.com>
This commit is contained in:
Родитель
8430e7e0af
Коммит
414e6b9a70
|
@ -689,13 +689,6 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
|
||||||
if (!rdev)
|
if (!rdev)
|
||||||
goto retry;
|
goto retry;
|
||||||
atomic_inc(&rdev->nr_pending);
|
atomic_inc(&rdev->nr_pending);
|
||||||
if (test_bit(Faulty, &rdev->flags)) {
|
|
||||||
/* cannot risk returning a device that failed
|
|
||||||
* before we inc'ed nr_pending
|
|
||||||
*/
|
|
||||||
rdev_dec_pending(rdev, conf->mddev);
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
sectors = best_good_sectors;
|
sectors = best_good_sectors;
|
||||||
|
|
||||||
if (conf->mirrors[best_disk].next_seq_sect != this_sector)
|
if (conf->mirrors[best_disk].next_seq_sect != this_sector)
|
||||||
|
|
|
@ -707,7 +707,6 @@ static struct md_rdev *read_balance(struct r10conf *conf,
|
||||||
|
|
||||||
raid10_find_phys(conf, r10_bio);
|
raid10_find_phys(conf, r10_bio);
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
retry:
|
|
||||||
sectors = r10_bio->sectors;
|
sectors = r10_bio->sectors;
|
||||||
best_slot = -1;
|
best_slot = -1;
|
||||||
best_rdev = NULL;
|
best_rdev = NULL;
|
||||||
|
@ -804,13 +803,6 @@ retry:
|
||||||
|
|
||||||
if (slot >= 0) {
|
if (slot >= 0) {
|
||||||
atomic_inc(&rdev->nr_pending);
|
atomic_inc(&rdev->nr_pending);
|
||||||
if (test_bit(Faulty, &rdev->flags)) {
|
|
||||||
/* Cannot risk returning a device that failed
|
|
||||||
* before we inc'ed nr_pending
|
|
||||||
*/
|
|
||||||
rdev_dec_pending(rdev, conf->mddev);
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
r10_bio->read_slot = slot;
|
r10_bio->read_slot = slot;
|
||||||
} else
|
} else
|
||||||
rdev = NULL;
|
rdev = NULL;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче