]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: Hoist node transaction handling
authorAllison Henderson <allison.henderson@oracle.com>
Fri, 15 Oct 2021 20:28:25 +0000 (16:28 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 15 Oct 2021 20:28:25 +0000 (16:28 -0400)
Source kernel commit: 3f562d092bb1edd39bfc0e6808d7108d47f8aa3a

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: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_attr.c

index 9dc518a3519a1325af58f43381a10175f2f3712a..118ec0b430e1246ea1d5f7758b637d42e2a04065 100644 (file)
@@ -309,10 +309,36 @@ xfs_attr_set_args(
 
        if (xfs_attr_is_leaf(dp)) {
                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;
-               else if (error)
+               } else if (error) {
                        return error;
+               }
 
                /*
                 * 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 */
 
                return error;
+       }
 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 {
                error = xfs_attr_node_addname_find_attr(args, &state);