Commit 2157d169 authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner
Browse files

xfs: kill XFS_DAC_LEAF_ADDNAME_INIT



We re-enter the XFS_DAS_FOUND_LBLK state when we have to allocate
multiple extents for a remote xattr. We currently have a flag
called XFS_DAC_LEAF_ADDNAME_INIT to avoid running the remote attr
hole finding code more than once.

However, for the node format tree, we have a separate state for this
so we never reenter the state machine at XFS_DAS_FOUND_NBLK and so
it does not need a special flag to skip over the remote attr hold
finding code.

Convert the leaf block code to use the same state machine as the
node blocks and kill the  XFS_DAC_LEAF_ADDNAME_INIT flag.

This further points out that this "ALLOC" state is only traversed
if we have remote xattrs or we are doing a rename operation. Rename
both the leaf and node alloc states to _ALLOC_RMT to indicate they
are iterating to do allocation of remote xattr blocks.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarAllison <Henderson&lt;allison.henderson@oracle.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent e0c41089
Loading
Loading
Loading
Loading
+23 −22
Original line number Diff line number Diff line
@@ -406,31 +406,31 @@ xfs_attr_set_iter(

	case XFS_DAS_FOUND_LBLK:
		/*
		 * If there was an out-of-line value, allocate the blocks we
		 * identified for its storage and copy the value.  This is done
		 * after we create the attribute so that we don't overflow the
		 * maximum size of a transaction and/or hit a deadlock.
		 * Find space for remote blocks and fall into the allocation
		 * state.
		 */

		/* Open coded xfs_attr_rmtval_set without trans handling */
		if ((attr->xattri_flags & XFS_DAC_LEAF_ADDNAME_INIT) == 0) {
			attr->xattri_flags |= XFS_DAC_LEAF_ADDNAME_INIT;
		if (args->rmtblkno > 0) {
			error = xfs_attr_rmtval_find_space(attr);
			if (error)
				return error;
		}
		}
		attr->xattri_dela_state = XFS_DAS_LEAF_ALLOC_RMT;
		fallthrough;
	case XFS_DAS_LEAF_ALLOC_RMT:

		/*
		 * Repeat allocating remote blocks for the attr value until
		 * blkcnt drops to zero.
		 * If there was an out-of-line value, allocate the blocks we
		 * identified for its storage and copy the value.  This is done
		 * after we create the attribute so that we don't overflow the
		 * maximum size of a transaction and/or hit a deadlock.
		 */
		if (args->rmtblkno > 0) {
			if (attr->xattri_blkcnt > 0) {
				error = xfs_attr_rmtval_set_blk(attr);
				if (error)
					return error;
			trace_xfs_attr_set_iter_return(attr->xattri_dela_state,
				trace_xfs_attr_set_iter_return(
						attr->xattri_dela_state,
						args->dp);
				return -EAGAIN;
			}
@@ -438,6 +438,7 @@ xfs_attr_set_iter(
			error = xfs_attr_rmtval_set_value(args);
			if (error)
				return error;
		}

		/*
		 * If this is not a rename, clear the incomplete flag and we're
@@ -533,15 +534,15 @@ xfs_attr_set_iter(
				return error;
		}

		attr->xattri_dela_state = XFS_DAS_NODE_ALLOC_RMT;
		fallthrough;
	case XFS_DAS_ALLOC_NODE:
	case XFS_DAS_NODE_ALLOC_RMT:
		/*
		 * If there was an out-of-line value, allocate the blocks we
		 * identified for its storage and copy the value.  This is done
		 * after we create the attribute so that we don't overflow the
		 * maximum size of a transaction and/or hit a deadlock.
		 */
		attr->xattri_dela_state = XFS_DAS_ALLOC_NODE;
		if (args->rmtblkno > 0) {
			if (attr->xattri_blkcnt > 0) {
				error = xfs_attr_rmtval_set_blk(attr);
+4 −2
Original line number Diff line number Diff line
@@ -451,11 +451,12 @@ enum xfs_delattr_state {
	XFS_DAS_RM_NAME,		/* Remove attr name */
	XFS_DAS_RM_SHRINK,		/* We are shrinking the tree */
	XFS_DAS_FOUND_LBLK,		/* We found leaf blk for attr */
	XFS_DAS_LEAF_ALLOC_RMT,		/* We are allocating remote blocks */
	XFS_DAS_FOUND_NBLK,		/* We found node blk for attr */
	XFS_DAS_NODE_ALLOC_RMT,		/* We are allocating remote blocks */
	XFS_DAS_FLIP_LFLAG,		/* Flipped leaf INCOMPLETE attr flag */
	XFS_DAS_RM_LBLK,		/* A rename is removing leaf blocks */
	XFS_DAS_RD_LEAF,		/* Read in the new leaf */
	XFS_DAS_ALLOC_NODE,		/* We are allocating node blocks */
	XFS_DAS_FLIP_NFLAG,		/* Flipped node INCOMPLETE attr flag */
	XFS_DAS_RM_NBLK,		/* A rename is removing node blocks */
	XFS_DAS_CLR_FLAG,		/* Clear incomplete flag */
@@ -471,11 +472,12 @@ enum xfs_delattr_state {
	{ XFS_DAS_RM_NAME,	"XFS_DAS_RM_NAME" }, \
	{ XFS_DAS_RM_SHRINK,	"XFS_DAS_RM_SHRINK" }, \
	{ XFS_DAS_FOUND_LBLK,	"XFS_DAS_FOUND_LBLK" }, \
	{ XFS_DAS_LEAF_ALLOC_RMT, "XFS_DAS_LEAF_ALLOC_RMT" }, \
	{ XFS_DAS_FOUND_NBLK,	"XFS_DAS_FOUND_NBLK" }, \
	{ XFS_DAS_NODE_ALLOC_RMT, "XFS_DAS_NODE_ALLOC_RMT" },  \
	{ XFS_DAS_FLIP_LFLAG,	"XFS_DAS_FLIP_LFLAG" }, \
	{ XFS_DAS_RM_LBLK,	"XFS_DAS_RM_LBLK" }, \
	{ XFS_DAS_RD_LEAF,	"XFS_DAS_RD_LEAF" }, \
	{ XFS_DAS_ALLOC_NODE,	"XFS_DAS_ALLOC_NODE" }, \
	{ XFS_DAS_FLIP_NFLAG,	"XFS_DAS_FLIP_NFLAG" }, \
	{ XFS_DAS_RM_NBLK,	"XFS_DAS_RM_NBLK" }, \
	{ XFS_DAS_CLR_FLAG,	"XFS_DAS_CLR_FLAG" }, \
+2 −1
Original line number Diff line number Diff line
@@ -4137,11 +4137,12 @@ TRACE_DEFINE_ENUM(XFS_DAS_RMTBLK);
TRACE_DEFINE_ENUM(XFS_DAS_RM_NAME);
TRACE_DEFINE_ENUM(XFS_DAS_RM_SHRINK);
TRACE_DEFINE_ENUM(XFS_DAS_FOUND_LBLK);
TRACE_DEFINE_ENUM(XFS_DAS_LEAF_ALLOC_RMT);
TRACE_DEFINE_ENUM(XFS_DAS_FOUND_NBLK);
TRACE_DEFINE_ENUM(XFS_DAS_NODE_ALLOC_RMT);
TRACE_DEFINE_ENUM(XFS_DAS_FLIP_LFLAG);
TRACE_DEFINE_ENUM(XFS_DAS_RM_LBLK);
TRACE_DEFINE_ENUM(XFS_DAS_RD_LEAF);
TRACE_DEFINE_ENUM(XFS_DAS_ALLOC_NODE);
TRACE_DEFINE_ENUM(XFS_DAS_FLIP_NFLAG);
TRACE_DEFINE_ENUM(XFS_DAS_RM_NBLK);
TRACE_DEFINE_ENUM(XFS_DAS_CLR_FLAG);