diff --git a/config/kernel-acl.m4 b/config/kernel-acl.m4 index a155b59d00..238742901f 100644 --- a/config/kernel-acl.m4 +++ b/config/kernel-acl.m4 @@ -189,6 +189,18 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_GET_ACL], [ .get_acl = get_acl_fn, }; ],[]) + + ZFS_LINUX_TEST_SRC([inode_operations_get_inode_acl], [ + #include + + struct posix_acl *get_inode_acl_fn(struct inode *inode, int type, + bool rcu) { return NULL; } + + static const struct inode_operations + iops __attribute__ ((unused)) = { + .get_inode_acl = get_inode_acl_fn, + }; + ],[]) ]) AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL], [ @@ -201,7 +213,12 @@ AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_GET_ACL_RCU, 1, [iops->get_acl() takes rcu]) ],[ - ZFS_LINUX_TEST_ERROR([iops->get_acl()]) + ZFS_LINUX_TEST_RESULT([inode_operations_get_inode_acl], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_GET_INODE_ACL, 1, [has iops->get_inode_acl()]) + ],[ + ZFS_LINUX_TEST_ERROR([iops->get_acl() or iops->get_inode_acl()]) + ]) ]) ]) ]) diff --git a/include/os/linux/zfs/sys/zpl.h b/include/os/linux/zfs/sys/zpl.h index c3ee0ae4a6..f499c04dd1 100644 --- a/include/os/linux/zfs/sys/zpl.h +++ b/include/os/linux/zfs/sys/zpl.h @@ -75,7 +75,7 @@ extern int zpl_set_acl(struct user_namespace *userns, struct inode *ip, extern int zpl_set_acl(struct inode *ip, struct posix_acl *acl, int type); #endif /* HAVE_SET_ACL_USERNS */ #endif /* HAVE_SET_ACL */ -#if defined(HAVE_GET_ACL_RCU) +#if defined(HAVE_GET_ACL_RCU) || defined(HAVE_GET_INODE_ACL) extern struct posix_acl *zpl_get_acl(struct inode *ip, int type, bool rcu); #elif defined(HAVE_GET_ACL) extern struct posix_acl *zpl_get_acl(struct inode *ip, int type); diff --git a/module/os/linux/zfs/zpl_inode.c b/module/os/linux/zfs/zpl_inode.c index edcabedf17..993447e546 100644 --- a/module/os/linux/zfs/zpl_inode.c +++ b/module/os/linux/zfs/zpl_inode.c @@ -776,7 +776,11 @@ const struct inode_operations zpl_inode_operations = { #if defined(HAVE_SET_ACL) .set_acl = zpl_set_acl, #endif /* HAVE_SET_ACL */ +#if defined(HAVE_GET_INODE_ACL) + .get_inode_acl = zpl_get_acl, +#else .get_acl = zpl_get_acl, +#endif /* HAVE_GET_INODE_ACL */ #endif /* CONFIG_FS_POSIX_ACL */ }; @@ -816,7 +820,11 @@ const struct inode_operations zpl_dir_inode_operations = { #if defined(HAVE_SET_ACL) .set_acl = zpl_set_acl, #endif /* HAVE_SET_ACL */ +#if defined(HAVE_GET_INODE_ACL) + .get_inode_acl = zpl_get_acl, +#else .get_acl = zpl_get_acl, +#endif /* HAVE_GET_INODE_ACL */ #endif /* CONFIG_FS_POSIX_ACL */ #ifdef HAVE_RENAME2_OPERATIONS_WRAPPER }, @@ -859,6 +867,10 @@ const struct inode_operations zpl_special_inode_operations = { #if defined(HAVE_SET_ACL) .set_acl = zpl_set_acl, #endif /* HAVE_SET_ACL */ +#if defined(HAVE_GET_INODE_ACL) + .get_inode_acl = zpl_get_acl, +#else .get_acl = zpl_get_acl, +#endif /* HAVE_GET_INODE_ACL */ #endif /* CONFIG_FS_POSIX_ACL */ }; diff --git a/module/os/linux/zfs/zpl_xattr.c b/module/os/linux/zfs/zpl_xattr.c index b9e74bcbb4..cb154c31fe 100644 --- a/module/os/linux/zfs/zpl_xattr.c +++ b/module/os/linux/zfs/zpl_xattr.c @@ -1124,7 +1124,7 @@ zpl_get_acl_impl(struct inode *ip, int type) return (acl); } -#if defined(HAVE_GET_ACL_RCU) +#if defined(HAVE_GET_ACL_RCU) || defined(HAVE_GET_INODE_ACL) struct posix_acl * zpl_get_acl(struct inode *ip, int type, bool rcu) {