The fix should be as simple as this:
diff --git a/fs/iomap.c b/fs/iomap.c
index 357711e50cfa..212c3c21e51c 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -342,19 +342,19 @@ __iomap_write_begin(struct inode *inode, loff_t pos,
unsigned len,
loff_t block_end = (pos + len + block_size - 1) & ~(block_size - 1);
unsigned poff = block_start & (PAGE_SIZE - 1);
unsigned plen = min_t(loff_t, PAGE_SIZE - poff, block_end -
block_start);
+ unsigned from = pos & (PAGE_SIZE - 1);
+ unsigned to = from + len;
int status;
WARN_ON_ONCE(i_blocksize(inode) < PAGE_SIZE);
if (PageUptodate(page))
return 0;
+ if (poff >= from && poff + len <= to)
+ return 0;
if (iomap_block_needs_zeroing(inode, block_start, iomap)) {
- unsigned from = pos & (PAGE_SIZE - 1), to = from + len;
- unsigned pend = poff + plen;
-
- if (poff < from || pend > to)
- zero_user_segments(page, poff, from, to, pend);
+ zero_user_segments(page, poff, from, to, poff + len);
} else {
status = iomap_read_page_sync(inode, block_start, page,
poff, plen, iomap);