[PATCH 21/33] xfs: plumb struct xfs_trans *tp into xfs_reflink_end_cow_extent
Dave Chinner <[email protected]> Wed, 29 Jul 2026 20:02:05 +1000
| Newsgroups | org.kernel.vger.linux-xfs |
|---|---|
| Message-ID | <[email protected]> |
Add a struct xfs_trans *tp parameter to xfs_reflink_end_cow_extent(). When a non-NULL transaction is provided, use it directly for the COW extent remapping and return the error to the caller without managing the transaction or lock lifecycle. When tp is NULL, the existing behaviour is preserved. All callers currently pass NULL, so there is no functional change. Assisted-by: LLM Signed-off-by: Dave Chinner <[email protected]> --- fs/xfs/xfs_reflink.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index e40f7afc2c7b..b175a549ee55 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -889,15 +889,19 @@ xfs_reflink_end_cow_extent_locked( */ STATIC int xfs_reflink_end_cow_extent( + struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t *offset_fsb, xfs_fileoff_t end_fsb) { struct xfs_mount *mp = ip->i_mount; - struct xfs_trans *tp; unsigned int resblks; + bool local_tp = false; int error; + if (tp) + goto end_cow; + resblks = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, XFS_TRANS_RESERVE, &tp); @@ -905,8 +909,12 @@ xfs_reflink_end_cow_extent( return error; xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, 0); + local_tp = true; +end_cow: error = xfs_reflink_end_cow_extent_locked(tp, ip, offset_fsb, end_fsb); + if (!local_tp) + return error; if (error) xfs_trans_cancel(tp); else @@ -966,7 +974,8 @@ xfs_reflink_end_cow( * blocks will be remapped. */ while (end_fsb > offset_fsb && !error) - error = xfs_reflink_end_cow_extent(ip, &offset_fsb, end_fsb); + error = xfs_reflink_end_cow_extent(NULL, ip, &offset_fsb, + end_fsb); if (error) trace_xfs_reflink_end_cow_error(ip, error, _RET_IP_); -- 2.55.0