xfs: move xfs_attr_use_log_assist usage out of libxfs
authorDarrick J. Wong <djwong@kernel.org>
Fri, 27 May 2022 00:34:04 +0000 (10:34 +1000)
committerDave Chinner <david@fromorbit.com>
Fri, 27 May 2022 00:34:04 +0000 (10:34 +1000)
The LARP patchset added an awkward coupling point between libxfs and
what would be libxlog, if the XFS log were actually its own library.
Move the code that sets up logged xattr updates out of libxfs and into
xfs_xattr.c so that libxfs no longer has to know about xlog_* functions.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_attr.c
fs/xfs/xfs_acl.c
fs/xfs/xfs_ioctl.c
fs/xfs/xfs_iops.c
fs/xfs/xfs_xattr.c
fs/xfs/xfs_xattr.h

index 24fa213715c11ae1861d6b7e18a2561473556e86..836ab1b8ed7b01d7487bcda57718165d42e3019d 100644 (file)
@@ -982,7 +982,6 @@ xfs_attr_set(
        int                     error, local;
        int                     rmt_blks = 0;
        unsigned int            total;
-       bool                    use_logging = xfs_has_larp(mp);
 
        if (xfs_is_shutdown(dp->i_mount))
                return -EIO;
@@ -1027,12 +1026,6 @@ xfs_attr_set(
                rmt_blks = xfs_attr3_rmt_blocks(mp, XFS_XATTR_SIZE_MAX);
        }
 
-       if (use_logging) {
-               error = xfs_attr_grab_log_assist(mp);
-               if (error)
-                       return error;
-       }
-
        /*
         * Root fork attributes can use reserved data blocks for this
         * operation if necessary
@@ -1040,7 +1033,7 @@ xfs_attr_set(
        xfs_init_attr_trans(args, &tres, &total);
        error = xfs_trans_alloc_inode(dp, &tres, total, 0, rsvd, &args->trans);
        if (error)
-               goto drop_incompat;
+               return error;
 
        if (args->value || xfs_inode_hasattr(dp)) {
                error = xfs_iext_count_may_overflow(dp, XFS_ATTR_FORK,
@@ -1100,9 +1093,6 @@ xfs_attr_set(
        error = xfs_trans_commit(args->trans);
 out_unlock:
        xfs_iunlock(dp, XFS_ILOCK_EXCL);
-drop_incompat:
-       if (use_logging)
-               xfs_attr_rele_log_assist(mp);
        return error;
 
 out_trans_cancel:
index 3df9c1782ead0f67be69548b3a830fe9ca2b7a32..b744c62052b667e1cde8112e0bd01b7bbd54e0d6 100644 (file)
@@ -17,6 +17,7 @@
 #include "xfs_error.h"
 #include "xfs_acl.h"
 #include "xfs_trans.h"
+#include "xfs_xattr.h"
 
 #include <linux/posix_acl_xattr.h>
 
@@ -202,7 +203,7 @@ __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
                xfs_acl_to_disk(args.value, acl);
        }
 
-       error = xfs_attr_set(&args);
+       error = xfs_attr_change(&args);
        kmem_free(args.value);
 
        /*
index 0e5cb7936206d6f972e0fa11025ee8761c5899a8..5a364a7d58fdde24b49383a373d4f1bce20a3692 100644 (file)
@@ -37,6 +37,7 @@
 #include "xfs_health.h"
 #include "xfs_reflink.h"
 #include "xfs_ioctl.h"
+#include "xfs_xattr.h"
 
 #include <linux/mount.h>
 #include <linux/namei.h>
@@ -524,7 +525,7 @@ xfs_attrmulti_attr_set(
                args.valuelen = len;
        }
 
-       error = xfs_attr_set(&args);
+       error = xfs_attr_change(&args);
        if (!error && (flags & XFS_IOC_ATTR_ROOT))
                xfs_forget_acl(inode, name);
        kfree(args.value);
index e912b7fee714b28fe748ade1c5dc78584f4e8d0d..29f5b8b8aca69a0887fae8f961b208fcf308638e 100644 (file)
@@ -24,6 +24,7 @@
 #include "xfs_iomap.h"
 #include "xfs_error.h"
 #include "xfs_ioctl.h"
+#include "xfs_xattr.h"
 
 #include <linux/posix_acl.h>
 #include <linux/security.h>
@@ -61,7 +62,7 @@ xfs_initxattrs(
                        .value          = xattr->value,
                        .valuelen       = xattr->value_len,
                };
-               error = xfs_attr_set(&args);
+               error = xfs_attr_change(&args);
                if (error < 0)
                        break;
        }
index fc6acf7021a78414757193a9861a178aec078926..35e13e125ec6a8ecb85b1c62c497635127ac1888 100644 (file)
@@ -27,7 +27,7 @@
  * they must release the permission by calling xlog_drop_incompat_feat
  * when they're done.
  */
-int
+static inline int
 xfs_attr_grab_log_assist(
        struct xfs_mount        *mp)
 {
@@ -61,13 +61,41 @@ drop_incompat:
        return error;
 }
 
-void
+static inline void
 xfs_attr_rele_log_assist(
        struct xfs_mount        *mp)
 {
        xlog_drop_incompat_feat(mp->m_log);
 }
 
+/*
+ * Set or remove an xattr, having grabbed the appropriate logging resources
+ * prior to calling libxfs.
+ */
+int
+xfs_attr_change(
+       struct xfs_da_args      *args)
+{
+       struct xfs_mount        *mp = args->dp->i_mount;
+       bool                    use_logging = false;
+       int                     error;
+
+       if (xfs_has_larp(mp)) {
+               error = xfs_attr_grab_log_assist(mp);
+               if (error)
+                       return error;
+
+               use_logging = true;
+       }
+
+       error = xfs_attr_set(args);
+
+       if (use_logging)
+               xfs_attr_rele_log_assist(mp);
+       return error;
+}
+
+
 static int
 xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused,
                struct inode *inode, const char *name, void *value, size_t size)
@@ -105,7 +133,7 @@ xfs_xattr_set(const struct xattr_handler *handler,
        };
        int                     error;
 
-       error = xfs_attr_set(&args);
+       error = xfs_attr_change(&args);
        if (!error && (handler->flags & XFS_ATTR_ROOT))
                xfs_forget_acl(inode, name);
        return error;
index d34ef183554108305c19efc339c1a5684dc7e6f2..2b09133b1b9b291a78b1d35b59d5ea4a1287e9f3 100644 (file)
@@ -6,8 +6,7 @@
 #ifndef __XFS_XATTR_H__
 #define __XFS_XATTR_H__
 
-int xfs_attr_grab_log_assist(struct xfs_mount *mp);
-void xfs_attr_rele_log_assist(struct xfs_mount *mp);
+int xfs_attr_change(struct xfs_da_args *args);
 
 extern const struct xattr_handler *xfs_xattr_handlers[];