Commit a85b3637 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

block: move the call to get_max_io_size out of blk_bio_segment_split

Prepare for reusing blk_bio_segment_split for (file system controlled)
splits of REQ_OP_ZONE_APPEND bios by letting the caller control the
maximum size of the bio.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20220727162300.3089193-5-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 46754bd0
...@@ -250,11 +250,12 @@ static bool bvec_split_segs(const struct request_queue *q, ...@@ -250,11 +250,12 @@ static bool bvec_split_segs(const struct request_queue *q,
* @q: [in] request queue pointer * @q: [in] request queue pointer
* @segs: [out] number of segments in the bio with the first half of the sectors * @segs: [out] number of segments in the bio with the first half of the sectors
* @bs: [in] bio set to allocate the clone from * @bs: [in] bio set to allocate the clone from
* @max_bytes: [in] maximum number of bytes per bio
* *
* Clone @bio, update the bi_iter of the clone to represent the first sectors * Clone @bio, update the bi_iter of the clone to represent the first sectors
* of @bio and update @bio->bi_iter to represent the remaining sectors. The * of @bio and update @bio->bi_iter to represent the remaining sectors. The
* following is guaranteed for the cloned bio: * following is guaranteed for the cloned bio:
* - That it has at most get_max_io_size(@bio, @q) sectors. * - That it has at most @max_bytes worth of data
* - That it has at most queue_max_segments(@q) segments. * - That it has at most queue_max_segments(@q) segments.
* *
* Except for discard requests the cloned bio will point at the bi_io_vec of * Except for discard requests the cloned bio will point at the bi_io_vec of
...@@ -264,12 +265,11 @@ static bool bvec_split_segs(const struct request_queue *q, ...@@ -264,12 +265,11 @@ static bool bvec_split_segs(const struct request_queue *q,
* split bio has finished. * split bio has finished.
*/ */
static struct bio *bio_split_rw(struct bio *bio, struct request_queue *q, static struct bio *bio_split_rw(struct bio *bio, struct request_queue *q,
unsigned *segs, struct bio_set *bs) unsigned *segs, struct bio_set *bs, unsigned max_bytes)
{ {
struct bio_vec bv, bvprv, *bvprvp = NULL; struct bio_vec bv, bvprv, *bvprvp = NULL;
struct bvec_iter iter; struct bvec_iter iter;
unsigned nsegs = 0, bytes = 0; unsigned nsegs = 0, bytes = 0;
const unsigned max_bytes = get_max_io_size(bio, q) << 9;
const unsigned max_segs = queue_max_segments(q); const unsigned max_segs = queue_max_segments(q);
bio_for_each_bvec(bv, bio, iter) { bio_for_each_bvec(bv, bio, iter) {
...@@ -343,7 +343,8 @@ struct bio *__bio_split_to_limits(struct bio *bio, struct request_queue *q, ...@@ -343,7 +343,8 @@ struct bio *__bio_split_to_limits(struct bio *bio, struct request_queue *q,
split = bio_split_write_zeroes(bio, q, nr_segs, bs); split = bio_split_write_zeroes(bio, q, nr_segs, bs);
break; break;
default: default:
split = bio_split_rw(bio, q, nr_segs, bs); split = bio_split_rw(bio, q, nr_segs, bs,
get_max_io_size(bio, q) << SECTOR_SHIFT);
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment