From 597a8a1e0c4c09b86b7d4e860cdcd6a3fedcb6dc Mon Sep 17 00:00:00 2001 From: Jian Yu Date: Wed, 7 Jul 2021 01:55:16 -0700 Subject: [PATCH] LU-14195 llite: add force_uaccess_{begin,end} helpers Linux kernel version 5.10 adds force_uaccess_begin() and force_uaccess_end() helpers to wrap get_fs() and set_fs() for undoing any damange done by set_fs(KERNEL_DS). Change-Id: I68745a8a1e26312ffe6ee8388f962b9c834df97b Signed-off-by: Jian Yu --- lustre/autoconf/lustre-core.m4 | 26 ++++++++++++++++++++++++++ lustre/include/lustre_compat.h | 5 +++++ lustre/llite/pcc.c | 5 ++--- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 26d88d6..4c52b5e 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -2235,6 +2235,29 @@ lock_manager_ops_lm_compare_owner, [ EXTRA_KCFLAGS="$tmp_flags" ]) # LC_LM_COMPARE_OWNER_EXISTS +# +# LC_FORCE_UACCESS_BEGIN +# +# Kernel version 5.10 adds force_uaccess_begin() and force_uaccess_end() +# to wrap get_fs() and set_fs() for undoing any damange done by +# set_fs(KERNEL_DS). +# +AC_DEFUN([LC_FORCE_UACCESS_BEGIN], [ +tmp_flags="$EXTRA_KCFLAGS" +EXTRA_KCFLAGS="-Werror" +LB_CHECK_COMPILE([if 'force_uaccess_begin()' is defined], +force_uaccess_begin, [ + #include +],[ + mm_segment_t old_fs = force_uaccess_begin(); + force_uaccess_end(old_fs); +],[ + AC_DEFINE(HAVE_FORCE_UACCESS_BEGIN, 1, + ['force_uaccess_begin()' is defined]) +]) +EXTRA_KCFLAGS="$tmp_flags" +]) # LC_FORCE_UACCESS_BEGIN + AC_DEFUN([LC_PROG_LINUX_SRC], []) AC_DEFUN([LC_PROG_LINUX_RESULTS], []) @@ -2439,6 +2462,9 @@ AC_DEFUN([LC_PROG_LINUX], [ LC_BIO_BI_PHYS_SEGMENTS LC_LM_COMPARE_OWNER_EXISTS + # 5.10 + LC_FORCE_UACCESS_BEGIN + # kernel patch to extend integrity interface LC_BIO_INTEGRITY_PREP_FN diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h index 5defcfd..756cf2f 100644 --- a/lustre/include/lustre_compat.h +++ b/lustre/include/lustre_compat.h @@ -564,4 +564,9 @@ static inline int ll_vfs_removexattr(struct dentry *dentry, struct inode *inode, #endif } +#ifndef HAVE_FORCE_UACCESS_BEGIN +#define force_uaccess_begin() get_fs(); set_fs(KERNEL_DS) +#define force_uaccess_end(fs_save) set_fs(fs_save) +#endif + #endif /* _LUSTRE_COMPAT_H */ diff --git a/lustre/llite/pcc.c b/lustre/llite/pcc.c index 561b238..00aed6e 100644 --- a/lustre/llite/pcc.c +++ b/lustre/llite/pcc.c @@ -2609,11 +2609,10 @@ int pcc_file_reset_projid(struct pcc_dataset *dataset, struct file *file, memset(&fsx, 0, sizeof(struct fsxattr)); fsx.fsx_projid = projid; - old_fs = get_fs(); - set_fs(get_ds()); + old_fs = force_uaccess_begin(); rc = file->f_op->unlocked_ioctl(file, FS_IOC_FSSETXATTR, (unsigned long)&fsx); - set_fs(old_fs); + force_uaccess_end(old_fs); RETURN(rc); } -- 1.8.3.1