dax: advance the iomap_iter in the read/write path
authorBrian Foster <bfoster@redhat.com>
Mon, 24 Feb 2025 14:47:49 +0000 (09:47 -0500)
committerChristian Brauner <brauner@kernel.org>
Wed, 26 Feb 2025 08:42:36 +0000 (09:42 +0100)
DAX reads and writes flow through dax_iomap_iter(), which has one or
more subtleties in terms of how it processes a range vs. what is
specified in the iomap_iter. To keep things simple and remove the
dependency on iomap_iter() advances, convert a positive return from
dax_iomap_iter() to the new advance and status return semantics. The
advance can be pushed further down in future patches.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Link: https://lore.kernel.org/r/20250224144757.237706-5-bfoster@redhat.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/dax.c

index 21b47402b3dca4684f5caff34d68cfd0df993080..296f5aa186401bcf8cea630ffaef3eddd6a5081a 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1585,8 +1585,12 @@ dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
        if (iocb->ki_flags & IOCB_NOWAIT)
                iomi.flags |= IOMAP_NOWAIT;
 
-       while ((ret = iomap_iter(&iomi, ops)) > 0)
+       while ((ret = iomap_iter(&iomi, ops)) > 0) {
                iomi.processed = dax_iomap_iter(&iomi, iter);
+               if (iomi.processed > 0)
+                       iomi.processed = iomap_iter_advance(&iomi,
+                                                           &iomi.processed);
+       }
 
        done = iomi.pos - iocb->ki_pos;
        iocb->ki_pos = iomi.pos;