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);

Reply via email to