EXTRA_KCFLAGS="$tmp_flags"
]) # LC_HAVE_USER_NAMESPACE_ARG
+#
+# LC_HAVE_GET_ACL_RCU_ARG
+#
+# kernel 5.15 commit 0cad6246621b5887d5b33fea84219d2a71f2f99a
+# vfs: add rcu argument to ->get_acl() callback
+# Add a rcu argument to the ->get_acl() callback to allow
+# get_cached_acl_rcu() to call the ->get_acl() method.
+#
+AC_DEFUN([LC_HAVE_GET_ACL_RCU_ARG], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'get_acl' has a rcu argument],
+get_acl_rcu_argument, [
+ #include <linux/fs.h>
+],[
+ ((struct inode_operations *)1)->get_acl((struct inode *)NULL, 0, false);
+],[
+ AC_DEFINE(HAVE_GET_ACL_RCU_ARG, 1,
+ ['get_acl' has a rcu argument])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LC_HAVE_GET_ACL_RCU_ARG
+
AC_DEFUN([LC_PROG_LINUX_SRC], [])
AC_DEFUN([LC_PROG_LINUX_RESULTS], [])
# 5.12
LC_HAVE_USER_NAMESPACE_ARG
+ # 5.15
+ LC_HAVE_GET_ACL_RCU_ARG
+
# kernel patch to extend integrity interface
LC_BIO_INTEGRITY_PREP_FN
#include "llite_internal.h"
-struct posix_acl *ll_get_acl(struct inode *inode, int type)
+struct posix_acl *ll_get_acl(struct inode *inode, int type
+#ifdef HAVE_GET_ACL_RCU_ARG
+ , bool rcu
+#endif /* HAVE_GET_ACL_RCU_ARG */
+ )
{
struct ll_inode_info *lli = ll_i2info(inode);
struct posix_acl *acl = NULL;
ENTRY;
+#ifdef HAVE_GET_ACL_RCU_ARG
+ if (rcu)
+ return ERR_PTR(-ECHILD);
+#endif
+
read_lock(&lli->lli_lock);
/* VFS' acl_permission_check->check_acl will release the refcount */
acl = posix_acl_dup(lli->lli_posix_acl);
int ll_getattr_dentry(struct dentry *de, struct kstat *stat, u32 request_mask,
unsigned int flags, bool foreign);
#ifdef CONFIG_LUSTRE_FS_POSIX_ACL
-struct posix_acl *ll_get_acl(struct inode *inode, int type);
+struct posix_acl *ll_get_acl(struct inode *inode, int type
+#ifdef HAVE_GET_ACL_RCU_ARG
+ , bool rcu
+#endif /* HAVE_GET_ACL_RCU_ARG */
+ );
int ll_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
struct posix_acl *acl, int type);
#else /* !CONFIG_LUSTRE_FS_POSIX_ACL */