On Fri, Mar 29, 2024 at 09:29:36AM -0700, Darrick J. Wong wrote: > On Thu, Mar 28, 2024 at 08:02:55AM +0100, Christoph Hellwig wrote: > > xfs_reflink_end_cow_extent currently caps the range it works on to > > fit both the existing extent (or hole) in the data fork and the > > new COW range. For overwrites of fragmented regions that is highly > > inefficient, as we need to split the new region at every boundary, > > just for it to be merge back in the next pass. > > > > Switch to unmapping the old data using a chain of deferred bmap > > and extent free ops ops first, and then handle remapping the new > > data in one single transaction instead. > > > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > > --- > > fs/xfs/xfs_reflink.c | 98 +++++++++++++++++++++++++------------------- > > 1 file changed, 56 insertions(+), 42 deletions(-) > > > > diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c > > index 3c35cd3b2dec5d..a7ee868d79bf02 100644 > > --- a/fs/xfs/xfs_reflink.c > > +++ b/fs/xfs/xfs_reflink.c > > @@ -701,6 +701,52 @@ xfs_reflink_cancel_cow_range( > > return error; > > } > > > > +/* > > + * Unmap any old data covering the COW target. > > + */ > > +static void > > +xfs_reflink_unmap_old_data( > > + struct xfs_trans *tp, > > + struct xfs_inode *ip, > > + xfs_fileoff_t offset_fsb, > > + xfs_fileoff_t end_fsb) > > +{ > > + struct xfs_ifork *ifp = &ip->i_df; > > + struct xfs_bmbt_irec got, del; > > + struct xfs_iext_cursor icur; > > + > > + ASSERT(!xfs_need_iread_extents(ifp)); > > + > > + if (!xfs_iext_lookup_extent_before(ip, ifp, &end_fsb, &icur, &got)) > > + return; > > + > > + while (got.br_startoff + got.br_blockcount > offset_fsb) { > > How many bmap and refcount log intent items can we attach to a single > transaction? It's roughly t_log_res / (32 + 32) though iirc in repair > I simply picked an upper limit of 128 extent mappings before I'd go back > for a fresh transaction. Ah, I didn't even think of a limit, but the log reservation obiously caps it. I'll look into simply reusing and documenting the repair limit.