Re: [PATCH v2 3/3] md/raid1,raid10: fix bio accounting for split md cloned bios
Xiao Ni <[email protected]>
| Newsgroups | gmane.linux.kernel,gmane.linux.raid |
|---|---|
| Message-ID | <CAF-RUYVrsoNToB-pxCe0VeOwmWVk+3qE_35PjA_GA-_AsSf6wA@mail.gmail.com> |
On Fri, May 1, 2026 at 7:48 PM Abd-Alrhman Masalkhi <[email protected]> wrote: > > Use md_cloned_bio() to control bio accounting instead of relying > on r1bio_existed in raid1 or the io_accounting flag in raid10. > > The previous logic does not reliably reflect whether a bio is an > md cloned bio. When a failed bio is split and resubmitted via > bio_submit_split_bioset() on the error path, this can lead to either > double accounting for md cloned bios, or missing accounting for bios > returned from bio_submit_split_bioset() > > Fix this by using md_cloned_bio() to detect md cloned bios and > skip accounting accordingly. > > Fixes: bb2a9acefaf9 ("md/raid1: switch to use md_account_bio() for io accounting") > Fixes: 820455238366 ("md/raid10: switch to use md_account_bio() for io accounting") > Signed-off-by: Abd-Alrhman Masalkhi <[email protected]> > --- > This patch depends on patch 1. > > Changes in v2: > - New patch. > --- > drivers/md/raid1.c | 2 +- > drivers/md/raid10.c | 8 ++++---- > 2 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index c52ecd38c163..dfaf34141325 100644 > --- a/drivers/md/raid1.c > +++ b/drivers/md/raid1.c > @@ -1396,7 +1396,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio, > } > > r1_bio->read_disk = rdisk; > - if (!r1bio_existed) { > + if (likely(!md_cloned_bio(mddev, bio))) { > md_account_bio(mddev, &bio); > r1_bio->master_bio = bio; > } > diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c > index 8c6fc398260e..93af7bbc9005 100644 > --- a/drivers/md/raid10.c > +++ b/drivers/md/raid10.c > @@ -1146,7 +1146,7 @@ static bool regular_request_wait(struct mddev *mddev, struct r10conf *conf, > } > > static void raid10_read_request(struct mddev *mddev, struct bio *bio, > - struct r10bio *r10_bio, bool io_accounting) > + struct r10bio *r10_bio) > { > struct r10conf *conf = mddev->private; > struct bio *read_bio; > @@ -1226,7 +1226,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio, > } > slot = r10_bio->read_slot; > > - if (io_accounting) { > + if (likely(!md_cloned_bio(mddev, bio))) { > md_account_bio(mddev, &bio); > r10_bio->master_bio = bio; > } > @@ -1552,7 +1552,7 @@ static void __make_request(struct mddev *mddev, struct bio *bio, int sectors) > conf->geo.raid_disks); > > if (bio_data_dir(bio) == READ) > - raid10_read_request(mddev, bio, r10_bio, true); > + raid10_read_request(mddev, bio, r10_bio); > else > raid10_write_request(mddev, bio, r10_bio); > } > @@ -2872,7 +2872,7 @@ static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) > > rdev_dec_pending(rdev, mddev); > r10_bio->state = 0; > - raid10_read_request(mddev, r10_bio->master_bio, r10_bio, false); > + raid10_read_request(mddev, r10_bio->master_bio, r10_bio); > /* > * allow_barrier after re-submit to ensure no sync io > * can be issued while regular io pending. > -- > 2.43.0 > > This patch looks good to me. Reviewed-by: Xiao Ni <[email protected]>