]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: always trim mapping to requested range for zero range
authorBrian Foster <bfoster@redhat.com>
Fri, 3 Oct 2025 13:46:38 +0000 (09:46 -0400)
committerChristian Brauner <brauner@kernel.org>
Wed, 5 Nov 2025 11:57:25 +0000 (12:57 +0100)
Refactor and tweak the IOMAP_ZERO logic in preparation to support
filling the folio batch for unwritten mappings. Drop the superfluous
imap offset check since the hole case has already been filtered out.
Split the the delalloc case handling into a sub-branch, and always
trim the imap to the requested offset/count so it can be more easily
used to bound the range to lookup in pagecache.

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>
fs/xfs/xfs_iomap.c

index d3f6e3e42a11913f00b79a439d74dcc2bbda6389..6a05e04ad5ba446d9813cbae74c717f748c77c07 100644 (file)
@@ -1767,21 +1767,20 @@ xfs_buffered_write_iomap_begin(
        }
 
        /*
-        * For zeroing, trim a delalloc extent that extends beyond the EOF
-        * block.  If it starts beyond the EOF block, convert it to an
+        * For zeroing, trim extents that extend beyond the EOF block. If a
+        * delalloc extent starts beyond the EOF block, convert it to an
         * unwritten extent.
         */
-       if ((flags & IOMAP_ZERO) && imap.br_startoff <= offset_fsb &&
-           isnullstartblock(imap.br_startblock)) {
+       if (flags & IOMAP_ZERO) {
                xfs_fileoff_t eof_fsb = XFS_B_TO_FSB(mp, XFS_ISIZE(ip));
 
-               if (offset_fsb >= eof_fsb)
+               if (isnullstartblock(imap.br_startblock) &&
+                   offset_fsb >= eof_fsb)
                        goto convert_delay;
-               if (end_fsb > eof_fsb) {
+               if (offset_fsb < eof_fsb && end_fsb > eof_fsb)
                        end_fsb = eof_fsb;
-                       xfs_trim_extent(&imap, offset_fsb,
-                                       end_fsb - offset_fsb);
-               }
+
+               xfs_trim_extent(&imap, offset_fsb, end_fsb - offset_fsb);
        }
 
        /*