]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: don't initialize bi_vcnt for cloned bio in bio_iov_bvec_set()
authorMing Lei <ming.lei@redhat.com>
Wed, 31 Dec 2025 03:00:56 +0000 (11:00 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 7 Jan 2026 15:06:33 +0000 (08:06 -0700)
bio_iov_bvec_set() creates a cloned bio that borrows a bvec array from
an iov_iter. For cloned bios, bi_vcnt is meaningless because iteration
is controlled entirely by bi_iter (bi_idx, bi_size, bi_bvec_done), not
by bi_vcnt. Remove the incorrect bi_vcnt assignment.

Explicitly initialize bi_iter.bi_idx to 0 to ensure iteration starts
at the first bvec. While bi_idx is typically already zero from bio
initialization, making this explicit improves clarity and correctness.

This change also avoids accessing iter->nr_segs, which is an iov_iter
implementation detail that block code should not depend on.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c

index 0e936288034e3db13272501a5aed48a2746199b4..2359c0723b88eb21c362a4ef44b4b5954856c8d8 100644 (file)
@@ -1165,8 +1165,8 @@ void bio_iov_bvec_set(struct bio *bio, const struct iov_iter *iter)
 {
        WARN_ON_ONCE(bio->bi_max_vecs);
 
-       bio->bi_vcnt = iter->nr_segs;
        bio->bi_io_vec = (struct bio_vec *)iter->bvec;
+       bio->bi_iter.bi_idx = 0;
        bio->bi_iter.bi_bvec_done = iter->iov_offset;
        bio->bi_iter.bi_size = iov_iter_count(iter);
        bio_set_flag(bio, BIO_CLONED);