OSDN Git Service

xfs: Add helper function xfs_init_attr_trans
authorAllison Henderson <allison.henderson@oracle.com>
Wed, 11 May 2022 07:01:23 +0000 (17:01 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 11 May 2022 07:01:23 +0000 (17:01 +1000)
Quick helper function to collapse duplicate code to initialize
transactions for attributes

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Suggested-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_attr.c
fs/xfs/libxfs/xfs_attr.h
fs/xfs/xfs_attr_item.c

index af578ce..3a5f22e 100644 (file)
@@ -201,6 +201,28 @@ xfs_attr_calc_size(
        return nblks;
 }
 
+/* Initialize transaction reservation for attr operations */
+void
+xfs_init_attr_trans(
+       struct xfs_da_args      *args,
+       struct xfs_trans_res    *tres,
+       unsigned int            *total)
+{
+       struct xfs_mount        *mp = args->dp->i_mount;
+
+       if (args->value) {
+               tres->tr_logres = M_RES(mp)->tr_attrsetm.tr_logres +
+                                M_RES(mp)->tr_attrsetrt.tr_logres *
+                                args->total;
+               tres->tr_logcount = XFS_ATTRSET_LOG_COUNT;
+               tres->tr_logflags = XFS_TRANS_PERM_LOG_RES;
+               *total = args->total;
+       } else {
+               *tres = M_RES(mp)->tr_attrrm;
+               *total = XFS_ATTRRM_SPACE_RES(mp);
+       }
+}
+
 STATIC int
 xfs_attr_try_sf_addname(
        struct xfs_inode        *dp,
@@ -700,20 +722,10 @@ xfs_attr_set(
                                return error;
                }
 
-               tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres +
-                                M_RES(mp)->tr_attrsetrt.tr_logres *
-                                       args->total;
-               tres.tr_logcount = XFS_ATTRSET_LOG_COUNT;
-               tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
-               total = args->total;
-
                if (!local)
                        rmt_blks = xfs_attr3_rmt_blocks(mp, args->valuelen);
        } else {
                XFS_STATS_INC(mp, xs_attr_remove);
-
-               tres = M_RES(mp)->tr_attrrm;
-               total = XFS_ATTRRM_SPACE_RES(mp);
                rmt_blks = xfs_attr3_rmt_blocks(mp, XFS_XATTR_SIZE_MAX);
        }
 
@@ -727,6 +739,7 @@ xfs_attr_set(
         * Root fork attributes can use reserved data blocks for this
         * operation if necessary
         */
+       xfs_init_attr_trans(args, &tres, &total);
        error = xfs_trans_alloc_inode(dp, &tres, total, 0, rsvd, &args->trans);
        if (error)
                goto drop_incompat;
index 1ef58d3..f6c13d2 100644 (file)
@@ -519,6 +519,8 @@ int xfs_attr_set_iter(struct xfs_attr_item *attr);
 int xfs_attr_remove_iter(struct xfs_attr_item *attr);
 bool xfs_attr_namecheck(const void *name, size_t length);
 int xfs_attr_calc_size(struct xfs_da_args *args, int *local);
+void xfs_init_attr_trans(struct xfs_da_args *args, struct xfs_trans_res *tres,
+                        unsigned int *total);
 int xfs_attr_set_deferred(struct xfs_da_args *args);
 int xfs_attr_remove_deferred(struct xfs_da_args *args);
 
index 1a72fdf..676b1e0 100644 (file)
@@ -574,17 +574,9 @@ xfs_attri_item_recover(
                args->value = attrip->attri_value;
                args->valuelen = attrp->alfi_value_len;
                args->total = xfs_attr_calc_size(args, &local);
-
-               tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres +
-                                M_RES(mp)->tr_attrsetrt.tr_logres *
-                                       args->total;
-               tres.tr_logcount = XFS_ATTRSET_LOG_COUNT;
-               tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
-               total = args->total;
-       } else {
-               tres = M_RES(mp)->tr_attrrm;
-               total = XFS_ATTRRM_SPACE_RES(mp);
        }
+
+       xfs_init_attr_trans(args, &tres, &total);
        error = xfs_trans_alloc(mp, &tres, total, 0, XFS_TRANS_RESERVE, &tp);
        if (error)
                goto out;