mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 18:11:00 +03:00
Linux 4.16 compat: use correct *_dec_and_test()
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
This commit is contained in:
parent
30ac8de48a
commit
e5ba614d05
20
config/kernel-acl-refcount.m4
Normal file
20
config/kernel-acl-refcount.m4
Normal file
@ -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)
|
||||||
|
])
|
||||||
|
])
|
@ -124,6 +124,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
|
|||||||
ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
|
ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
|
||||||
ZFS_AC_KERNEL_CURRENT_TIME
|
ZFS_AC_KERNEL_CURRENT_TIME
|
||||||
ZFS_AC_KERNEL_VM_NODE_STAT
|
ZFS_AC_KERNEL_VM_NODE_STAT
|
||||||
|
ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
|
||||||
|
|
||||||
AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
|
AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
|
||||||
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
|
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
|
||||||
|
@ -288,9 +288,13 @@ zpl_posix_acl_release(struct posix_acl *acl)
|
|||||||
{
|
{
|
||||||
if ((acl == NULL) || (acl == ACL_NOT_CACHED))
|
if ((acl == NULL) || (acl == ACL_NOT_CACHED))
|
||||||
return;
|
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))
|
if (atomic_dec_and_test(&acl->a_refcount))
|
||||||
zpl_posix_acl_release_impl(acl);
|
zpl_posix_acl_release_impl(acl);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* HAVE_POSIX_ACL_RELEASE */
|
#endif /* HAVE_POSIX_ACL_RELEASE */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user