]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: Add helper function xfs_attr_node_shrink
authorAllison Collins <allison.henderson@oracle.com>
Tue, 15 Sep 2020 19:59:37 +0000 (15:59 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Tue, 15 Sep 2020 19:59:37 +0000 (15:59 -0400)
Source kernel commit: 3f6e011ee2bfcf5b70c5f8978673cd0e5bc64a33

This patch adds a new helper function xfs_attr_node_shrink used to
shrink an attr name into an inode if it is small enough.  This helps to
modularize the greater calling function xfs_attr_node_removename.

Signed-off-by: Allison Collins <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Acked-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_attr.c

index 81bea61484b9eb31308b9010f4caad1990dd2503..760948c1410b3f9f96f534f56b6f7fe1aafa92b0 100644 (file)
@@ -1102,6 +1102,45 @@ out:
        return retval;
 }
 
+/*
+ * Shrink an attribute from leaf to shortform
+ */
+STATIC int
+xfs_attr_node_shrink(
+       struct xfs_da_args      *args,
+       struct xfs_da_state     *state)
+{
+       struct xfs_inode        *dp = args->dp;
+       int                     error, forkoff;
+       struct xfs_buf          *bp;
+
+       /*
+        * Have to get rid of the copy of this dabuf in the state.
+        */
+       ASSERT(state->path.active == 1);
+       ASSERT(state->path.blk[0].bp);
+       state->path.blk[0].bp = NULL;
+
+       error = xfs_attr3_leaf_read(args->trans, args->dp, 0, &bp);
+       if (error)
+               return error;
+
+       forkoff = xfs_attr_shortform_allfit(bp, dp);
+       if (forkoff) {
+               error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
+               /* bp is gone due to xfs_da_shrink_inode */
+               if (error)
+                       return error;
+
+               error = xfs_defer_finish(&args->trans);
+               if (error)
+                       return error;
+       } else
+               xfs_trans_brelse(args->trans, bp);
+
+       return 0;
+}
+
 /*
  * Remove a name from a B-tree attribute list.
  *
@@ -1115,8 +1154,7 @@ xfs_attr_node_removename(
 {
        struct xfs_da_state     *state;
        struct xfs_da_state_blk *blk;
-       struct xfs_buf          *bp;
-       int                     retval, error, forkoff;
+       int                     retval, error;
        struct xfs_inode        *dp = args->dp;
 
        trace_xfs_attr_node_removename(args);
@@ -1201,30 +1239,8 @@ xfs_attr_node_removename(
        /*
         * If the result is small enough, push it all into the inode.
         */
-       if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) {
-               /*
-                * Have to get rid of the copy of this dabuf in the state.
-                */
-               ASSERT(state->path.active == 1);
-               ASSERT(state->path.blk[0].bp);
-               state->path.blk[0].bp = NULL;
-
-               error = xfs_attr3_leaf_read(args->trans, args->dp, 0, &bp);
-               if (error)
-                       goto out;
-
-               if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
-                       error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
-                       /* bp is gone due to xfs_da_shrink_inode */
-                       if (error)
-                               goto out;
-                       error = xfs_defer_finish(&args->trans);
-                       if (error)
-                               goto out;
-               } else
-                       xfs_trans_brelse(args->trans, bp);
-       }
-       error = 0;
+       if (xfs_bmap_one_block(dp, XFS_ATTR_FORK))
+               error = xfs_attr_node_shrink(args, state);
 
 out:
        if (state)