]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: kill XFS_DAC_LEAF_ADDNAME_INIT
authorDave Chinner <dchinner@redhat.com>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
Source kernel commit: 2157d1699e59819c8a31ba3e47008e4145d854a9

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_attr.c
libxfs/xfs_attr.h

index b3a5316bc0ef9f205896daafa2f6efffb36cb881..965d0bcc921ecbb250ae1443ab7a669f177bd42d 100644 (file)
@@ -403,40 +403,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.
@@ -531,15 +532,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" }, \