Skip to content

Commit 9478355

Browse files
Li Nangregkh
authored andcommitted
md/raid10: improve code of mrdev in raid10_sync_request
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 <[email protected]> Reviewed-by: Yu Kuai <[email protected]> Signed-off-by: Song Liu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Cc: Hagar Gamal Halim <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent d4b003f commit 9478355

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

drivers/md/raid10.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3432,22 +3432,20 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
34323432
sector_t sect;
34333433
int must_sync;
34343434
int any_working;
3435-
int need_recover = 0;
34363435
struct raid10_info *mirror = &conf->mirrors[i];
34373436
struct md_rdev *mrdev, *mreplace;
34383437

34393438
rcu_read_lock();
34403439
mrdev = rcu_dereference(mirror->rdev);
34413440
mreplace = rcu_dereference(mirror->replacement);
34423441

3443-
if (mrdev != NULL &&
3444-
!test_bit(Faulty, &mrdev->flags) &&
3445-
!test_bit(In_sync, &mrdev->flags))
3446-
need_recover = 1;
3442+
if (mrdev && (test_bit(Faulty, &mrdev->flags) ||
3443+
test_bit(In_sync, &mrdev->flags)))
3444+
mrdev = NULL;
34473445
if (mreplace && test_bit(Faulty, &mreplace->flags))
34483446
mreplace = NULL;
34493447

3450-
if (!need_recover && !mreplace) {
3448+
if (!mrdev && !mreplace) {
34513449
rcu_read_unlock();
34523450
continue;
34533451
}
@@ -3481,7 +3479,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
34813479
rcu_read_unlock();
34823480
continue;
34833481
}
3484-
atomic_inc(&mrdev->nr_pending);
3482+
if (mrdev)
3483+
atomic_inc(&mrdev->nr_pending);
34853484
if (mreplace)
34863485
atomic_inc(&mreplace->nr_pending);
34873486
rcu_read_unlock();
@@ -3568,7 +3567,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
35683567
r10_bio->devs[1].devnum = i;
35693568
r10_bio->devs[1].addr = to_addr;
35703569

3571-
if (need_recover) {
3570+
if (mrdev) {
35723571
bio = r10_bio->devs[1].bio;
35733572
bio->bi_next = biolist;
35743573
biolist = bio;
@@ -3613,7 +3612,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
36133612
for (k = 0; k < conf->copies; k++)
36143613
if (r10_bio->devs[k].devnum == i)
36153614
break;
3616-
if (!test_bit(In_sync,
3615+
if (mrdev && !test_bit(In_sync,
36173616
&mrdev->flags)
36183617
&& !rdev_set_badblocks(
36193618
mrdev,
@@ -3639,12 +3638,14 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
36393638
if (rb2)
36403639
atomic_dec(&rb2->remaining);
36413640
r10_bio = rb2;
3642-
rdev_dec_pending(mrdev, mddev);
3641+
if (mrdev)
3642+
rdev_dec_pending(mrdev, mddev);
36433643
if (mreplace)
36443644
rdev_dec_pending(mreplace, mddev);
36453645
break;
36463646
}
3647-
rdev_dec_pending(mrdev, mddev);
3647+
if (mrdev)
3648+
rdev_dec_pending(mrdev, mddev);
36483649
if (mreplace)
36493650
rdev_dec_pending(mreplace, mddev);
36503651
if (r10_bio->devs[0].bio->bi_opf & MD_FAILFAST) {

0 commit comments

Comments
 (0)