summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2026-01-26 08:53:44 +0300
committerJens Axboe <axboe@kernel.dk>2026-01-28 15:16:40 +0300
commitd969bd72cf6835a4c915b326feb92c7597a46d98 (patch)
tree53724d2416783faceb8fea93896897fa38b99d60
parentc96b8b220271024c04289d6d9779dc2ccbd12be2 (diff)
downloadlinux-d969bd72cf6835a4c915b326feb92c7597a46d98.tar.xz
iomap: support ioends for direct reads
Support using the ioend structure to defer I/O completion for direct reads in addition to writes. This requires a check for the operation to not merge reads and writes in iomap_ioend_can_merge. This support will be used for bounce buffered direct I/O reads that need to copy data back to the user address space on read completion. 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>
-rw-r--r--fs/iomap/ioend.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/iomap/ioend.c b/fs/iomap/ioend.c
index 86f44922ed3b..800d12f45438 100644
--- a/fs/iomap/ioend.c
+++ b/fs/iomap/ioend.c
@@ -299,6 +299,14 @@ EXPORT_SYMBOL_GPL(iomap_finish_ioends);
static bool iomap_ioend_can_merge(struct iomap_ioend *ioend,
struct iomap_ioend *next)
{
+ /*
+ * There is no point in merging reads as there is no completion
+ * processing that can be easily batched up for them.
+ */
+ if (bio_op(&ioend->io_bio) == REQ_OP_READ ||
+ bio_op(&next->io_bio) == REQ_OP_READ)
+ return false;
+
if (ioend->io_bio.bi_status != next->io_bio.bi_status)
return false;
if (next->io_flags & IOMAP_IOEND_BOUNDARY)