From 085311dc739903f751d11dc4244aea6316ccb7bd Mon Sep 17 00:00:00 2001 From: Jian Yu Date: Mon, 24 Jan 2022 21:51:02 -0800 Subject: [PATCH] LU-15420 llite: add rcu argument to ->get_acl() callback Kernel 5.15 commit 0cad6246621b5887d5b33fea84219d2a71f2f99a added a rcu argument to the ->get_acl() callback. Test-Parameters: trivial Change-Id: Icd711b38dda1a5a3c56bd631fa2edd94eab3572c Signed-off-by: Jian Yu Reviewed-on: https://review.whamcloud.com/46086 Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- lustre/autoconf/lustre-core.m4 | 26 ++++++++++++++++++++++++++ lustre/llite/acl.c | 11 ++++++++++- lustre/llite/llite_internal.h | 6 +++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 7f984cb..4a93109 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -2601,6 +2601,29 @@ user_namespace_argument, [ 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 +],[ + ((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], []) @@ -2799,6 +2822,9 @@ AC_DEFUN([LC_PROG_LINUX], [ # 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 diff --git a/lustre/llite/acl.c b/lustre/llite/acl.c index fb12ce2..5ae1aab 100644 --- a/lustre/llite/acl.c +++ b/lustre/llite/acl.c @@ -38,12 +38,21 @@ #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); diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 09f8d70..a7bac0e 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -1117,7 +1117,11 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat); 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 */ -- 1.8.3.1