]> granicus.if.org Git - zfs/commitdiff
Linux 4.16 compat: use correct *_dec_and_test()
authorTony Hutter <hutter2@llnl.gov>
Thu, 22 Feb 2018 17:02:06 +0000 (09:02 -0800)
committerTony Hutter <hutter2@llnl.gov>
Wed, 14 Mar 2018 23:10:37 +0000 (16:10 -0700)
Use refcount_dec_and_test() on 4.16+ kernels, atomic_dec_and_test()
on older kernels.  https://lwn.net/Articles/714974/

Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
Closes: #7179
Closes: #7211
config/kernel-acl-refcount.m4 [new file with mode: 0644]
config/kernel.m4
include/linux/vfs_compat.h

diff --git a/config/kernel-acl-refcount.m4 b/config/kernel-acl-refcount.m4
new file mode 100644 (file)
index 0000000..43e3c44
--- /dev/null
@@ -0,0 +1,20 @@
+dnl #
+dnl # 4.16 kernel: check if struct posix_acl acl.a_refcount is a refcount_t.
+dnl # It's an atomic_t on older kernels.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_ACL_HAS_REFCOUNT], [
+       AC_MSG_CHECKING([whether posix_acl has refcount_t])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/backing-dev.h>
+               #include <linux/refcount.h>
+               #include <linux/posix_acl.h>
+       ],[
+               struct posix_acl acl;
+               refcount_t *r __attribute__ ((unused)) = &acl.a_refcount;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_ACL_REFCOUNT, 1, [posix_acl has refcount_t])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index d4a84b2b2847d9660c9d72b4da4b162aea59c462..7bb86a96e9f8d026c693987a1edc4c6107433a70 100644 (file)
@@ -124,6 +124,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
        ZFS_AC_KERNEL_CURRENT_TIME
        ZFS_AC_KERNEL_VM_NODE_STAT
+       ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
 
        AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
                KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
index 7fcf3c055e17ba2c525fac785215195148ce81aa..6347268af9ed0936796da12d38a5aaaab5bc3e49 100644 (file)
@@ -288,9 +288,13 @@ zpl_posix_acl_release(struct posix_acl *acl)
 {
        if ((acl == NULL) || (acl == ACL_NOT_CACHED))
                return;
-
+#ifdef HAVE_ACL_REFCOUNT
+       if (refcount_dec_and_test(&acl->a_refcount))
+               zpl_posix_acl_release_impl(acl);
+#else
        if (atomic_dec_and_test(&acl->a_refcount))
                zpl_posix_acl_release_impl(acl);
+#endif
 }
 #endif /* HAVE_POSIX_ACL_RELEASE */