Commit 8b8e0cc0 authored by Allison Collins's avatar Allison Collins Committed by Darrick J. Wong
Browse files

xfs: Refactor xfs_attr_rmtval_remove



Refactor xfs_attr_rmtval_remove to add helper function
__xfs_attr_rmtval_remove. We will use this later when we introduce
delayed attributes.  This function will eventually replace
xfs_attr_rmtval_remove

Signed-off-by: default avatarAllison Collins <allison.henderson@oracle.com>
Reviewed-by: default avatarChandan Rajendra <chandanrlinux@gmail.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Acked-by: default avatarDave Chinner <dchinner@redhat.com>
parent 1fc618d7
Loading
Loading
Loading
Loading
+37 −15
Original line number Diff line number Diff line
@@ -678,10 +678,8 @@ int
xfs_attr_rmtval_remove(
	struct xfs_da_args      *args)
{
	xfs_dablk_t		lblkno;
	int			blkcnt;
	int			error = 0;
	int			done = 0;
	int			error;
	int			retval;

	trace_xfs_attr_rmtval_remove(args);

@@ -691,16 +689,10 @@ xfs_attr_rmtval_remove(
	/*
	 * Keep de-allocating extents until the remote-value region is gone.
	 */
	lblkno = args->rmtblkno;
	blkcnt = args->rmtblkcnt;
	while (!done) {
		error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt,
				    XFS_BMAPI_ATTRFORK, 1, &done);
		if (error)
			return error;
		error = xfs_defer_finish(&args->trans);
		if (error)
			return error;
	do {
		retval = __xfs_attr_rmtval_remove(args);
		if (retval && retval != -EAGAIN)
			return retval;

		/*
		 * Close out trans and start the next one in the chain.
@@ -708,6 +700,36 @@ xfs_attr_rmtval_remove(
		error = xfs_trans_roll_inode(&args->trans, args->dp);
		if (error)
			return error;
	}
	} while (retval == -EAGAIN);

	return 0;
}

/*
 * Remove the value associated with an attribute by deleting the out-of-line
 * buffer that it is stored on. Returns EAGAIN for the caller to refresh the
 * transaction and re-call the function
 */
int
__xfs_attr_rmtval_remove(
	struct xfs_da_args	*args)
{
	int			error, done;

	/*
	 * Unmap value blocks for this attr.
	 */
	error = xfs_bunmapi(args->trans, args->dp, args->rmtblkno,
			    args->rmtblkcnt, XFS_BMAPI_ATTRFORK, 1, &done);
	if (error)
		return error;

	error = xfs_defer_finish(&args->trans);
	if (error)
		return error;

	if (!done)
		return -EAGAIN;

	return error;
}
+1 −0
Original line number Diff line number Diff line
@@ -14,4 +14,5 @@ int xfs_attr_rmtval_remove(struct xfs_da_args *args);
int xfs_attr_rmtval_stale(struct xfs_inode *ip, struct xfs_bmbt_irec *map,
		xfs_buf_flags_t incore_flags);
int xfs_attr_rmtval_invalidate(struct xfs_da_args *args);
int __xfs_attr_rmtval_remove(struct xfs_da_args *args);
#endif /* __XFS_ATTR_REMOTE_H__ */