]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iomap: simplify iomap_dio_bio_iter
authorChristoph Hellwig <hch@lst.de>
Mon, 26 Jan 2026 05:53:39 +0000 (06:53 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Jan 2026 12:16:39 +0000 (05:16 -0700)
Use iov_iter_count to check if we need to continue as that just reads
a field in the iov_iter, and only use bio_iov_vecs_to_alloc to calculate
the actual number of vectors to allocate for the bio.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Tested-by: Anuj Gupta <anuj20.g@samsung.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/iomap/direct-io.c

index 867c0ac6df8fad61b567e985df64acee02f15624..de03bc7cf4ed0b46df5ed3f11a3ac02a6690f29e 100644 (file)
@@ -312,7 +312,7 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
        blk_opf_t bio_opf = REQ_SYNC | REQ_IDLE;
        struct bio *bio;
        bool need_zeroout = false;
-       int nr_pages, ret = 0;
+       int ret = 0;
        u64 copied = 0;
        size_t orig_count;
        unsigned int alignment;
@@ -440,7 +440,6 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
                        goto out;
        }
 
-       nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter, BIO_MAX_VECS);
        do {
                size_t n;
 
@@ -453,7 +452,9 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
                        goto out;
                }
 
-               bio = iomap_dio_alloc_bio(iter, dio, nr_pages, bio_opf);
+               bio = iomap_dio_alloc_bio(iter, dio,
+                               bio_iov_vecs_to_alloc(dio->submit.iter,
+                                               BIO_MAX_VECS), bio_opf);
                fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits,
                                          GFP_KERNEL);
                bio->bi_iter.bi_sector = iomap_sector(iomap, pos);
@@ -495,16 +496,14 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
                dio->size += n;
                copied += n;
 
-               nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter,
-                                                BIO_MAX_VECS);
                /*
                 * We can only poll for single bio I/Os.
                 */
-               if (nr_pages)
+               if (iov_iter_count(dio->submit.iter))
                        dio->iocb->ki_flags &= ~IOCB_HIPRI;
                iomap_dio_submit_bio(iter, dio, bio, pos);
                pos += n;
-       } while (nr_pages);
+       } while (iov_iter_count(dio->submit.iter));
 
        /*
         * We need to zeroout the tail of a sub-block write if the extent type