Re: [PATCH v2 3/3] md/raid1,raid10: fix bio accounting for split md cloned bios

"Yu Kuai" <[email protected]>
Newsgroups gmane.linux.raid,gmane.linux.kernel
Message-ID <[email protected]>
Hi,

在 2026/5/1 19:46, Abd-Alrhman Masalkhi 写道:
> 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")

The same as patch 2, I don't think this patch fix any problem. And I
think current IO accounting is correct.

> 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.

-- 
Thansk,
Kuai
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.