md/raid10: improve code of mrdev in raid10_sync_request
authorLi Nan <linan122@huawei.com>
Sat, 27 May 2023 07:22:16 +0000 (15:22 +0800)
committerSong Liu <song@kernel.org>
Tue, 13 Jun 2023 22:25:42 +0000 (15:25 -0700)
'need_recover' and 'mrdev' are equivalent in raid10_sync_request(), and
inc mrdev->nr_pending is unreasonable if don't need recovery. Replace
'need_recover' with 'mrdev', and only inc nr_pending when needed.

Signed-off-by: Li Nan <linan122@huawei.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230527072218.2365857-3-linan666@huaweicloud.com
drivers/md/raid10.c

index 5155228..8eda799 100644 (file)
@@ -3440,7 +3440,6 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                        sector_t sect;
                        int must_sync;
                        int any_working;
-                       int need_recover = 0;
                        struct raid10_info *mirror = &conf->mirrors[i];
                        struct md_rdev *mrdev, *mreplace;
 
@@ -3448,14 +3447,13 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                        mrdev = rcu_dereference(mirror->rdev);
                        mreplace = rcu_dereference(mirror->replacement);
 
-                       if (mrdev != NULL &&
-                           !test_bit(Faulty, &mrdev->flags) &&
-                           !test_bit(In_sync, &mrdev->flags))
-                               need_recover = 1;
+                       if (mrdev && (test_bit(Faulty, &mrdev->flags) ||
+                           test_bit(In_sync, &mrdev->flags)))
+                               mrdev = NULL;
                        if (mreplace && test_bit(Faulty, &mreplace->flags))
                                mreplace = NULL;
 
-                       if (!need_recover && !mreplace) {
+                       if (!mrdev && !mreplace) {
                                rcu_read_unlock();
                                continue;
                        }
@@ -3489,7 +3487,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                                rcu_read_unlock();
                                continue;
                        }
-                       atomic_inc(&mrdev->nr_pending);
+                       if (mrdev)
+                               atomic_inc(&mrdev->nr_pending);
                        if (mreplace)
                                atomic_inc(&mreplace->nr_pending);
                        rcu_read_unlock();
@@ -3576,7 +3575,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                                r10_bio->devs[1].devnum = i;
                                r10_bio->devs[1].addr = to_addr;
 
-                               if (need_recover) {
+                               if (mrdev) {
                                        bio = r10_bio->devs[1].bio;
                                        bio->bi_next = biolist;
                                        biolist = bio;
@@ -3621,7 +3620,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                                        for (k = 0; k < conf->copies; k++)
                                                if (r10_bio->devs[k].devnum == i)
                                                        break;
-                                       if (!test_bit(In_sync,
+                                       if (mrdev && !test_bit(In_sync,
                                                      &mrdev->flags)
                                            && !rdev_set_badblocks(
                                                    mrdev,
@@ -3647,12 +3646,14 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                                if (rb2)
                                        atomic_dec(&rb2->remaining);
                                r10_bio = rb2;
-                               rdev_dec_pending(mrdev, mddev);
+                               if (mrdev)
+                                       rdev_dec_pending(mrdev, mddev);
                                if (mreplace)
                                        rdev_dec_pending(mreplace, mddev);
                                break;
                        }
-                       rdev_dec_pending(mrdev, mddev);
+                       if (mrdev)
+                               rdev_dec_pending(mrdev, mddev);
                        if (mreplace)
                                rdev_dec_pending(mreplace, mddev);
                        if (r10_bio->devs[0].bio->bi_opf & MD_FAILFAST) {