xfs: move xfs_attr_defer_add to xfs_attr_item.c
authorDarrick J. Wong <djwong@kernel.org>
Mon, 22 Apr 2024 16:47:37 +0000 (09:47 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 23 Apr 2024 14:46:55 +0000 (07:46 -0700)
Move the code that adds the incore xfs_attr_item deferred work data to a
transaction live with the ATTRI log item code.  This means that the
upper level extended attribute code no longer has to know about the
inner workings of the ATTRI log items.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_attr.c
fs/xfs/xfs_attr_item.c
fs/xfs/xfs_attr_item.h

index 629fb25d149cf8f4a635b400d1a8a70ba4711573..50eab63ff3be13865b45617a5b3945e777762769 100644 (file)
@@ -901,37 +901,6 @@ xfs_attr_lookup(
        return error;
 }
 
-static void
-xfs_attr_defer_add(
-       struct xfs_da_args      *args,
-       unsigned int            op_flags)
-{
-
-       struct xfs_attr_intent  *new;
-
-       new = kmem_cache_zalloc(xfs_attr_intent_cache,
-                       GFP_KERNEL | __GFP_NOFAIL);
-       new->xattri_op_flags = op_flags;
-       new->xattri_da_args = args;
-
-       switch (op_flags) {
-       case XFS_ATTRI_OP_FLAGS_SET:
-               new->xattri_dela_state = xfs_attr_init_add_state(args);
-               break;
-       case XFS_ATTRI_OP_FLAGS_REPLACE:
-               new->xattri_dela_state = xfs_attr_init_replace_state(args);
-               break;
-       case XFS_ATTRI_OP_FLAGS_REMOVE:
-               new->xattri_dela_state = xfs_attr_init_remove_state(args);
-               break;
-       default:
-               ASSERT(0);
-       }
-
-       xfs_defer_add(args->trans, &new->xattri_list, &xfs_attr_defer_type);
-       trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp);
-}
-
 int
 xfs_attr_set(
        struct xfs_da_args      *args,
@@ -1021,14 +990,14 @@ xfs_attr_set(
        case -EEXIST:
                if (op == XFS_ATTRUPDATE_REMOVE) {
                        /* if no value, we are performing a remove operation */
-                       xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REMOVE);
+                       xfs_attr_defer_add(args, XFS_ATTR_DEFER_REMOVE);
                        break;
                }
 
                /* Pure create fails if the attr already exists */
                if (op == XFS_ATTRUPDATE_CREATE)
                        goto out_trans_cancel;
-               xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REPLACE);
+               xfs_attr_defer_add(args, XFS_ATTR_DEFER_REPLACE);
                break;
        case -ENOATTR:
                /* Can't remove what isn't there. */
@@ -1038,7 +1007,7 @@ xfs_attr_set(
                /* Pure replace fails if no existing attr to replace. */
                if (op == XFS_ATTRUPDATE_REPLACE)
                        goto out_trans_cancel;
-               xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_SET);
+               xfs_attr_defer_add(args, XFS_ATTR_DEFER_SET);
                break;
        default:
                goto out_trans_cancel;
index a65ac747976800a2457b5a50d6ed0bc641abe799..a7d6c9af47e888aa2fbfe36237ad105db8072e3a 100644 (file)
@@ -727,6 +727,36 @@ xfs_attr_create_done(
        return &attrdp->attrd_item;
 }
 
+void
+xfs_attr_defer_add(
+       struct xfs_da_args      *args,
+       enum xfs_attr_defer_op  op)
+{
+       struct xfs_attr_intent  *new;
+
+       new = kmem_cache_zalloc(xfs_attr_intent_cache,
+                       GFP_NOFS | __GFP_NOFAIL);
+       new->xattri_da_args = args;
+
+       switch (op) {
+       case XFS_ATTR_DEFER_SET:
+               new->xattri_op_flags = XFS_ATTRI_OP_FLAGS_SET;
+               new->xattri_dela_state = xfs_attr_init_add_state(args);
+               break;
+       case XFS_ATTR_DEFER_REPLACE:
+               new->xattri_op_flags = XFS_ATTRI_OP_FLAGS_REPLACE;
+               new->xattri_dela_state = xfs_attr_init_replace_state(args);
+               break;
+       case XFS_ATTR_DEFER_REMOVE:
+               new->xattri_op_flags = XFS_ATTRI_OP_FLAGS_REMOVE;
+               new->xattri_dela_state = xfs_attr_init_remove_state(args);
+               break;
+       }
+
+       xfs_defer_add(args->trans, &new->xattri_list, &xfs_attr_defer_type);
+       trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp);
+}
+
 const struct xfs_defer_op_type xfs_attr_defer_type = {
        .name           = "attr",
        .max_items      = 1,
index 3280a793028769ca01cddc92e61ba15a607ee632..c32b669b0e16adb584f40ee4b5c0ad1652ba328d 100644 (file)
@@ -51,4 +51,12 @@ struct xfs_attrd_log_item {
 extern struct kmem_cache       *xfs_attri_cache;
 extern struct kmem_cache       *xfs_attrd_cache;
 
+enum xfs_attr_defer_op {
+       XFS_ATTR_DEFER_SET,
+       XFS_ATTR_DEFER_REMOVE,
+       XFS_ATTR_DEFER_REPLACE,
+};
+
+void xfs_attr_defer_add(struct xfs_da_args *args, enum xfs_attr_defer_op op);
+
 #endif /* __XFS_ATTR_ITEM_H__ */