]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iomap: advance the iter on direct I/O
authorBrian Foster <bfoster@redhat.com>
Mon, 24 Feb 2025 14:47:47 +0000 (09:47 -0500)
committerChristian Brauner <brauner@kernel.org>
Wed, 26 Feb 2025 08:42:35 +0000 (09:42 +0100)
Update iomap direct I/O to advance the iter directly rather than via
iter.processed. Update each mapping type helper to advance based on
the amount of data processed and return success or failure.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Link: https://lore.kernel.org/r/20250224144757.237706-3-bfoster@redhat.com
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/iomap/direct-io.c

index 138d246ec29d6ebe6cb4f0ceacd63e63520342fd..8ebd5b3019a735164efff33e1e7fb48f31eaf4a7 100644 (file)
@@ -335,8 +335,7 @@ static inline blk_opf_t iomap_dio_bio_opflags(struct iomap_dio *dio,
        return opflags;
 }
 
-static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
-               struct iomap_dio *dio)
+static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
 {
        const struct iomap *iomap = &iter->iomap;
        struct inode *inode = iter->inode;
@@ -349,7 +348,7 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
        bool need_zeroout = false;
        bool use_fua = false;
        int nr_pages, ret = 0;
-       size_t copied = 0;
+       u64 copied = 0;
        size_t orig_count;
 
        if (atomic && length != fs_block_size)
@@ -513,30 +512,28 @@ out:
        /* Undo iter limitation to current extent */
        iov_iter_reexpand(dio->submit.iter, orig_count - copied);
        if (copied)
-               return copied;
+               return iomap_iter_advance(iter, &copied);
        return ret;
 }
 
-static loff_t iomap_dio_hole_iter(const struct iomap_iter *iter,
-               struct iomap_dio *dio)
+static int iomap_dio_hole_iter(struct iomap_iter *iter, struct iomap_dio *dio)
 {
        loff_t length = iov_iter_zero(iomap_length(iter), dio->submit.iter);
 
        dio->size += length;
        if (!length)
                return -EFAULT;
-       return length;
+       return iomap_iter_advance(iter, &length);
 }
 
-static loff_t iomap_dio_inline_iter(const struct iomap_iter *iomi,
-               struct iomap_dio *dio)
+static int iomap_dio_inline_iter(struct iomap_iter *iomi, struct iomap_dio *dio)
 {
        const struct iomap *iomap = &iomi->iomap;
        struct iov_iter *iter = dio->submit.iter;
        void *inline_data = iomap_inline_data(iomap, iomi->pos);
        loff_t length = iomap_length(iomi);
        loff_t pos = iomi->pos;
-       size_t copied;
+       u64 copied;
 
        if (WARN_ON_ONCE(!iomap_inline_data_valid(iomap)))
                return -EIO;
@@ -558,11 +555,10 @@ static loff_t iomap_dio_inline_iter(const struct iomap_iter *iomi,
        dio->size += copied;
        if (!copied)
                return -EFAULT;
-       return copied;
+       return iomap_iter_advance(iomi, &copied);
 }
 
-static loff_t iomap_dio_iter(const struct iomap_iter *iter,
-               struct iomap_dio *dio)
+static int iomap_dio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
 {
        switch (iter->iomap.type) {
        case IOMAP_HOLE: