OSDN Git Service

xfs: improve xfs_forget_acl
authorChristoph Hellwig <hch@lst.de>
Thu, 27 Feb 2020 01:30:41 +0000 (17:30 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 3 Mar 2020 04:55:55 +0000 (20:55 -0800)
Move the function to xfs_acl.c and provide a proper stub for the
!CONFIG_XFS_POSIX_ACL case.  Lift the flags check to the caller as it
nicely fits in there.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_acl.c
fs/xfs/xfs_acl.h
fs/xfs/xfs_ioctl.c
fs/xfs/xfs_xattr.c

index 52b9929..a06927d 100644 (file)
@@ -270,3 +270,19 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 
        return error;
 }
+
+/*
+ * Invalidate any cached ACLs if the user has bypassed the ACL interface.
+ * We don't validate the content whatsoever so it is caller responsibility to
+ * provide data in valid format and ensure i_mode is consistent.
+ */
+void
+xfs_forget_acl(
+       struct inode            *inode,
+       const char              *name)
+{
+       if (!strcmp(name, SGI_ACL_FILE))
+               forget_cached_acl(inode, ACL_TYPE_ACCESS);
+       else if (!strcmp(name, SGI_ACL_DEFAULT))
+               forget_cached_acl(inode, ACL_TYPE_DEFAULT);
+}
index 94615e3..c042c08 100644 (file)
@@ -13,14 +13,16 @@ struct posix_acl;
 extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
 extern int xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
 extern int __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
+void xfs_forget_acl(struct inode *inode, const char *name);
 #else
 static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type)
 {
        return NULL;
 }
 # define xfs_set_acl                                   NULL
+static inline void xfs_forget_acl(struct inode *inode, const char *name)
+{
+}
 #endif /* CONFIG_XFS_POSIX_ACL */
 
-extern void xfs_forget_acl(struct inode *inode, const char *name, int xflags);
-
 #endif /* __XFS_ACL_H__ */
index 2a7d059..a3cd178 100644 (file)
@@ -510,8 +510,8 @@ xfs_attrmulti_attr_set(
        }
 
        error = xfs_attr_set(&args);
-       if (!error)
-               xfs_forget_acl(inode, name, flags);
+       if (!error && (flags & ATTR_ROOT))
+               xfs_forget_acl(inode, name);
        kfree(args.value);
        return error;
 }
index 2602875..6e149fe 100644 (file)
@@ -39,28 +39,6 @@ xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused,
        return args.valuelen;
 }
 
-void
-xfs_forget_acl(
-       struct inode            *inode,
-       const char              *name,
-       int                     xflags)
-{
-       /*
-        * Invalidate any cached ACLs if the user has bypassed the ACL
-        * interface. We don't validate the content whatsoever so it is caller
-        * responsibility to provide data in valid format and ensure i_mode is
-        * consistent.
-        */
-       if (xflags & ATTR_ROOT) {
-#ifdef CONFIG_XFS_POSIX_ACL
-               if (!strcmp(name, SGI_ACL_FILE))
-                       forget_cached_acl(inode, ACL_TYPE_ACCESS);
-               else if (!strcmp(name, SGI_ACL_DEFAULT))
-                       forget_cached_acl(inode, ACL_TYPE_DEFAULT);
-#endif
-       }
-}
-
 static int
 xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused,
                struct inode *inode, const char *name, const void *value,
@@ -83,8 +61,8 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused,
                args.flags |= ATTR_REPLACE;
 
        error = xfs_attr_set(&args);
-       if (!error)
-               xfs_forget_acl(inode, name, args.flags);
+       if (!error && (handler->flags & ATTR_ROOT))
+               xfs_forget_acl(inode, name);
        return error;
 }