xfs: Add helper function xfs_attr_node_shrink
authorAllison Collins <allison.henderson@oracle.com>
Tue, 21 Jul 2020 04:47:27 +0000 (21:47 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 29 Jul 2020 03:28:12 +0000 (20:28 -0700)
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>
fs/xfs/libxfs/xfs_attr.c

index 2379d5b1a1b91d2e91f597103feea2e4b459daea..b576f46d1d75e1c0de0f5129a3339e01f97209c2 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)