]> git.baikalelectronics.ru Git - kernel.git/commitdiff
block: move the call to get_max_io_size out of blk_bio_segment_split
authorChristoph Hellwig <hch@lst.de>
Wed, 27 Jul 2022 16:22:58 +0000 (12:22 -0400)
committerJens Axboe <axboe@kernel.dk>
Wed, 3 Aug 2022 03:08:53 +0000 (21:08 -0600)
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: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20220727162300.3089193-5-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-merge.c

index 30872a353764883e4e4435289a016e46f7206d27..ce73b3b6c2a71962406d796528901c6bef9fa6a9 100644 (file)
@@ -250,11 +250,12 @@ static bool bvec_split_segs(const struct request_queue *q,
  * @q:    [in] request queue pointer
  * @segs: [out] number of segments in the bio with the first half of the sectors
  * @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
  * of @bio and update @bio->bi_iter to represent the remaining sectors. The
  * 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.
  *
  * 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,
  * split bio has finished.
  */
 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 bvec_iter iter;
        unsigned nsegs = 0, bytes = 0;
-       const unsigned max_bytes = get_max_io_size(bio, q) << 9;
        const unsigned max_segs = queue_max_segments(q);
 
        bio_for_each_bvec(bv, bio, iter) {
@@ -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);
                break;
        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;
        }