xfs: Refactor xfs_attr_set_shortform
authorAllison Henderson <allison.henderson@oracle.com>
Thu, 18 Feb 2021 08:09:18 +0000 (01:09 -0700)
committerAllison Henderson <allison.henderson@oracle.com>
Tue, 1 Jun 2021 17:49:42 +0000 (10:49 -0700)
This patch is actually the combination of patches from the previous
version (v18).  Initially patch 3 hoisted xfs_attr_set_shortform, and
the next added the helper xfs_attr_set_fmt. xfs_attr_set_fmt is similar
the old xfs_attr_set_shortform. It returns 0 when the attr has been set
and no further action is needed. It returns -EAGAIN when shortform has
been transformed to leaf, and the calling function should proceed the
set the attr in leaf form.

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>
fs/xfs/libxfs/xfs_attr.c

index 8a08d5b..0ec1547 100644 (file)
@@ -236,16 +236,11 @@ xfs_attr_is_shortform(
                ip->i_afp->if_nextents == 0);
 }
 
-/*
- * Attempts to set an attr in shortform, or converts short form to leaf form if
- * there is not enough room.  If the attr is set, the transaction is committed
- * and set to NULL.
- */
 STATIC int
-xfs_attr_set_shortform(
-       struct xfs_da_args      *args,
-       struct xfs_buf          **leaf_bp)
+xfs_attr_set_fmt(
+       struct xfs_da_args      *args)
 {
+       struct xfs_buf          *leaf_bp = NULL;
        struct xfs_inode        *dp = args->dp;
        int                     error, error2 = 0;
 
@@ -258,29 +253,29 @@ xfs_attr_set_shortform(
                args->trans = NULL;
                return error ? error : error2;
        }
+
        /*
         * It won't fit in the shortform, transform to a leaf block.  GROT:
         * another possible req'mt for a double-split btree op.
         */
-       error = xfs_attr_shortform_to_leaf(args, leaf_bp);
+       error = xfs_attr_shortform_to_leaf(args, &leaf_bp);
        if (error)
                return error;
 
        /*
         * Prevent the leaf buffer from being unlocked so that a concurrent AIL
         * push cannot grab the half-baked leaf buffer and run into problems
-        * with the write verifier. Once we're done rolling the transaction we
-        * can release the hold and add the attr to the leaf.
+        * with the write verifier.
         */
-       xfs_trans_bhold(args->trans, *leaf_bp);
+       xfs_trans_bhold(args->trans, leaf_bp);
        error = xfs_defer_finish(&args->trans);
-       xfs_trans_bhold_release(args->trans, *leaf_bp);
+       xfs_trans_bhold_release(args->trans, leaf_bp);
        if (error) {
-               xfs_trans_brelse(args->trans, *leaf_bp);
+               xfs_trans_brelse(args->trans, leaf_bp);
                return error;
        }
 
-       return 0;
+       return -EAGAIN;
 }
 
 /*
@@ -291,8 +286,7 @@ xfs_attr_set_args(
        struct xfs_da_args      *args)
 {
        struct xfs_inode        *dp = args->dp;
-       struct xfs_buf          *leaf_bp = NULL;
-       int                     error = 0;
+       int                     error;
 
        /*
         * If the attribute list is already in leaf format, jump straight to
@@ -301,15 +295,8 @@ xfs_attr_set_args(
         * again.
         */
        if (xfs_attr_is_shortform(dp)) {
-
-               /*
-                * If the attr was successfully set in shortform, the
-                * transaction is committed and set to NULL.  Otherwise, is it
-                * converted from shortform to leaf, and the transaction is
-                * retained.
-                */
-               error = xfs_attr_set_shortform(args, &leaf_bp);
-               if (error || !args->trans)
+               error = xfs_attr_set_fmt(args);
+               if (error != -EAGAIN)
                        return error;
        }
 
@@ -344,8 +331,7 @@ xfs_attr_set_args(
                        return error;
        }
 
-       error = xfs_attr_node_addname(args);
-       return error;
+       return xfs_attr_node_addname(args);
 }
 
 /*