iomap: introduce a full map advance helper
authorBrian Foster <bfoster@redhat.com>
Mon, 24 Feb 2025 14:47:57 +0000 (09:47 -0500)
committerChristian Brauner <brauner@kernel.org>
Wed, 26 Feb 2025 08:42:37 +0000 (09:42 +0100)
Various iomap_iter_advance() calls advance by the full mapping
length and thus have no need for the current length input or
post-advance remaining length output from the standard advance
function. Add an iomap_iter_advance_full() helper to clean up these
cases.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Link: https://lore.kernel.org/r/20250224144757.237706-13-bfoster@redhat.com
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/dax.c
fs/iomap/buffered-io.c
fs/iomap/fiemap.c
fs/iomap/swapfile.c
include/linux/iomap.h

index cab3c5abe5cb5a839a105b23e3604bad27e92a3a..7fd4cd9a51f24fcce162baec52e7a4777ece7b6d 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1266,11 +1266,11 @@ static int dax_unshare_iter(struct iomap_iter *iter)
        u64 copy_len = iomap_length(iter);
        u32 mod;
        int id = 0;
-       s64 ret = iomap_length(iter);
+       s64 ret;
        void *daddr = NULL, *saddr = NULL;
 
        if (!iomap_want_unshare_iter(iter))
-               return iomap_iter_advance(iter, &ret);
+               return iomap_iter_advance_full(iter);
 
        /*
         * Extend the file range to be aligned to fsblock/pagesize, because
@@ -1300,16 +1300,14 @@ static int dax_unshare_iter(struct iomap_iter *iter)
        if (ret < 0)
                goto out_unlock;
 
-       if (copy_mc_to_kernel(daddr, saddr, copy_len) == 0)
-               ret = iomap_length(iter);
-       else
+       if (copy_mc_to_kernel(daddr, saddr, copy_len) != 0)
                ret = -EIO;
 
 out_unlock:
        dax_read_unlock(id);
        if (ret < 0)
                return dax_mem2blk_err(ret);
-       return iomap_iter_advance(iter, &ret);
+       return iomap_iter_advance_full(iter);
 }
 
 int dax_file_unshare(struct inode *inode, loff_t pos, loff_t len,
index cdb0fedcf3d20db0ec15aa2a3d1b46078da121af..ea5e32d810d50fc89f0c91c7e60f245c53d9f46f 100644 (file)
@@ -1433,8 +1433,7 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
                                range_dirty = false;
                                status = iomap_zero_iter_flush_and_stale(&iter);
                        } else {
-                               u64 length = iomap_length(&iter);
-                               status = iomap_iter_advance(&iter, &length);
+                               status = iomap_iter_advance_full(&iter);
                        }
                        iter.status = status;
                        continue;
index 6776b800bde72dcb070d1fb17a157f8633e9b835..80675c42e94e14185039c89dd31ca7baea6c5024 100644 (file)
@@ -42,7 +42,6 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi,
 static int iomap_fiemap_iter(struct iomap_iter *iter,
                struct fiemap_extent_info *fi, struct iomap *prev)
 {
-       u64 length = iomap_length(iter);
        int ret;
 
        if (iter->iomap.type == IOMAP_HOLE)
@@ -56,7 +55,7 @@ static int iomap_fiemap_iter(struct iomap_iter *iter,
                return 0;
 
 advance:
-       return iomap_iter_advance(iter, &length);
+       return iomap_iter_advance_full(iter);
 }
 
 int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi,
index 9ea185e58ca71dd0b159c483c04cc364e918c05a..c1a762c10ce4c3c2398921e9e79f83b0f0de8576 100644 (file)
@@ -97,8 +97,6 @@ static int iomap_swapfile_fail(struct iomap_swapfile_info *isi, const char *str)
 static int iomap_swapfile_iter(struct iomap_iter *iter,
                struct iomap *iomap, struct iomap_swapfile_info *isi)
 {
-       u64 length = iomap_length(iter);
-
        switch (iomap->type) {
        case IOMAP_MAPPED:
        case IOMAP_UNWRITTEN:
@@ -135,7 +133,7 @@ static int iomap_swapfile_iter(struct iomap_iter *iter,
                memcpy(&isi->iomap, iomap, sizeof(isi->iomap));
        }
 
-       return iomap_iter_advance(iter, &length);
+       return iomap_iter_advance_full(iter);
 }
 
 /*
index af9e51fba5f0eb7a2d40104d4507bad873c1e6ac..1fd66bc29cc1b3417131cecb78aa2ccbdec68fd9 100644 (file)
@@ -271,6 +271,16 @@ static inline u64 iomap_length(const struct iomap_iter *iter)
        return iomap_length_trim(iter, iter->pos, iter->len);
 }
 
+/**
+ * iomap_iter_advance_full - advance by the full length of current map
+ */
+static inline int iomap_iter_advance_full(struct iomap_iter *iter)
+{
+       u64 length = iomap_length(iter);
+
+       return iomap_iter_advance(iter, &length);
+}
+
 /**
  * iomap_iter_srcmap - return the source map for the current iomap iteration
  * @i: iteration structure