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: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
7d6fe5c586
commit
f6f91d290c
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user