]> www.infradead.org Git - users/hch/misc.git/commitdiff
xfs: punch delalloc extents from the COW fork for COW writes
authorChristoph Hellwig <hch@lst.de>
Tue, 8 Oct 2024 08:59:21 +0000 (10:59 +0200)
committerCarlos Maiolino <cem@kernel.org>
Tue, 15 Oct 2024 09:37:42 +0000 (11:37 +0200)
When ->iomap_end is called on a short write to the COW fork it needs to
punch stale delalloc data from the COW fork and not the data fork.

Ensure that IOMAP_F_NEW is set for new COW fork allocations in
xfs_buffered_write_iomap_begin, and then use the IOMAP_F_SHARED flag
in xfs_buffered_write_delalloc_punch to decide which fork to punch.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_iomap.c

index 0317bbfeeb38f36f5f8730000950de8a057c9b58..916531d9f83c2fcef72cc2b1835dc1045457f662 100644 (file)
@@ -1196,7 +1196,7 @@ found_cow:
                                imap.br_startoff - offset_fsb);
        }
 
-       iomap_flags = IOMAP_F_SHARED;
+       iomap_flags |= IOMAP_F_SHARED;
        seq = xfs_iomap_inode_sequence(ip, iomap_flags);
        xfs_iunlock(ip, lockmode);
        return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, iomap_flags, seq);
@@ -1213,8 +1213,10 @@ xfs_buffered_write_delalloc_punch(
        loff_t                  length,
        struct iomap            *iomap)
 {
-       xfs_bmap_punch_delalloc_range(XFS_I(inode), XFS_DATA_FORK, offset,
-                       offset + length);
+       xfs_bmap_punch_delalloc_range(XFS_I(inode),
+                       (iomap->flags & IOMAP_F_SHARED) ?
+                               XFS_COW_FORK : XFS_DATA_FORK,
+                       offset, offset + length);
 }
 
 static int