Commit 6286514b authored by Allison Henderson's avatar Allison Henderson
Browse files

xfs: Refactor xfs_attr_set_shortform



This patch is actually the combination of patches from the previous
version (v18).  Initially patch 3 hoisted xfs_attr_set_shortform, and
the next added the helper xfs_attr_set_fmt. xfs_attr_set_fmt is similar
the old xfs_attr_set_shortform. It returns 0 when the attr has been set
and no further action is needed. It returns -EAGAIN when shortform has
been transformed to leaf, and the calling function should proceed the
set the attr in leaf form.

Signed-off-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChandan Babu R <chandanrlinux@gmail.com>
parent a8490f69
Loading
Loading
Loading
Loading
+14 −28
Original line number Diff line number Diff line
@@ -236,16 +236,11 @@ xfs_attr_is_shortform(
		ip->i_afp->if_nextents == 0);
}

/*
 * Attempts to set an attr in shortform, or converts short form to leaf form if
 * there is not enough room.  If the attr is set, the transaction is committed
 * and set to NULL.
 */
STATIC int
xfs_attr_set_shortform(
	struct xfs_da_args	*args,
	struct xfs_buf		**leaf_bp)
xfs_attr_set_fmt(
	struct xfs_da_args	*args)
{
	struct xfs_buf          *leaf_bp = NULL;
	struct xfs_inode	*dp = args->dp;
	int			error, error2 = 0;

@@ -258,29 +253,29 @@ xfs_attr_set_shortform(
		args->trans = NULL;
		return error ? error : error2;
	}

	/*
	 * It won't fit in the shortform, transform to a leaf block.  GROT:
	 * another possible req'mt for a double-split btree op.
	 */
	error = xfs_attr_shortform_to_leaf(args, leaf_bp);
	error = xfs_attr_shortform_to_leaf(args, &leaf_bp);
	if (error)
		return error;

	/*
	 * Prevent the leaf buffer from being unlocked so that a concurrent AIL
	 * push cannot grab the half-baked leaf buffer and run into problems
	 * with the write verifier. Once we're done rolling the transaction we
	 * can release the hold and add the attr to the leaf.
	 * with the write verifier.
	 */
	xfs_trans_bhold(args->trans, *leaf_bp);
	xfs_trans_bhold(args->trans, leaf_bp);
	error = xfs_defer_finish(&args->trans);
	xfs_trans_bhold_release(args->trans, *leaf_bp);
	xfs_trans_bhold_release(args->trans, leaf_bp);
	if (error) {
		xfs_trans_brelse(args->trans, *leaf_bp);
		xfs_trans_brelse(args->trans, leaf_bp);
		return error;
	}

	return 0;
	return -EAGAIN;
}

/*
@@ -291,8 +286,7 @@ xfs_attr_set_args(
	struct xfs_da_args	*args)
{
	struct xfs_inode	*dp = args->dp;
	struct xfs_buf          *leaf_bp = NULL;
	int			error = 0;
	int			error;

	/*
	 * If the attribute list is already in leaf format, jump straight to
@@ -301,15 +295,8 @@ xfs_attr_set_args(
	 * again.
	 */
	if (xfs_attr_is_shortform(dp)) {

		/*
		 * If the attr was successfully set in shortform, the
		 * transaction is committed and set to NULL.  Otherwise, is it
		 * converted from shortform to leaf, and the transaction is
		 * retained.
		 */
		error = xfs_attr_set_shortform(args, &leaf_bp);
		if (error || !args->trans)
		error = xfs_attr_set_fmt(args);
		if (error != -EAGAIN)
			return error;
	}

@@ -344,8 +331,7 @@ xfs_attr_set_args(
			return error;
	}

	error = xfs_attr_node_addname(args);
	return error;
	return xfs_attr_node_addname(args);
}

/*