md/raid1, raid10: don't recheck "Faulty" flag in read-balance.
authorNeilBrown <neilb@suse.com>
Thu, 2 Jun 2016 06:19:52 +0000 (16:19 +1000)
committerShaohua Li <shli@fb.com>
Mon, 13 Jun 2016 18:54:13 +0000 (11:54 -0700)
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>
drivers/md/raid1.c
drivers/md/raid10.c

index 358a08e..f6c3bd4 100644 (file)
@@ -689,13 +689,6 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
                if (!rdev)
                        goto retry;
                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;
 
                if (conf->mirrors[best_disk].next_seq_sect != this_sector)
index 3578d3a..ae4dce1 100644 (file)
@@ -707,7 +707,6 @@ static struct md_rdev *read_balance(struct r10conf *conf,
 
        raid10_find_phys(conf, r10_bio);
        rcu_read_lock();
-retry:
        sectors = r10_bio->sectors;
        best_slot = -1;
        best_rdev = NULL;
@@ -804,13 +803,6 @@ retry:
 
        if (slot >= 0) {
                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;
        } else
                rdev = NULL;