diff options
author | Chunwei Chen <[email protected]> | 2016-11-01 17:19:52 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-11-07 11:04:44 -0800 |
commit | 3779913b35634d9d34ac9eb709203275b28050c2 (patch) | |
tree | a30b6a62a918bc460e0f256ce1b673f98f24901b | |
parent | 8e71ab99dc4a591d41ab0d9255ddca3e914f47e4 (diff) |
Use set_cached_acl and forget_cached_acl when possible
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 <[email protected]>
-rw-r--r-- | config/kernel-acl.m4 | 31 | ||||
-rw-r--r-- | config/kernel.m4 | 3 | ||||
-rw-r--r-- | include/linux/vfs_compat.h | 12 |
3 files changed, 38 insertions, 8 deletions
diff --git a/config/kernel-acl.m4 b/config/kernel-acl.m4 index 50b502c31..949583762 100644 --- a/config/kernel-acl.m4 +++ b/config/kernel-acl.m4 @@ -41,6 +41,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() dnl # was introduced to replace it. @@ -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> diff --git a/config/kernel.m4 b/config/kernel.m4 index 15e2ef351..8e1f10ec3 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -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 diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h index 6ed5075a3..7a1cb967b 100644 --- a/include/linux/vfs_compat.h +++ b/include/linux/vfs_compat.h @@ -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 |