Commit 3f562d09 authored by Allison Henderson's avatar Allison Henderson
Browse files

xfs: Hoist node transaction handling



This patch basically hoists the node transaction handling around the
leaf code we just hoisted.  This will helps setup this area for the
state machine since the goto is easily replaced with a state since it
ends with a transaction roll.

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 83c6e707
Loading
Loading
Loading
Loading
+29 −26
Original line number Original line Diff line number Diff line
@@ -309,10 +309,36 @@ xfs_attr_set_args(


	if (xfs_attr_is_leaf(dp)) {
	if (xfs_attr_is_leaf(dp)) {
		error = xfs_attr_leaf_try_add(args, bp);
		error = xfs_attr_leaf_try_add(args, bp);
		if (error == -ENOSPC)
		if (error == -ENOSPC) {
			/*
			 * Promote the attribute list to the Btree format.
			 */
			error = xfs_attr3_leaf_to_node(args);
			if (error)
				return error;

			/*
			 * 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.
			 */
			error = xfs_defer_finish(&args->trans);
			if (error)
				return error;

			/*
			 * Commit the current trans (including the inode) and
			 * start a new one.
			 */
			error = xfs_trans_roll_inode(&args->trans, dp);
			if (error)
				return error;

			goto node;
			goto node;
		else if (error)
		} else if (error) {
			return error;
			return error;
		}


		/*
		/*
		 * Commit the transaction that added the attr name so that
		 * Commit the transaction that added the attr name so that
@@ -402,32 +428,9 @@ xfs_attr_set_args(
			/* bp is gone due to xfs_da_shrink_inode */
			/* bp is gone due to xfs_da_shrink_inode */


		return error;
		return error;
	}
node:
node:
		/*
		 * Promote the attribute list to the Btree format.
		 */
		error = xfs_attr3_leaf_to_node(args);
		if (error)
			return error;

		/*
		 * 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.
		 */
		error = xfs_defer_finish(&args->trans);
		if (error)
			return error;


		/*
		 * Commit the current trans (including the inode) and
		 * start a new one.
		 */
		error = xfs_trans_roll_inode(&args->trans, dp);
		if (error)
			return error;
	}


	do {
	do {
		error = xfs_attr_node_addname_find_attr(args, &state);
		error = xfs_attr_node_addname_find_attr(args, &state);