]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: Add helper function xfs_attr_leaf_addname
authorAllison Henderson <allison.henderson@oracle.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: cd1549d6df22e4f72903dbb169202203d429bcff

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: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
include/xfs_trace.h
libxfs/xfs_attr.c

index 683f578fae9eace5041ca32f132c1b4012b19071..e4959d622e45232627587dd80f2ad4e0f8c201a1 100644 (file)
@@ -41,6 +41,7 @@
 
 #define trace_xfs_attr_sf_addname_return(...)  ((void) 0)
 #define trace_xfs_attr_set_iter_return(...)    ((void) 0)
+#define trace_xfs_attr_leaf_addname_return(...)        ((void) 0)
 #define trace_xfs_attr_node_addname_return(...)        ((void) 0)
 #define trace_xfs_attr_remove_iter_return(...) ((void) 0)
 #define trace_xfs_attr_rmtval_remove_return(...) ((void) 0)
index 85141dfafaa5bb84e25438b2610639e914ee6caf..97c70ada7772c0b2453f06742272bf9013c4bf1f 100644 (file)
@@ -284,6 +284,65 @@ xfs_attr_sf_addname(
        return -EAGAIN;
 }
 
+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;
+       int                     error;
+
+       if (xfs_attr_is_leaf(dp)) {
+               error = xfs_attr_leaf_try_add(args, attr->xattri_leaf_bp);
+               if (error == -ENOSPC) {
+                       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.
+                        *
+                        * 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;
+               }
+
+               if (error)
+                       return error;
+
+               attr->xattri_dela_state = XFS_DAS_FOUND_LBLK;
+       } else {
+               error = xfs_attr_node_addname_find_attr(attr);
+               if (error)
+                       return error;
+
+               error = xfs_attr_node_addname(attr);
+               if (error)
+                       return error;
+
+               /*
+                * 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))
+                       return 0;
+
+               attr->xattri_dela_state = XFS_DAS_FOUND_NBLK;
+       }
+
+       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
@@ -319,57 +378,8 @@ xfs_attr_set_iter(
                        attr->xattri_leaf_bp = NULL;
                }
 
-               if (xfs_attr_is_leaf(dp)) {
-                       error = xfs_attr_leaf_try_add(args,
-                                                     attr->xattri_leaf_bp);
-                       if (error == -ENOSPC) {
-                               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.
-                                *
-                                * 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;
-                       }
-
-                       attr->xattri_dela_state = XFS_DAS_FOUND_LBLK;
-               } else {
-                       error = xfs_attr_node_addname_find_attr(attr);
-                       if (error)
-                               return error;
+               return xfs_attr_leaf_addname(attr);
 
-                       error = xfs_attr_node_addname(attr);
-                       if (error)
-                               return error;
-
-                       /*
-                        * 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))
-                               return 0;
-
-                       attr->xattri_dela_state = XFS_DAS_FOUND_NBLK;
-               }
-               trace_xfs_attr_set_iter_return(attr->xattri_dela_state,
-                                              args->dp);
-               return -EAGAIN;
        case XFS_DAS_FOUND_LBLK:
                /*
                 * If there was an out-of-line value, allocate the blocks we