Commit f6f91d29 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Carlos Maiolino

xfs: punch delalloc extents from the COW fork for COW writes

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarCarlos Maiolino <cem@kernel.org>
parent 7d6fe5c5
...@@ -1196,7 +1196,7 @@ xfs_buffered_write_iomap_begin( ...@@ -1196,7 +1196,7 @@ xfs_buffered_write_iomap_begin(
imap.br_startoff - offset_fsb); imap.br_startoff - offset_fsb);
} }
iomap_flags = IOMAP_F_SHARED; iomap_flags |= IOMAP_F_SHARED;
seq = xfs_iomap_inode_sequence(ip, iomap_flags); seq = xfs_iomap_inode_sequence(ip, iomap_flags);
xfs_iunlock(ip, lockmode); xfs_iunlock(ip, lockmode);
return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, iomap_flags, seq); return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, iomap_flags, seq);
...@@ -1213,8 +1213,10 @@ xfs_buffered_write_delalloc_punch( ...@@ -1213,8 +1213,10 @@ xfs_buffered_write_delalloc_punch(
loff_t length, loff_t length,
struct iomap *iomap) struct iomap *iomap)
{ {
xfs_bmap_punch_delalloc_range(XFS_I(inode), XFS_DATA_FORK, offset, xfs_bmap_punch_delalloc_range(XFS_I(inode),
offset + length); (iomap->flags & IOMAP_F_SHARED) ?
XFS_COW_FORK : XFS_DATA_FORK,
offset, offset + length);
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment