+++ /dev/null
-From aec6e23a1a570aabdd254804b6985f1679aff1bf Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 3 Oct 2025 09:46:35 -0400
-Subject: filemap: add helper to look up dirty folios in a range
-
-From: Brian Foster <bfoster@redhat.com>
-
-[ Upstream commit f8d98072feee32722086ddae4f288b6c45ae4330 ]
-
-Add a new filemap_get_folios_dirty() helper to look up existing dirty
-folios in a range and add them to a folio_batch. This is to support
-optimization of certain iomap operations that only care about dirty
-folios in a target range. For example, zero range only zeroes the subset
-of dirty pages over unwritten mappings, seek hole/data may use similar
-logic in the future, etc.
-
-Note that the helper is intended for use under internal fs locks.
-Therefore it trylocks folios in order to filter out clean folios.
-This loosely follows the logic from filemap_range_has_writeback().
-
-Signed-off-by: Brian Foster <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>
-Stable-dep-of: 7a6fd6b21d7e ("iomap: fix incorrect did_zero setting in iomap_zero_iter()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- include/linux/pagemap.h | 2 ++
- mm/filemap.c | 58 +++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 60 insertions(+)
-
-diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
-index 09b581c1d878d3..7274a86b487170 100644
---- a/include/linux/pagemap.h
-+++ b/include/linux/pagemap.h
-@@ -977,6 +977,8 @@ unsigned filemap_get_folios_contig(struct address_space *mapping,
- pgoff_t *start, pgoff_t end, struct folio_batch *fbatch);
- unsigned filemap_get_folios_tag(struct address_space *mapping, pgoff_t *start,
- pgoff_t end, xa_mark_t tag, struct folio_batch *fbatch);
-+unsigned filemap_get_folios_dirty(struct address_space *mapping,
-+ pgoff_t *start, pgoff_t end, struct folio_batch *fbatch);
-
- struct folio *read_cache_folio(struct address_space *, pgoff_t index,
- filler_t *filler, struct file *file);
-diff --git a/mm/filemap.c b/mm/filemap.c
-index 7c26e3735f1bb4..7c599eedf4da6c 100644
---- a/mm/filemap.c
-+++ b/mm/filemap.c
-@@ -2372,6 +2372,64 @@ unsigned filemap_get_folios_tag(struct address_space *mapping, pgoff_t *start,
- }
- EXPORT_SYMBOL(filemap_get_folios_tag);
-
-+/**
-+ * filemap_get_folios_dirty - Get a batch of dirty folios
-+ * @mapping: The address_space to search
-+ * @start: The starting folio index
-+ * @end: The final folio index (inclusive)
-+ * @fbatch: The batch to fill
-+ *
-+ * filemap_get_folios_dirty() works exactly like filemap_get_folios(), except
-+ * the returned folios are presumed to be dirty or undergoing writeback. Dirty
-+ * state is presumed because we don't block on folio lock nor want to miss
-+ * folios. Callers that need to can recheck state upon locking the folio.
-+ *
-+ * This may not return all dirty folios if the batch gets filled up.
-+ *
-+ * Return: The number of folios found.
-+ * Also update @start to be positioned for traversal of the next folio.
-+ */
-+unsigned filemap_get_folios_dirty(struct address_space *mapping, pgoff_t *start,
-+ pgoff_t end, struct folio_batch *fbatch)
-+{
-+ XA_STATE(xas, &mapping->i_pages, *start);
-+ struct folio *folio;
-+
-+ rcu_read_lock();
-+ while ((folio = find_get_entry(&xas, end, XA_PRESENT)) != NULL) {
-+ if (xa_is_value(folio))
-+ continue;
-+ if (folio_trylock(folio)) {
-+ bool clean = !folio_test_dirty(folio) &&
-+ !folio_test_writeback(folio);
-+ folio_unlock(folio);
-+ if (clean) {
-+ folio_put(folio);
-+ continue;
-+ }
-+ }
-+ if (!folio_batch_add(fbatch, folio)) {
-+ unsigned long nr = folio_nr_pages(folio);
-+ *start = folio->index + nr;
-+ goto out;
-+ }
-+ }
-+ /*
-+ * We come here when there is no folio beyond @end. We take care to not
-+ * overflow the index @start as it confuses some of the callers. This
-+ * breaks the iteration when there is a folio at index -1 but that is
-+ * already broke anyway.
-+ */
-+ if (end == (pgoff_t)-1)
-+ *start = (pgoff_t)-1;
-+ else
-+ *start = end + 1;
-+out:
-+ rcu_read_unlock();
-+
-+ return folio_batch_count(fbatch);
-+}
-+
- /*
- * CD/DVDs are error prone. When a medium error occurs, the driver may fail
- * a _large_ part of the i/o request. Imagine the worst scenario:
---
-2.53.0
-
+++ /dev/null
-From dc1bc967ff7cbb370829ef90f2cba281e33b99f9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 14 Jul 2026 16:23:23 +0800
-Subject: iomap: fix incorrect did_zero setting in iomap_zero_iter()
-
-From: Zhang Yi <yi.zhang@huawei.com>
-
-[ Upstream commit 7a6fd6b21d7e1737b40de1a210acf9e6a1e4d59e ]
-
-The did_zero output parameter was unconditionally set after the loop,
-which is incorrect. It should only be set when the zeroing operation
-actually completes, not when IOMAP_F_STALE is set or when
-IOMAP_F_FOLIO_BATCH is set but !folio causes the loop to break early,
-or when iomap_iter_advance() returns an error.
-
-This causes did_zero to be incorrectly set when zeroing a clean
-unwritten extent because the loop exits early without actually zeroing
-any data.
-
-Fix it by using a local variable to track whether any folio was actually
-zeroed, and only set did_zero after the loop if zeroing happened.
-
-Fixes: 98eb8d95025b ("iomap: set did_zero to true when zeroing successfully")
-Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
-Link: https://patch.msgid.link/20260714082325.325163-4-yi.zhang@huaweicloud.com
-Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
-Reviewed-by: Christoph Hellwig <hch@lst.de>
-Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/iomap/buffered-io.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
-index d856093db9d278..43c69b606e20fb 100644
---- a/fs/iomap/buffered-io.c
-+++ b/fs/iomap/buffered-io.c
-@@ -1458,6 +1458,7 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
- const struct iomap_write_ops *write_ops)
- {
- u64 bytes = iomap_length(iter);
-+ bool zeroed = false;
- int status;
-
- do {
-@@ -1476,6 +1477,8 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
- /* a NULL folio means we're done with a folio batch */
- if (!folio) {
- status = iomap_iter_advance_full(iter);
-+ if (status)
-+ return status;
- break;
- }
-
-@@ -1486,6 +1489,7 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
- bytes);
-
- folio_zero_range(folio, offset, bytes);
-+ zeroed = true;
- folio_mark_accessed(folio);
-
- ret = iomap_write_end(iter, bytes, bytes, folio);
-@@ -1495,10 +1499,10 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
-
- status = iomap_iter_advance(iter, bytes);
- if (status)
-- break;
-+ return status;
- } while ((bytes = iomap_length(iter)) > 0);
-
-- if (did_zero)
-+ if (did_zero && zeroed)
- *did_zero = true;
- return status;
- }
---
-2.53.0
-
+++ /dev/null
-From 888665737ba5355d21889fb98178599eaffcda8b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 3 Oct 2025 09:46:37 -0400
-Subject: iomap: optional zero range dirty folio processing
-
-From: Brian Foster <bfoster@redhat.com>
-
-[ Upstream commit 395ed1ef0012e1bb1e4050e84ba0173b3623112a ]
-
-The only way zero range can currently process unwritten mappings
-with dirty pagecache is to check whether the range is dirty before
-mapping lookup and then flush when at least one underlying mapping
-is unwritten. This ordering is required to prevent iomap lookup from
-racing with folio writeback and reclaim.
-
-Since zero range can skip ranges of unwritten mappings that are
-clean in cache, this operation can be improved by allowing the
-filesystem to provide a set of dirty folios that require zeroing. In
-turn, rather than flush or iterate file offsets, zero range can
-iterate on folios in the batch and advance over clean or uncached
-ranges in between.
-
-Add a folio_batch in struct iomap and provide a helper for
-filesystems to populate the batch at lookup time. Update the folio
-lookup path to return the next folio in the batch, if provided, and
-advance the iter if the folio starts beyond the current offset.
-
-Signed-off-by: Brian Foster <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>
-Stable-dep-of: 7a6fd6b21d7e ("iomap: fix incorrect did_zero setting in iomap_zero_iter()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/iomap/buffered-io.c | 90 +++++++++++++++++++++++++++++++++++++++---
- fs/iomap/iter.c | 6 +++
- include/linux/iomap.h | 4 ++
- 3 files changed, 95 insertions(+), 5 deletions(-)
-
-diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
-index 66d16483df4441..d856093db9d278 100644
---- a/fs/iomap/buffered-io.c
-+++ b/fs/iomap/buffered-io.c
-@@ -790,6 +790,28 @@ static struct folio *__iomap_get_folio(struct iomap_iter *iter,
- if (!mapping_large_folio_support(iter->inode->i_mapping))
- len = min_t(size_t, len, PAGE_SIZE - offset_in_page(pos));
-
-+ if (iter->fbatch) {
-+ struct folio *folio = folio_batch_next(iter->fbatch);
-+
-+ if (!folio)
-+ return NULL;
-+
-+ /*
-+ * The folio mapping generally shouldn't have changed based on
-+ * fs locks, but be consistent with filemap lookup and retry
-+ * the iter if it does.
-+ */
-+ folio_lock(folio);
-+ if (unlikely(folio->mapping != iter->inode->i_mapping)) {
-+ iter->iomap.flags |= IOMAP_F_STALE;
-+ folio_unlock(folio);
-+ return NULL;
-+ }
-+
-+ folio_get(folio);
-+ return folio;
-+ }
-+
- if (write_ops && write_ops->get_folio)
- return write_ops->get_folio(iter, pos, len);
- return iomap_get_folio(iter, pos, len);
-@@ -850,6 +872,8 @@ static int iomap_write_begin(struct iomap_iter *iter,
- int status = 0;
-
- len = min_not_zero(len, *plen);
-+ *foliop = NULL;
-+ *plen = 0;
-
- if (fatal_signal_pending(current))
- return -EINTR;
-@@ -858,6 +882,15 @@ static int iomap_write_begin(struct iomap_iter *iter,
- if (IS_ERR(folio))
- return PTR_ERR(folio);
-
-+ /*
-+ * No folio means we're done with a batch. We still have range to
-+ * process so return and let the caller iterate and refill the batch.
-+ */
-+ if (!folio) {
-+ WARN_ON_ONCE(!iter->fbatch);
-+ return 0;
-+ }
-+
- /*
- * Now we have a locked folio, before we do anything with it we need to
- * check that the iomap we have cached is not stale. The inode extent
-@@ -878,6 +911,22 @@ static int iomap_write_begin(struct iomap_iter *iter,
- }
- }
-
-+ /*
-+ * The folios in a batch may not be contiguous. If we've skipped
-+ * forward, advance the iter to the pos of the current folio. If the
-+ * folio starts beyond the end of the mapping, it may have been trimmed
-+ * since the lookup for whatever reason. Return a NULL folio to
-+ * terminate the op.
-+ */
-+ if (folio_pos(folio) > iter->pos) {
-+ len = min_t(u64, folio_pos(folio) - iter->pos,
-+ iomap_length(iter));
-+ status = iomap_iter_advance(iter, len);
-+ len = iomap_length(iter);
-+ if (status || !len)
-+ goto out_unlock;
-+ }
-+
- pos = iomap_trim_folio_range(iter, folio, poffset, &len);
-
- if (srcmap->type == IOMAP_INLINE)
-@@ -1424,6 +1473,12 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
- if (iter->iomap.flags & IOMAP_F_STALE)
- break;
-
-+ /* a NULL folio means we're done with a folio batch */
-+ if (!folio) {
-+ status = iomap_iter_advance_full(iter);
-+ break;
-+ }
-+
- /* warn about zeroing folios beyond eof that won't write back */
- WARN_ON_ONCE(folio_pos(folio) > iter->inode->i_size);
-
-@@ -1448,6 +1503,26 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
- return status;
- }
-
-+loff_t
-+iomap_fill_dirty_folios(
-+ struct iomap_iter *iter,
-+ loff_t offset,
-+ loff_t length)
-+{
-+ struct address_space *mapping = iter->inode->i_mapping;
-+ pgoff_t start = offset >> PAGE_SHIFT;
-+ pgoff_t end = (offset + length - 1) >> PAGE_SHIFT;
-+
-+ iter->fbatch = kmalloc(sizeof(struct folio_batch), GFP_KERNEL);
-+ if (!iter->fbatch)
-+ return offset + length;
-+ folio_batch_init(iter->fbatch);
-+
-+ filemap_get_folios_dirty(mapping, &start, end, iter->fbatch);
-+ return (start << PAGE_SHIFT);
-+}
-+EXPORT_SYMBOL_GPL(iomap_fill_dirty_folios);
-+
- int
- iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
- const struct iomap_ops *ops,
-@@ -1477,7 +1552,7 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
- * flushing on partial eof zeroing, special case it to zero the
- * unaligned start portion if already dirty in pagecache.
- */
-- if (off &&
-+ if (!iter.fbatch && off &&
- filemap_range_needs_writeback(mapping, pos, pos + plen - 1)) {
- iter.len = plen;
- while ((ret = iomap_iter(&iter, ops)) > 0)
-@@ -1494,13 +1569,18 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
- * if dirty and the fs returns a mapping that might convert on
- * writeback.
- */
-- range_dirty = filemap_range_needs_writeback(inode->i_mapping,
-- iter.pos, iter.pos + iter.len - 1);
-+ range_dirty = filemap_range_needs_writeback(mapping, iter.pos,
-+ iter.pos + iter.len - 1);
- while ((ret = iomap_iter(&iter, ops)) > 0) {
- const struct iomap *srcmap = iomap_iter_srcmap(&iter);
-
-- if (srcmap->type == IOMAP_HOLE ||
-- srcmap->type == IOMAP_UNWRITTEN) {
-+ if (WARN_ON_ONCE(iter.fbatch &&
-+ srcmap->type != IOMAP_UNWRITTEN))
-+ return -EIO;
-+
-+ if (!iter.fbatch &&
-+ (srcmap->type == IOMAP_HOLE ||
-+ srcmap->type == IOMAP_UNWRITTEN)) {
- s64 status;
-
- if (range_dirty) {
-diff --git a/fs/iomap/iter.c b/fs/iomap/iter.c
-index 91d2024e00da4e..8692e5e41c6df6 100644
---- a/fs/iomap/iter.c
-+++ b/fs/iomap/iter.c
-@@ -8,6 +8,12 @@
-
- static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
- {
-+ if (iter->fbatch) {
-+ folio_batch_release(iter->fbatch);
-+ kfree(iter->fbatch);
-+ iter->fbatch = NULL;
-+ }
-+
- iter->status = 0;
- memset(&iter->iomap, 0, sizeof(iter->iomap));
- memset(&iter->srcmap, 0, sizeof(iter->srcmap));
-diff --git a/include/linux/iomap.h b/include/linux/iomap.h
-index 4469b2318b08e5..53428ce1262f4e 100644
---- a/include/linux/iomap.h
-+++ b/include/linux/iomap.h
-@@ -9,6 +9,7 @@
- #include <linux/types.h>
- #include <linux/mm_types.h>
- #include <linux/blkdev.h>
-+#include <linux/pagevec.h>
-
- struct address_space;
- struct fiemap_extent_info;
-@@ -241,6 +242,7 @@ struct iomap_iter {
- unsigned flags;
- struct iomap iomap;
- struct iomap srcmap;
-+ struct folio_batch *fbatch;
- void *private;
- };
-
-@@ -347,6 +349,8 @@ bool iomap_dirty_folio(struct address_space *mapping, struct folio *folio);
- int iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
- const struct iomap_ops *ops,
- const struct iomap_write_ops *write_ops);
-+loff_t iomap_fill_dirty_folios(struct iomap_iter *iter, loff_t offset,
-+ loff_t length);
- int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len,
- bool *did_zero, const struct iomap_ops *ops,
- const struct iomap_write_ops *write_ops, void *private);
---
-2.53.0
-
+++ /dev/null
-From 4d107f5c44def02149e841a1ec3d01fecaf1601d Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 3 Oct 2025 09:46:36 -0400
-Subject: iomap: remove pos+len BUG_ON() to after folio lookup
-
-From: Brian Foster <bfoster@redhat.com>
-
-[ Upstream commit 49590716be886cc3cbbac10964eac551cfe570b2 ]
-
-The bug checks at the top of iomap_write_begin() assume the pos/len
-reflect exactly the next range to process. This may no longer be the
-case once the get folio path is able to process a folio batch from
-the filesystem. On top of that, len is already trimmed to within the
-iomap/srcmap by iomap_length(), so these checks aren't terribly
-useful. Remove the unnecessary BUG_ON() checks.
-
-Signed-off-by: Brian Foster <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>
-Stable-dep-of: 7a6fd6b21d7e ("iomap: fix incorrect did_zero setting in iomap_zero_iter()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/iomap/buffered-io.c | 5 +----
- 1 file changed, 1 insertion(+), 4 deletions(-)
-
-diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
-index db7d448e282cab..66d16483df4441 100644
---- a/fs/iomap/buffered-io.c
-+++ b/fs/iomap/buffered-io.c
-@@ -844,15 +844,12 @@ static int iomap_write_begin(struct iomap_iter *iter,
- size_t *poffset, u64 *plen)
- {
- const struct iomap *srcmap = iomap_iter_srcmap(iter);
-- loff_t pos = iter->pos;
-+ loff_t pos;
- u64 len = min_t(u64, SIZE_MAX, iomap_length(iter));
- struct folio *folio;
- int status = 0;
-
- len = min_not_zero(len, *plen);
-- BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
-- if (srcmap != &iter->iomap)
-- BUG_ON(pos + len > srcmap->offset + srcmap->length);
-
- if (fatal_signal_pending(current))
- return -EINTR;
---
-2.53.0
-
+++ /dev/null
-From bd84ab5a21131b9541edf97d08e897fb7557d6aa Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 19 Sep 2025 14:42:50 -0700
-Subject: iomap: simplify iomap_iter_advance()
-
-From: Joanne Koong <joannelkoong@gmail.com>
-
-[ Upstream commit ca82a7ea2299b4586af1f77daee66ee781202320 ]
-
-Most callers of iomap_iter_advance() do not need the remaining length
-returned. Get rid of the extra iomap_length() call that
-iomap_iter_advance() does.
-
-Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
-Reviewed-by: Brian Foster <bfoster@redhat.com>
-Reviewed-by: Christoph Hellwig <hch@lst.de>
-Signed-off-by: Christian Brauner <brauner@kernel.org>
-Stable-dep-of: 7a6fd6b21d7e ("iomap: fix incorrect did_zero setting in iomap_zero_iter()")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/dax.c | 30 ++++++++++++------------------
- fs/iomap/buffered-io.c | 18 +++++++++---------
- fs/iomap/direct-io.c | 6 +++---
- fs/iomap/iter.c | 14 +++++---------
- fs/iomap/seek.c | 8 ++++----
- include/linux/iomap.h | 6 ++----
- 6 files changed, 35 insertions(+), 47 deletions(-)
-
-diff --git a/fs/dax.c b/fs/dax.c
-index 516f995a988c8f..38fae11ee41912 100644
---- a/fs/dax.c
-+++ b/fs/dax.c
-@@ -1507,7 +1507,7 @@ static int dax_zero_iter(struct iomap_iter *iter, bool *did_zero)
-
- /* already zeroed? we're done. */
- if (srcmap->type == IOMAP_HOLE || srcmap->type == IOMAP_UNWRITTEN)
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
-
- /*
- * invalidate the pages whose sharing state is to be changed
-@@ -1536,10 +1536,10 @@ static int dax_zero_iter(struct iomap_iter *iter, bool *did_zero)
- if (ret < 0)
- return ret;
-
-- ret = iomap_iter_advance(iter, &length);
-+ ret = iomap_iter_advance(iter, length);
- if (ret)
- return ret;
-- } while (length > 0);
-+ } while ((length = iomap_length(iter)) > 0);
-
- if (did_zero)
- *did_zero = true;
-@@ -1597,7 +1597,7 @@ static int dax_iomap_iter(struct iomap_iter *iomi, struct iov_iter *iter)
-
- if (iomap->type == IOMAP_HOLE || iomap->type == IOMAP_UNWRITTEN) {
- done = iov_iter_zero(min(length, end - pos), iter);
-- return iomap_iter_advance(iomi, &done);
-+ return iomap_iter_advance(iomi, done);
- }
- }
-
-@@ -1681,12 +1681,12 @@ static int dax_iomap_iter(struct iomap_iter *iomi, struct iov_iter *iter)
- xfer = dax_copy_to_iter(dax_dev, pgoff, kaddr,
- map_len, iter);
-
-- length = xfer;
-- ret = iomap_iter_advance(iomi, &length);
-+ ret = iomap_iter_advance(iomi, xfer);
- if (!ret && xfer == 0)
- ret = -EFAULT;
- if (xfer < map_len)
- break;
-+ length = iomap_length(iomi);
- }
- dax_read_unlock(id);
-
-@@ -1919,10 +1919,8 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, unsigned long *pfnp,
- ret |= VM_FAULT_MAJOR;
- }
-
-- if (!(ret & VM_FAULT_ERROR)) {
-- u64 length = PAGE_SIZE;
-- iter.status = iomap_iter_advance(&iter, &length);
-- }
-+ if (!(ret & VM_FAULT_ERROR))
-+ iter.status = iomap_iter_advance(&iter, PAGE_SIZE);
- }
-
- if (iomap_errp)
-@@ -2034,10 +2032,8 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, unsigned long *pfnp,
- continue; /* actually breaks out of the loop */
-
- ret = dax_fault_iter(vmf, &iter, pfnp, &xas, &entry, true);
-- if (ret != VM_FAULT_FALLBACK) {
-- u64 length = PMD_SIZE;
-- iter.status = iomap_iter_advance(&iter, &length);
-- }
-+ if (ret != VM_FAULT_FALLBACK)
-+ iter.status = iomap_iter_advance(&iter, PMD_SIZE);
- }
-
- unlock_entry:
-@@ -2163,7 +2159,6 @@ static int dax_range_compare_iter(struct iomap_iter *it_src,
- const struct iomap *smap = &it_src->iomap;
- const struct iomap *dmap = &it_dest->iomap;
- loff_t pos1 = it_src->pos, pos2 = it_dest->pos;
-- u64 dest_len;
- void *saddr, *daddr;
- int id, ret;
-
-@@ -2196,10 +2191,9 @@ static int dax_range_compare_iter(struct iomap_iter *it_src,
- dax_read_unlock(id);
-
- advance:
-- dest_len = len;
-- ret = iomap_iter_advance(it_src, &len);
-+ ret = iomap_iter_advance(it_src, len);
- if (!ret)
-- ret = iomap_iter_advance(it_dest, &dest_len);
-+ ret = iomap_iter_advance(it_dest, len);
- return ret;
-
- out_unlock:
-diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
-index 734854f864fd1e..db7d448e282cab 100644
---- a/fs/iomap/buffered-io.c
-+++ b/fs/iomap/buffered-io.c
-@@ -405,7 +405,7 @@ static int iomap_readpage_iter(struct iomap_iter *iter,
- ret = iomap_read_inline_data(iter, folio);
- if (ret)
- return ret;
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- }
-
- /* zero post-eof blocks as the page may be mapped */
-@@ -466,7 +466,7 @@ static int iomap_readpage_iter(struct iomap_iter *iter,
- * iteration.
- */
- length = pos - iter->pos + plen;
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- }
-
- static int iomap_read_folio_iter(struct iomap_iter *iter,
-@@ -1070,7 +1070,7 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i,
- }
- } else {
- total_written += written;
-- iomap_iter_advance(iter, &written);
-+ iomap_iter_advance(iter, written);
- }
- } while (iov_iter_count(i) && iomap_length(iter));
-
-@@ -1339,7 +1339,7 @@ static int iomap_unshare_iter(struct iomap_iter *iter,
- int status;
-
- if (!iomap_want_unshare_iter(iter))
-- return iomap_iter_advance(iter, &bytes);
-+ return iomap_iter_advance(iter, bytes);
-
- do {
- struct folio *folio;
-@@ -1363,10 +1363,10 @@ static int iomap_unshare_iter(struct iomap_iter *iter,
-
- balance_dirty_pages_ratelimited(iter->inode->i_mapping);
-
-- status = iomap_iter_advance(iter, &bytes);
-+ status = iomap_iter_advance(iter, bytes);
- if (status)
- break;
-- } while (bytes > 0);
-+ } while ((bytes = iomap_length(iter)) > 0);
-
- return status;
- }
-@@ -1441,10 +1441,10 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero,
- if (WARN_ON_ONCE(!ret))
- return -EIO;
-
-- status = iomap_iter_advance(iter, &bytes);
-+ status = iomap_iter_advance(iter, bytes);
- if (status)
- break;
-- } while (bytes > 0);
-+ } while ((bytes = iomap_length(iter)) > 0);
-
- if (did_zero)
- *did_zero = true;
-@@ -1555,7 +1555,7 @@ static int iomap_folio_mkwrite_iter(struct iomap_iter *iter,
- folio_mark_dirty(folio);
- }
-
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- }
-
- vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops,
-diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
-index e73c71f39bd45f..2e86b5c5280bed 100644
---- a/fs/iomap/direct-io.c
-+++ b/fs/iomap/direct-io.c
-@@ -511,7 +511,7 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
- /* Undo iter limitation to current extent */
- iov_iter_reexpand(dio->submit.iter, orig_count - copied);
- if (copied)
-- return iomap_iter_advance(iter, &copied);
-+ return iomap_iter_advance(iter, copied);
- return ret;
- }
-
-@@ -522,7 +522,7 @@ static int iomap_dio_hole_iter(struct iomap_iter *iter, struct iomap_dio *dio)
- dio->size += length;
- if (!length)
- return -EFAULT;
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- }
-
- static int iomap_dio_inline_iter(struct iomap_iter *iomi, struct iomap_dio *dio)
-@@ -557,7 +557,7 @@ static int iomap_dio_inline_iter(struct iomap_iter *iomi, struct iomap_dio *dio)
- dio->size += copied;
- if (!copied)
- return -EFAULT;
-- return iomap_iter_advance(iomi, &copied);
-+ return iomap_iter_advance(iomi, copied);
- }
-
- static int iomap_dio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
-diff --git a/fs/iomap/iter.c b/fs/iomap/iter.c
-index cef77ca0c20bcc..91d2024e00da4e 100644
---- a/fs/iomap/iter.c
-+++ b/fs/iomap/iter.c
-@@ -13,17 +13,13 @@ static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
- memset(&iter->srcmap, 0, sizeof(iter->srcmap));
- }
-
--/*
-- * Advance the current iterator position and output the length remaining for the
-- * current mapping.
-- */
--int iomap_iter_advance(struct iomap_iter *iter, u64 *count)
-+/* Advance the current iterator position and decrement the remaining length */
-+int iomap_iter_advance(struct iomap_iter *iter, u64 count)
- {
-- if (WARN_ON_ONCE(*count > iomap_length(iter)))
-+ if (WARN_ON_ONCE(count > iomap_length(iter)))
- return -EIO;
-- iter->pos += *count;
-- iter->len -= *count;
-- *count = iomap_length(iter);
-+ iter->pos += count;
-+ iter->len -= count;
- return 0;
- }
-
-diff --git a/fs/iomap/seek.c b/fs/iomap/seek.c
-index 56db2dd4b10ddb..6cbc587c93dab2 100644
---- a/fs/iomap/seek.c
-+++ b/fs/iomap/seek.c
-@@ -16,13 +16,13 @@ static int iomap_seek_hole_iter(struct iomap_iter *iter,
- *hole_pos = mapping_seek_hole_data(iter->inode->i_mapping,
- iter->pos, iter->pos + length, SEEK_HOLE);
- if (*hole_pos == iter->pos + length)
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- return 0;
- case IOMAP_HOLE:
- *hole_pos = iter->pos;
- return 0;
- default:
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- }
- }
-
-@@ -59,12 +59,12 @@ static int iomap_seek_data_iter(struct iomap_iter *iter,
-
- switch (iter->iomap.type) {
- case IOMAP_HOLE:
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- case IOMAP_UNWRITTEN:
- *hole_pos = mapping_seek_hole_data(iter->inode->i_mapping,
- iter->pos, iter->pos + length, SEEK_DATA);
- if (*hole_pos < 0)
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, length);
- return 0;
- default:
- *hole_pos = iter->pos;
-diff --git a/include/linux/iomap.h b/include/linux/iomap.h
-index 73dceabc21c8c7..4469b2318b08e5 100644
---- a/include/linux/iomap.h
-+++ b/include/linux/iomap.h
-@@ -245,7 +245,7 @@ struct iomap_iter {
- };
-
- int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops);
--int iomap_iter_advance(struct iomap_iter *iter, u64 *count);
-+int iomap_iter_advance(struct iomap_iter *iter, u64 count);
-
- /**
- * iomap_length_trim - trimmed length of the current iomap iteration
-@@ -282,9 +282,7 @@ static inline u64 iomap_length(const struct iomap_iter *iter)
- */
- static inline int iomap_iter_advance_full(struct iomap_iter *iter)
- {
-- u64 length = iomap_length(iter);
--
-- return iomap_iter_advance(iter, &length);
-+ return iomap_iter_advance(iter, iomap_length(iter));
- }
-
- /**
---
-2.53.0
-
drm-xe-i2c-allow-per-domain-unique-id.patch
drm-xe-vm-fix-svm-leak-on-resv-obj-alloc-failure-in-.patch
iomap-correct-the-range-of-a-partial-dirty-clear.patch
-iomap-simplify-iomap_iter_advance.patch
-filemap-add-helper-to-look-up-dirty-folios-in-a-rang.patch
-iomap-remove-pos-len-bug_on-to-after-folio-lookup.patch
-iomap-optional-zero-range-dirty-folio-processing.patch
-iomap-fix-incorrect-did_zero-setting-in-iomap_zero_i.patch
tipc-fix-u16-mtu-truncation-in-media-and-bearer-mtu-.patch
drm-tests-shmem-set-dma-mask-to-64-bit-in-drm_gem_sh.patch
bpf-tcp-fix-double-sock-release-on-batch-realloc.patch