]> git.hungrycats.org Git - linux/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 17 Nov 2024 14:07:21 +0000 (15:07 +0100)
commit 59f8f0b54c8ffb4521f6bbd1cb6f4dfa5022e75e upstream.

'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
Cc: Hagar Gamal Halim <hagarhem@amazon.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/raid10.c

index 009f7ffe4e10c7f325b97502ce79a1fcc806ec6a..f608f30c7d6a614d8cd265e455e6ef6c130fd1b1 100644 (file)
@@ -3432,7 +3432,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;
 
@@ -3440,14 +3439,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;
                        }
@@ -3481,7 +3479,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();
@@ -3568,7 +3567,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;
@@ -3613,7 +3612,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,
@@ -3639,12 +3638,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) {