xfs: kill XFS_DAC_LEAF_ADDNAME_INIT
authorDave Chinner <dchinner@redhat.com>
Thu, 12 May 2022 05:12:54 +0000 (15:12 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 12 May 2022 05:12:54 +0000 (15:12 +1000)
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: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Allison Henderson<allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_attr.c
fs/xfs/libxfs/xfs_attr.h
fs/xfs/xfs_trace.h

index 7c11fe8b7b26a337e3c0f6715ff790b83fbe1116..1ae210dc8a2ba08a48b5e16f4f7318e99ee106c1 100644 (file)
@@ -405,40 +405,41 @@ xfs_attr_set_iter(
                return xfs_attr_node_addname(attr);
 
        case XFS_DAS_FOUND_LBLK:
+               /*
+                * Find space for remote blocks and fall into the allocation
+                * state.
+                */
+               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:
+
                /*
                 * 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.
                 */
-
-               /* 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 (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,
+                                               args->dp);
+                               return -EAGAIN;
                        }
-               }
 
-               /*
-                * Repeat allocating remote blocks for the attr value until
-                * blkcnt drops to zero.
-                */
-               if (attr->xattri_blkcnt > 0) {
-                       error = xfs_attr_rmtval_set_blk(attr);
+                       error = xfs_attr_rmtval_set_value(args);
                        if (error)
                                return error;
-                       trace_xfs_attr_set_iter_return(attr->xattri_dela_state,
-                                                      args->dp);
-                       return -EAGAIN;
                }
 
-               error = xfs_attr_rmtval_set_value(args);
-               if (error)
-                       return error;
-
                /*
                 * If this is not a rename, clear the incomplete flag and we're
                 * done.
@@ -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);
index bbbc964f4e3cd4f068b910d5534bbf5231604bee..cdfc5a9b44957bd46d711b4be4a9b101a718bc6f 100644 (file)
@@ -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" }, \
index 8f722be25c298befa2276a20840b224e4686771d..067ab31d7a20db4a0f0de004383836574f4392eb 100644 (file)
@@ -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);