Message ID | 20240827051028.1751933-11-hch@lst.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [01/10] iomap: handle a post-direct I/O invalidate race in iomap_write_delalloc_release | expand |
On Tue, Aug 27, 2024 at 07:09:57AM +0200, Christoph Hellwig wrote: > 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> Looks fine, Reviewed-by: Darrick J. Wong <djwong@kernel.org> --D > --- > fs/xfs/xfs_iomap.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 22e9613a995f12..4113e09cb836a8 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -1195,7 +1195,7 @@ xfs_buffered_write_iomap_begin( > xfs_trim_extent(&cmap, 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); > xfs_iunlock(ip, lockmode); > return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, iomap_flags, seq); > @@ -1212,8 +1212,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 > -- > 2.43.0 > >
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 22e9613a995f12..4113e09cb836a8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1195,7 +1195,7 @@ xfs_buffered_write_iomap_begin( xfs_trim_extent(&cmap, 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); xfs_iunlock(ip, lockmode); return xfs_bmbt_to_iomap(ip, iomap, &cmap, flags, iomap_flags, seq); @@ -1212,8 +1212,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
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> --- fs/xfs/xfs_iomap.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)