All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@kernel.dk>,
	Christian Brauner <brauner@kernel.org>,
	"Darrick J. Wong" <djwong@kernel.org>,
	Carlos Maiolino <cem@kernel.org>
Cc: Tal Zussman <tz2294@columbia.edu>,
	Anuj Gupta <anuj20.g@samsung.com>,
	linux-block@vger.kernel.org, linux-xfs@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH 01/17] block: pass a maxlen argument to bio_iov_iter_get_pages
Date: Mon, 31 Aug 2026 09:39:49 +0300	[thread overview]
Message-ID: <20260831064010.2574896-2-hch@lst.de> (raw)
In-Reply-To: <20260831064010.2574896-1-hch@lst.de>

Writes that require additional per-I/O allocations such as when using
file system level protection information can be limited to a maximum
size.  Allow passing that to bio_iov_iter_get_pages.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c          |  8 ++++++--
 block/blk-map.c      |  2 +-
 block/fops.c         |  3 ++-
 fs/iomap/direct-io.c | 10 +++++-----
 include/linux/bio.h  |  3 ++-
 5 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 898b2f5ef8c8..efd9483b8348 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1261,6 +1261,7 @@ static inline bool bio_iov_bvec_aligned(const struct bio *bio,
  * bio_iov_iter_get_pages - add user or kernel pages to a bio
  * @bio: bio to add pages to
  * @iter: iov iterator describing the region to be added
+ * @maxlen: maximum size to consume from @iter
  * @mem_align_mask: the mask the source address and length must be aligned to,
  *	0 for no requirement
  * @len_align_mask: the mask to align the total size to, 0 for any length
@@ -1281,7 +1282,8 @@ static inline bool bio_iov_bvec_aligned(const struct bio *bio,
  * is returned only if 0 pages could be pinned.
  */
 int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter,
-			   unsigned mem_align_mask, unsigned len_align_mask)
+			   unsigned maxlen, unsigned mem_align_mask,
+			   unsigned len_align_mask)
 {
 	iov_iter_extraction_t flags = 0;
 
@@ -1293,6 +1295,8 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter,
 		    !bio_iov_bvec_aligned(bio, mem_align_mask))
 			return -EINVAL;
 
+		/* Truncate to the maximum size that the caller can handle */
+		bio->bi_iter.bi_size = min(bio->bi_iter.bi_size, maxlen);
 		iov_iter_advance(iter, bio->bi_iter.bi_size);
 		return 0;
 	}
@@ -1306,7 +1310,7 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter,
 		ssize_t ret;
 
 		ret = iov_iter_extract_bvecs(iter, bio->bi_io_vec,
-				BIO_MAX_SIZE - bio->bi_iter.bi_size,
+				maxlen - bio->bi_iter.bi_size,
 				&bio->bi_vcnt, bio->bi_max_vecs,
 				mem_align_mask, flags);
 		if (ret <= 0) {
diff --git a/block/blk-map.c b/block/blk-map.c
index 9cb9605d1f62..81cba3af4e9c 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -274,7 +274,7 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
 	 * No alignment requirements on our part to support arbitrary
 	 * passthrough commands.
 	 */
-	ret = bio_iov_iter_get_pages(bio, iter, 0, 0);
+	ret = bio_iov_iter_get_pages(bio, iter, BIO_MAX_SIZE, 0, 0);
 	if (ret)
 		goto out_put;
 	ret = blk_rq_append_bio(rq, bio);
diff --git a/block/fops.c b/block/fops.c
index 2ce7c6c4714e..a83df69b175a 100644
--- a/block/fops.c
+++ b/block/fops.c
@@ -46,7 +46,8 @@ static bool blkdev_dio_invalid(struct block_device *bdev, struct kiocb *iocb,
 static inline int blkdev_iov_iter_get_pages(struct bio *bio,
 		struct iov_iter *iter, struct block_device *bdev)
 {
-	return bio_iov_iter_get_pages(bio, iter, bdev_dma_alignment(bdev),
+	return bio_iov_iter_get_pages(bio, iter, BIO_MAX_SIZE,
+			bdev_dma_alignment(bdev),
 			bdev_logical_block_size(bdev) - 1);
 }
 
diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
index 8b4039d16ce8..bc726d47b7dc 100644
--- a/fs/iomap/direct-io.c
+++ b/fs/iomap/direct-io.c
@@ -359,8 +359,8 @@ static ssize_t iomap_dio_bio_iter_one(struct iomap_iter *iter,
 				iomap_max_bio_size(&iter->iomap), alignment);
 	else
 		ret = bio_iov_iter_get_pages(bio, dio->submit.iter,
-					     bdev_dma_alignment(bio->bi_bdev),
-					     alignment - 1);
+				BIO_MAX_SIZE, bdev_dma_alignment(bio->bi_bdev),
+				alignment - 1);
 	if (unlikely(ret))
 		goto out_put_bio;
 	ret = bio->bi_iter.bi_size;
@@ -1034,9 +1034,9 @@ ssize_t __iomap_dio_read_simple(struct kiocb *iocb, struct iov_iter *iter,
 	bio->bi_iter.bi_sector = iomap_sector(&iomi->iomap, iomi->pos);
 	bio->bi_ioprio = iocb->ki_ioprio;
 
-	ret = bio_iov_iter_get_pages(bio, iter,
-				bdev_dma_alignment(bio->bi_bdev),
-				alignment - 1);
+	ret = bio_iov_iter_get_pages(bio, iter, BIO_MAX_SIZE,
+			bdev_dma_alignment(bio->bi_bdev),
+			alignment - 1);
 	if (unlikely(ret))
 		goto out_bio_put;
 
diff --git a/include/linux/bio.h b/include/linux/bio.h
index bb3235497e67..0070be355181 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -516,7 +516,8 @@ int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
 		size_t len, enum req_op op);
 
 int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter,
-		unsigned mem_align_mask, unsigned len_align_mask);
+		unsigned maxlen, unsigned mem_align_mask,
+		unsigned len_align_mask);
 
 bool bio_iov_iter_set(struct bio *bio, const struct iov_iter *iter);
 void __bio_release_pages(struct bio *bio, bool mark_dirty);
-- 
2.53.0


  reply	other threads:[~2026-08-31  6:40 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-31  6:39 lazy bounce buffering for checksummed reads V2 Christoph Hellwig
2026-08-31  6:39 ` Christoph Hellwig [this message]
2026-08-31 18:04   ` [PATCH 01/17] block: pass a maxlen argument to bio_iov_iter_get_pages Darrick J. Wong
2026-08-31  6:39 ` [PATCH 02/17] block: warn on too larger integrity allocations Christoph Hellwig
2026-08-31 18:01   ` Darrick J. Wong
2026-09-01  8:12     ` Christoph Hellwig
2026-08-31  6:39 ` [PATCH 03/17] block: split bio_iov_iter_bounce_write Christoph Hellwig
2026-08-31 17:58   ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 04/17] block: export fs_bio_integrity_{alloc,free} Christoph Hellwig
2026-08-31 17:57   ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 05/17] iomap: respect maximum I/O size in iomap_dio_bio_iter_one Christoph Hellwig
2026-08-31 17:55   ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 06/17] iomap: add a iomap_ioend_flags helper Christoph Hellwig
2026-08-31  6:39 ` [PATCH 07/17] iomap: add a IOMAP_IOEND_INTEGRITY flag Christoph Hellwig
2026-08-31  6:39 ` [PATCH 08/17] iomap,xfs: move T10 PI handling for direct I/O into ->submit_io Christoph Hellwig
2026-08-31  6:39 ` [PATCH 09/17] xfs: move PI generation into xfs_submit_zoned_bio Christoph Hellwig
2026-08-31 17:53   ` Darrick J. Wong
2026-09-02 18:22   ` Anuj Gupta
2026-09-07  5:51     ` Christoph Hellwig
2026-08-31  6:39 ` [PATCH 10/17] block,iomap: fix protection information verification with initial bvec offset Christoph Hellwig
2026-08-31 17:52   ` Darrick J. Wong
2026-09-01  8:12     ` Christoph Hellwig
2026-09-01 14:06       ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 11/17] iomap: better read bounce buffering support Christoph Hellwig
2026-08-31  6:40 ` [PATCH 12/17] xfs: use BIO_COMPLETE_IN_TASK for bounce buffered read I/Os Christoph Hellwig
2026-08-31  6:40 ` [PATCH 13/17] iomap,xfs: move integrity verification to the file system Christoph Hellwig
2026-08-31  6:40 ` [PATCH 14/17] xfs: add support for lazy direct read bounce buffering Christoph Hellwig
2026-08-31 17:47   ` Darrick J. Wong
2026-09-02 18:24   ` Anuj Gupta
2026-08-31  6:40 ` [PATCH 15/17] xfs: add error injection for lazy " Christoph Hellwig
2026-09-02 18:26   ` Anuj Gupta
2026-08-31  6:40 ` [PATCH 16/17] xfs: log a message at mount time when using integrity protection Christoph Hellwig
2026-08-31  6:40 ` [PATCH 17/17] block,iomap: remove the old read side bounce buffering support Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260831064010.2574896-2-hch@lst.de \
    --to=hch@lst.de \
    --cc=anuj20.g@samsung.com \
    --cc=axboe@kernel.dk \
    --cc=brauner@kernel.org \
    --cc=cem@kernel.org \
    --cc=djwong@kernel.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=tz2294@columbia.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.