]> granicus.if.org Git - zfs/commitdiff
Use set_cached_acl and forget_cached_acl when possible
authorChunwei Chen <david.chen@osnexus.com>
Wed, 2 Nov 2016 00:19:52 +0000 (17:19 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 7 Nov 2016 19:04:44 +0000 (11:04 -0800)
Originally, these two function are inline, so their usability is tied to
posix_acl_release. However, since Linux 3.14, they became EXPORT_SYMBOL, so we
can always use them. In this patch, we create an independent test for these
two functions so we can use them when possible.

Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
config/kernel-acl.m4
config/kernel.m4
include/linux/vfs_compat.h

index 50b502c31416dfdfd5d1f5ee51487e0fed482a4e..949583762709c090595adb0642174888d6d7d7e7 100644 (file)
@@ -40,6 +40,35 @@ AC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_RELEASE], [
        ])
 ])
 
+dnl #
+dnl # 3.14 API change,
+dnl # set_cached_acl() and forget_cached_acl() changed from inline to
+dnl # EXPORT_SYMBOL. In the former case, they may not be usable because of
+dnl # posix_acl_release. In the latter case, we can always use them.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SET_CACHED_ACL_USABLE], [
+       AC_MSG_CHECKING([whether set_cached_acl() is usable])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/module.h>
+               #include <linux/cred.h>
+               #include <linux/fs.h>
+               #include <linux/posix_acl.h>
+
+               MODULE_LICENSE("$ZFS_META_LICENSE");
+       ],[
+               struct inode *ip = NULL;
+               struct posix_acl *acl = posix_acl_alloc(1, 0);
+               set_cached_acl(ip, 0, acl);
+               forget_cached_acl(ip, 0);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_SET_CACHED_ACL_USABLE, 1,
+                   [posix_acl_release() is usable])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
 dnl #
 dnl # 3.1 API change,
 dnl # posix_acl_chmod_masq() is not exported anymore and posix_acl_chmod()
@@ -256,7 +285,7 @@ dnl # The kernel get_acl will now check cache before calling i_op->get_acl and
 dnl # do set_cached_acl after that, so i_op->get_acl don't need to do that
 dnl # anymore.
 dnl #
-AC_DEFUN([ZFS_AC_KERNE_GET_ACL_HANDLE_CACHE], [
+AC_DEFUN([ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE], [
        AC_MSG_CHECKING([whether uncached_acl_sentinel() exists])
        ZFS_LINUX_TRY_COMPILE([
                #include <linux/fs.h>
index 15e2ef351cb21070cca956ceea1218eb52e29e3b..8e1f10ec3996b8f358be1122b9e1e8ad8a36d621 100644 (file)
@@ -46,6 +46,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE
        ZFS_AC_KERNEL_POSIX_ACL_FROM_XATTR_USERNS
        ZFS_AC_KERNEL_POSIX_ACL_RELEASE
+       ZFS_AC_KERNEL_SET_CACHED_ACL_USABLE
        ZFS_AC_KERNEL_POSIX_ACL_CHMOD
        ZFS_AC_KERNEL_POSIX_ACL_EQUIV_MODE_WANTS_UMODE_T
        ZFS_AC_KERNEL_POSIX_ACL_VALID_WITH_NS
@@ -54,7 +55,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_INODE_OPERATIONS_CHECK_ACL
        ZFS_AC_KERNEL_INODE_OPERATIONS_CHECK_ACL_WITH_FLAGS
        ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL
-       ZFS_AC_KERNE_GET_ACL_HANDLE_CACHE
+       ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
        ZFS_AC_KERNEL_SHOW_OPTIONS
        ZFS_AC_KERNEL_FILE_INODE
        ZFS_AC_KERNEL_FILE_DENTRY
index 6ed5075a38c8b7519dbe26c9a6b04ddfd52b9a5d..7a1cb967b96c57a056d2fb959101684c84b9061a 100644 (file)
@@ -205,13 +205,8 @@ lseek_execute(
 #include <linux/posix_acl.h>
 
 #if defined(HAVE_POSIX_ACL_RELEASE) && !defined(HAVE_POSIX_ACL_RELEASE_GPL_ONLY)
-
 #define        zpl_posix_acl_release(arg)              posix_acl_release(arg)
-#define        zpl_set_cached_acl(ip, ty, n)           set_cached_acl(ip, ty, n)
-#define        zpl_forget_cached_acl(ip, ty)           forget_cached_acl(ip, ty)
-
 #else
-
 void zpl_posix_acl_release_impl(struct posix_acl *);
 
 static inline void
@@ -223,7 +218,12 @@ zpl_posix_acl_release(struct posix_acl *acl)
        if (atomic_dec_and_test(&acl->a_refcount))
                zpl_posix_acl_release_impl(acl);
 }
+#endif /* HAVE_POSIX_ACL_RELEASE */
 
+#ifdef HAVE_SET_CACHED_ACL_USABLE
+#define        zpl_set_cached_acl(ip, ty, n)           set_cached_acl(ip, ty, n)
+#define        zpl_forget_cached_acl(ip, ty)           forget_cached_acl(ip, ty)
+#else
 static inline void
 zpl_set_cached_acl(struct inode *ip, int type, struct posix_acl *newer) {
        struct posix_acl *older = NULL;
@@ -253,7 +253,7 @@ static inline void
 zpl_forget_cached_acl(struct inode *ip, int type) {
        zpl_set_cached_acl(ip, type, (struct posix_acl *)ACL_NOT_CACHED);
 }
-#endif /* HAVE_POSIX_ACL_RELEASE */
+#endif /* HAVE_SET_CACHED_ACL_USABLE */
 
 #ifndef HAVE___POSIX_ACL_CHMOD
 #ifdef HAVE_POSIX_ACL_CHMOD