From 3779913b35634d9d34ac9eb709203275b28050c2 Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Tue, 1 Nov 2016 17:19:52 -0700 Subject: [PATCH] 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 --- config/kernel-acl.m4 | 31 ++++++++++++++++++++++++++++++- config/kernel.m4 | 3 ++- 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 50b502c314..9495837627 100644 --- a/config/kernel-acl.m4 +++ b/config/kernel-acl.m4 @@ -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 + #include + #include + #include + + 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 diff --git a/config/kernel.m4 b/config/kernel.m4 index 15e2ef351c..8e1f10ec39 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 6ed5075a38..7a1cb967b9 100644 --- a/include/linux/vfs_compat.h +++ b/include/linux/vfs_compat.h @@ -205,13 +205,8 @@ lseek_execute( #include #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