Commit cd1549d6 authored by Allison Henderson's avatar Allison Henderson Committed by Dave Chinner
Browse files

xfs: Add helper function xfs_attr_leaf_addname



This patch adds a helper function xfs_attr_leaf_addname.  While this
does help to break down xfs_attr_set_iter, it does also hoist out some
of the state management.  This patch has been moved to the end of the
clean up series for further discussion.

Suggested-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent d68c51e9
Loading
Loading
Loading
Loading
+60 −50
Original line number Diff line number Diff line
@@ -286,44 +286,16 @@ xfs_attr_sf_addname(
	return -EAGAIN;
}

/*
 * Set the attribute specified in @args.
 * This routine is meant to function as a delayed operation, and may return
 * -EAGAIN when the transaction needs to be rolled.  Calling functions will need
 * to handle this, and recall the function until a successful error code is
 * returned.
 */
int
xfs_attr_set_iter(
STATIC int
xfs_attr_leaf_addname(
	struct xfs_attr_item	*attr)
{
	struct xfs_da_args	*args = attr->xattri_da_args;
	struct xfs_inode	*dp = args->dp;
	struct xfs_buf			*bp = NULL;
	int				forkoff, error = 0;
	struct xfs_mount		*mp = args->dp->i_mount;

	/* State machine switch */
	switch (attr->xattri_dela_state) {
	case XFS_DAS_UNINIT:
		/*
		 * If the fork is shortform, attempt to add the attr. If there
		 * is no space, this converts to leaf format and returns
		 * -EAGAIN with the leaf buffer held across the roll. The caller
		 * will deal with a transaction roll error, but otherwise
		 * release the hold once we return with a clean transaction.
		 */
		if (xfs_attr_is_shortform(dp))
			return xfs_attr_sf_addname(attr);
		if (attr->xattri_leaf_bp != NULL) {
			xfs_trans_bhold_release(args->trans,
						attr->xattri_leaf_bp);
			attr->xattri_leaf_bp = NULL;
		}
	int			error;

	if (xfs_attr_is_leaf(dp)) {
			error = xfs_attr_leaf_try_add(args,
						      attr->xattri_leaf_bp);
		error = xfs_attr_leaf_try_add(args, attr->xattri_leaf_bp);
		if (error == -ENOSPC) {
			error = xfs_attr3_leaf_to_node(args);
			if (error)
@@ -331,24 +303,23 @@ xfs_attr_set_iter(

			/*
			 * Finish any deferred work items and roll the
				 * transaction once more.  The goal here is to
				 * call node_addname with the inode and
				 * transaction in the same state (inode locked
				 * and joined, transaction clean) no matter how
				 * we got to this step.
			 * transaction once more.  The goal here is to call
			 * node_addname with the inode and transaction in the
			 * same state (inode locked and joined, transaction
			 * clean) no matter how we got to this step.
			 *
				 * At this point, we are still in
				 * XFS_DAS_UNINIT, but when we come back, we'll
				 * be a node, so we'll fall down into the node
				 * handling code below
			 * At this point, we are still in XFS_DAS_UNINIT, but
			 * when we come back, we'll be a node, so we'll fall
			 * down into the node handling code below
			 */
			trace_xfs_attr_set_iter_return(
				attr->xattri_dela_state, args->dp);
			return -EAGAIN;
			} else if (error) {
				return error;
		}

		if (error)
			return error;

		attr->xattri_dela_state = XFS_DAS_FOUND_LBLK;
	} else {
		error = xfs_attr_node_addname_find_attr(attr);
@@ -360,8 +331,8 @@ xfs_attr_set_iter(
			return error;

		/*
			 * If addname was successful, and we dont need to alloc
			 * or remove anymore blks, we're done.
		 * If addname was successful, and we dont need to alloc or
		 * remove anymore blks, we're done.
		 */
		if (!args->rmtblkno &&
		    !(args->op_flags & XFS_DA_OP_RENAME))
@@ -369,9 +340,48 @@ xfs_attr_set_iter(

		attr->xattri_dela_state = XFS_DAS_FOUND_NBLK;
	}
		trace_xfs_attr_set_iter_return(attr->xattri_dela_state,
					       args->dp);

	trace_xfs_attr_leaf_addname_return(attr->xattri_dela_state, args->dp);
	return -EAGAIN;
}

/*
 * Set the attribute specified in @args.
 * This routine is meant to function as a delayed operation, and may return
 * -EAGAIN when the transaction needs to be rolled.  Calling functions will need
 * to handle this, and recall the function until a successful error code is
 * returned.
 */
int
xfs_attr_set_iter(
	struct xfs_attr_item		*attr)
{
	struct xfs_da_args              *args = attr->xattri_da_args;
	struct xfs_inode		*dp = args->dp;
	struct xfs_buf			*bp = NULL;
	int				forkoff, error = 0;
	struct xfs_mount		*mp = args->dp->i_mount;

	/* State machine switch */
	switch (attr->xattri_dela_state) {
	case XFS_DAS_UNINIT:
		/*
		 * If the fork is shortform, attempt to add the attr. If there
		 * is no space, this converts to leaf format and returns
		 * -EAGAIN with the leaf buffer held across the roll. The caller
		 * will deal with a transaction roll error, but otherwise
		 * release the hold once we return with a clean transaction.
		 */
		if (xfs_attr_is_shortform(dp))
			return xfs_attr_sf_addname(attr);
		if (attr->xattri_leaf_bp != NULL) {
			xfs_trans_bhold_release(args->trans,
						attr->xattri_leaf_bp);
			attr->xattri_leaf_bp = NULL;
		}

		return xfs_attr_leaf_addname(attr);

	case XFS_DAS_FOUND_LBLK:
		/*
		 * If there was an out-of-line value, allocate the blocks we
+1 −0
Original line number Diff line number Diff line
@@ -4150,6 +4150,7 @@ DEFINE_EVENT(xfs_das_state_class, name, \
	TP_ARGS(das, ip))
DEFINE_DAS_STATE_EVENT(xfs_attr_sf_addname_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_set_iter_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_leaf_addname_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_node_addname_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return);