From 757290b7b0246668284376560227d8ca53ed635b Mon Sep 17 00:00:00 2001 From: Jian Yu Date: Mon, 24 Jan 2022 22:02:44 -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. Lustre-change: https://review.whamcloud.com/46086 Lustre-commit: TBD (from 66d55d4c3c93837b725d4cfece30a30683082b56) Test-Parameters: trivial Change-Id: Icd711b38dda1a5a3c56bd631fa2edd94eab3572c Signed-off-by: Jian Yu Reviewed-on: https://review.whamcloud.com/46289 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/autoconf/lustre-core.m4 | 26 ++++++++++++++++++++++++++ lustre/llite/file.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 3bd4a0b..f3c9cb3 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -2400,6 +2400,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], []) @@ -2592,6 +2615,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/file.c b/lustre/llite/file.c index d2efc14..27b2be4 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -5481,12 +5481,21 @@ out: return rc; } -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 084ac03..039103e 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -1181,7 +1181,11 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat); #endif /* HAVE_USER_NAMESPACE_ARG */ int ll_getattr_dentry(struct dentry *de, struct kstat *stat, u32 request_mask, unsigned int flags); -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 */ + ); #ifdef HAVE_IOP_SET_ACL #ifdef CONFIG_LUSTRE_FS_POSIX_ACL int ll_set_acl(struct user_namespace *mnt_userns, struct inode *inode, -- 1.8.3.1