diff options
| author | Yu Kuai <yukuai3@huawei.com> | 2025-09-10 14:30:47 +0800 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-09-10 05:23:45 -0600 |
| commit | 5b38ee5a4a12cfdefd848f7ec09da3e9007ad55f (patch) | |
| tree | bd53e0758a3fc402e78958d0f89c8cf44a5fc0f4 /drivers/md | |
| parent | block: factor out a helper bio_submit_split_bioset() (diff) | |
| download | linux-5b38ee5a4a12cfdefd848f7ec09da3e9007ad55f.tar.gz linux-5b38ee5a4a12cfdefd848f7ec09da3e9007ad55f.zip | |
md/raid0: convert raid0_handle_discard() to use bio_submit_split_bioset()
Unify bio split code, and prepare to fix ordering of split IO
Noted commit 319ff40a5427 ("md/raid0: Fix performance regression for large
sequential writes") already fix ordering of split IO by remapping bio to
underlying disks before resubmitting it, with the respect
md_submit_bio() already split it by sectors, and raid0_make_request()
will split at most once for unaligned IO. This is a bit hacky and we'll
convert this to solution in general later.
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/md')
| -rw-r--r-- | drivers/md/raid0.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 1ba7d0c090f7..ca08ec2e1f27 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -463,23 +463,16 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) zone = find_zone(conf, &start); if (bio_end_sector(bio) > zone->zone_end) { - struct bio *split = bio_split(bio, - zone->zone_end - bio->bi_iter.bi_sector, GFP_NOIO, - &mddev->bio_set); - - if (IS_ERR(split)) { - bio->bi_status = errno_to_blk_status(PTR_ERR(split)); - bio_endio(bio); + bio = bio_submit_split_bioset(bio, + zone->zone_end - bio->bi_iter.bi_sector, + &mddev->bio_set); + if (!bio) return; - } - bio_chain(split, bio); - trace_block_split(split, bio->bi_iter.bi_sector); - submit_bio_noacct(bio); - bio = split; end = zone->zone_end; - } else + } else { end = bio_end_sector(bio); + } orig_end = end; if (zone != conf->strip_zone) |
