]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - libxfs/xfs_attr.c
xfs: remove unnecessary dfops init calls in xattr code
[thirdparty/xfsprogs-dev.git] / libxfs / xfs_attr.c
index 452244723078b04380a8732c7030a1042d9753de..c14e8a346fcea41da713123b422b54fed027af58 100644 (file)
@@ -1,19 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
  * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 #include "libxfs_priv.h"
 #include "xfs_fs.h"
@@ -209,9 +197,7 @@ xfs_attr_set(
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_buf          *leaf_bp = NULL;
        struct xfs_da_args      args;
-       struct xfs_defer_ops    dfops;
        struct xfs_trans_res    tres;
-       xfs_fsblock_t           firstblock;
        int                     rsvd = (flags & ATTR_ROOT) != 0;
        int                     error, err2, local;
 
@@ -226,12 +212,10 @@ xfs_attr_set(
 
        args.value = value;
        args.valuelen = valuelen;
-       args.firstblock = &firstblock;
-       args.dfops = &dfops;
        args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
        args.total = xfs_attr_calc_size(&args, &local);
 
-       error = xfs_qm_dqattach(dp, 0);
+       error = xfs_qm_dqattach(dp);
        if (error)
                return error;
 
@@ -322,21 +306,20 @@ xfs_attr_set(
                 * It won't fit in the shortform, transform to a leaf block.
                 * GROT: another possible req'mt for a double-split btree op.
                 */
-               xfs_defer_init(args.dfops, args.firstblock);
                error = xfs_attr_shortform_to_leaf(&args, &leaf_bp);
                if (error)
-                       goto out_defer_cancel;
+                       goto out;
                /*
                 * 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.
                 */
                xfs_trans_bhold(args.trans, leaf_bp);
-               xfs_defer_bjoin(args.dfops, leaf_bp);
-               xfs_defer_ijoin(args.dfops, dp);
-               error = xfs_defer_finish(&args.trans, args.dfops);
+               xfs_defer_bjoin(args.trans->t_dfops, leaf_bp);
+               xfs_defer_ijoin(args.trans->t_dfops, dp);
+               error = xfs_defer_finish(&args.trans, args.trans->t_dfops);
                if (error)
-                       goto out_defer_cancel;
+                       goto out;
 
                /*
                 * Commit the leaf transformation.  We'll need another (linked)
@@ -376,8 +359,6 @@ xfs_attr_set(
 
        return error;
 
-out_defer_cancel:
-       xfs_defer_cancel(&dfops);
 out:
        if (leaf_bp)
                xfs_trans_brelse(args.trans, leaf_bp);
@@ -399,8 +380,6 @@ xfs_attr_remove(
 {
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_da_args      args;
-       struct xfs_defer_ops    dfops;
-       xfs_fsblock_t           firstblock;
        int                     error;
 
        XFS_STATS_INC(mp, xs_attr_remove);
@@ -412,9 +391,6 @@ xfs_attr_remove(
        if (error)
                return error;
 
-       args.firstblock = &firstblock;
-       args.dfops = &dfops;
-
        /*
         * we have no control over the attribute names that userspace passes us
         * to remove, so we have to allow the name lookup prior to attribute
@@ -422,7 +398,7 @@ xfs_attr_remove(
         */
        args.op_flags = XFS_DA_OP_OKNOENT;
 
-       error = xfs_qm_dqattach(dp, 0);
+       error = xfs_qm_dqattach(dp);
        if (error)
                return error;
 
@@ -506,7 +482,14 @@ xfs_attr_shortform_addname(xfs_da_args_t *args)
                if (args->flags & ATTR_CREATE)
                        return retval;
                retval = xfs_attr_shortform_remove(args);
-               ASSERT(retval == 0);
+               if (retval)
+                       return retval;
+               /*
+                * Since we have removed the old attr, clear ATTR_REPLACE so
+                * that the leaf format add routine won't trip over the attr
+                * not being around.
+                */
+               args->flags &= ~ATTR_REPLACE;
        }
 
        if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX ||
@@ -536,11 +519,12 @@ xfs_attr_shortform_addname(xfs_da_args_t *args)
  * if bmap_one_block() says there is only one block (ie: no remote blks).
  */
 STATIC int
-xfs_attr_leaf_addname(xfs_da_args_t *args)
+xfs_attr_leaf_addname(
+       struct xfs_da_args      *args)
 {
-       xfs_inode_t *dp;
-       struct xfs_buf *bp;
-       int retval, error, forkoff;
+       struct xfs_inode        *dp;
+       struct xfs_buf          *bp;
+       int                     retval, error, forkoff;
 
        trace_xfs_attr_leaf_addname(args);
 
@@ -598,12 +582,11 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
                 * Commit that transaction so that the node_addname() call
                 * can manage its own transactions.
                 */
-               xfs_defer_init(args->dfops, args->firstblock);
                error = xfs_attr3_leaf_to_node(args);
                if (error)
                        goto out_defer_cancel;
-               xfs_defer_ijoin(args->dfops, dp);
-               error = xfs_defer_finish(&args->trans, args->dfops);
+               xfs_defer_ijoin(args->trans->t_dfops, dp);
+               error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                if (error)
                        goto out_defer_cancel;
 
@@ -687,13 +670,12 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
                 * If the result is small enough, shrink it all into the inode.
                 */
                if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
-                       xfs_defer_init(args->dfops, args->firstblock);
                        error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
                        /* bp is gone due to xfs_da_shrink_inode */
                        if (error)
                                goto out_defer_cancel;
-                       xfs_defer_ijoin(args->dfops, dp);
-                       error = xfs_defer_finish(&args->trans, args->dfops);
+                       xfs_defer_ijoin(args->trans->t_dfops, dp);
+                       error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                        if (error)
                                goto out_defer_cancel;
                }
@@ -711,8 +693,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
        }
        return error;
 out_defer_cancel:
-       xfs_defer_cancel(args->dfops);
-       args->trans = NULL;
+       xfs_defer_cancel(args->trans->t_dfops);
        return error;
 }
 
@@ -723,11 +704,12 @@ out_defer_cancel:
  * if bmap_one_block() says there is only one block (ie: no remote blks).
  */
 STATIC int
-xfs_attr_leaf_removename(xfs_da_args_t *args)
+xfs_attr_leaf_removename(
+       struct xfs_da_args      *args)
 {
-       xfs_inode_t *dp;
-       struct xfs_buf *bp;
-       int error, forkoff;
+       struct xfs_inode        *dp;
+       struct xfs_buf          *bp;
+       int                     error, forkoff;
 
        trace_xfs_attr_leaf_removename(args);
 
@@ -752,20 +734,18 @@ xfs_attr_leaf_removename(xfs_da_args_t *args)
         * If the result is small enough, shrink it all into the inode.
         */
        if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
-               xfs_defer_init(args->dfops, args->firstblock);
                error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
                /* bp is gone due to xfs_da_shrink_inode */
                if (error)
                        goto out_defer_cancel;
-               xfs_defer_ijoin(args->dfops, dp);
-               error = xfs_defer_finish(&args->trans, args->dfops);
+               xfs_defer_ijoin(args->trans->t_dfops, dp);
+               error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                if (error)
                        goto out_defer_cancel;
        }
        return 0;
 out_defer_cancel:
-       xfs_defer_cancel(args->dfops);
-       args->trans = NULL;
+       xfs_defer_cancel(args->trans->t_dfops);
        return error;
 }
 
@@ -816,13 +796,14 @@ xfs_attr_leaf_get(xfs_da_args_t *args)
  * add a whole extra layer of confusion on top of that.
  */
 STATIC int
-xfs_attr_node_addname(xfs_da_args_t *args)
+xfs_attr_node_addname(
+       struct xfs_da_args      *args)
 {
-       xfs_da_state_t *state;
-       xfs_da_state_blk_t *blk;
-       xfs_inode_t *dp;
-       xfs_mount_t *mp;
-       int retval, error;
+       struct xfs_da_state     *state;
+       struct xfs_da_state_blk *blk;
+       struct xfs_inode        *dp;
+       struct xfs_mount        *mp;
+       int                     retval, error;
 
        trace_xfs_attr_node_addname(args);
 
@@ -881,12 +862,12 @@ restart:
                         */
                        xfs_da_state_free(state);
                        state = NULL;
-                       xfs_defer_init(args->dfops, args->firstblock);
                        error = xfs_attr3_leaf_to_node(args);
                        if (error)
                                goto out_defer_cancel;
-                       xfs_defer_ijoin(args->dfops, dp);
-                       error = xfs_defer_finish(&args->trans, args->dfops);
+                       xfs_defer_ijoin(args->trans->t_dfops, dp);
+                       error = xfs_defer_finish(&args->trans,
+                                                args->trans->t_dfops);
                        if (error)
                                goto out_defer_cancel;
 
@@ -907,12 +888,11 @@ restart:
                 * in the index/blkno/rmtblkno/rmtblkcnt fields and
                 * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields.
                 */
-               xfs_defer_init(args->dfops, args->firstblock);
                error = xfs_da3_split(state);
                if (error)
                        goto out_defer_cancel;
-               xfs_defer_ijoin(args->dfops, dp);
-               error = xfs_defer_finish(&args->trans, args->dfops);
+               xfs_defer_ijoin(args->trans->t_dfops, dp);
+               error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                if (error)
                        goto out_defer_cancel;
        } else {
@@ -1005,12 +985,11 @@ restart:
                 * Check to see if the tree needs to be collapsed.
                 */
                if (retval && (state->path.active > 1)) {
-                       xfs_defer_init(args->dfops, args->firstblock);
                        error = xfs_da3_join(state);
                        if (error)
                                goto out_defer_cancel;
-                       xfs_defer_ijoin(args->dfops, dp);
-                       error = xfs_defer_finish(&args->trans, args->dfops);
+                       xfs_defer_ijoin(args->trans->t_dfops, dp);
+                       error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                        if (error)
                                goto out_defer_cancel;
                }
@@ -1039,8 +1018,7 @@ out:
                return error;
        return retval;
 out_defer_cancel:
-       xfs_defer_cancel(args->dfops);
-       args->trans = NULL;
+       xfs_defer_cancel(args->trans->t_dfops);
        goto out;
 }
 
@@ -1052,13 +1030,14 @@ out_defer_cancel:
  * the root node (a special case of an intermediate node).
  */
 STATIC int
-xfs_attr_node_removename(xfs_da_args_t *args)
+xfs_attr_node_removename(
+       struct xfs_da_args      *args)
 {
-       xfs_da_state_t *state;
-       xfs_da_state_blk_t *blk;
-       xfs_inode_t *dp;
-       struct xfs_buf *bp;
-       int retval, error, forkoff;
+       struct xfs_da_state     *state;
+       struct xfs_da_state_blk *blk;
+       struct xfs_inode        *dp;
+       struct xfs_buf          *bp;
+       int                     retval, error, forkoff;
 
        trace_xfs_attr_node_removename(args);
 
@@ -1130,12 +1109,11 @@ xfs_attr_node_removename(xfs_da_args_t *args)
         * Check to see if the tree needs to be collapsed.
         */
        if (retval && (state->path.active > 1)) {
-               xfs_defer_init(args->dfops, args->firstblock);
                error = xfs_da3_join(state);
                if (error)
                        goto out_defer_cancel;
-               xfs_defer_ijoin(args->dfops, dp);
-               error = xfs_defer_finish(&args->trans, args->dfops);
+               xfs_defer_ijoin(args->trans->t_dfops, dp);
+               error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                if (error)
                        goto out_defer_cancel;
                /*
@@ -1162,13 +1140,12 @@ xfs_attr_node_removename(xfs_da_args_t *args)
                        goto out;
 
                if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
-                       xfs_defer_init(args->dfops, args->firstblock);
                        error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
                        /* bp is gone due to xfs_da_shrink_inode */
                        if (error)
                                goto out_defer_cancel;
-                       xfs_defer_ijoin(args->dfops, dp);
-                       error = xfs_defer_finish(&args->trans, args->dfops);
+                       xfs_defer_ijoin(args->trans->t_dfops, dp);
+                       error = xfs_defer_finish(&args->trans, args->trans->t_dfops);
                        if (error)
                                goto out_defer_cancel;
                } else
@@ -1180,8 +1157,7 @@ out:
        xfs_da_state_free(state);
        return error;
 out_defer_cancel:
-       xfs_defer_cancel(args->dfops);
-       args->trans = NULL;
+       xfs_defer_cancel(args->trans->t_dfops);
        goto out;
 }