Re: [PATCH 09/13] xfs: refactor reflink functions to use xfs_trans_alloc_inode

Christoph Hellwig
2021-01-28T09:54:38Z

On Wed, Jan 27, 2021 at 10:01:55PM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
>
> The two remaining callers of xfs_trans_reserve_quota_nblks are in the
> reflink code. These conversions aren't as uniform as the previous
> conversions, so call that out in a separate patch.
>
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
> fs/xfs/xfs_reflink.c | 58 +++++++++++++++++++++-----------------------------
> 1 file changed, 24 insertions(+), 34 deletions(-)
>
>
> diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
> index 0778b5810c26..ded86cc4764c 100644
> --- a/fs/xfs/xfs_reflink.c
> +++ b/fs/xfs/xfs_reflink.c
> @@ -376,16 +376,15 @@ xfs_reflink_allocate_cow(
> resblks = XFS_DIOSTRAT_SPACE_RES(mp, resaligned);
>
> xfs_iunlock(ip, *lockmode);
>
> + error = xfs_trans_alloc_inode(ip, &M_RES(mp)->tr_write, resblks, 0,
> + false, &tp);
> + if (error) {
> + /* This function must return with ILOCK_EXCL held. */
> + *lockmode = XFS_ILOCK_EXCL;
> + xfs_ilock(ip, *lockmode);
> return error;
> + }

The only thing that the only caller of xfs_reflink_allocate_cow does
on error is to immediately release the lock. So I think we are better
off changing the calling convention instead of relocking here.