File 0034-LU-14195-llite-add-force_uaccess_-begin-end-helpers.patch of Package lustre_2_12
From 2b6e38504a54ee96653b38830fce5f3cb0f5e3f5 Mon Sep 17 00:00:00 2001
From: Jian Yu <yujian@whamcloud.com>
Date: Wed, 7 Jul 2021 01:55:16 -0700
Subject: [PATCH 34/35] 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 <yujian@whamcloud.com>
---
lustre/autoconf/lustre-core.m4 | 26 ++++++++++++++++++++++++++
lustre/include/lustre_compat.h | 5 +++++
lustre/obdclass/obd_config.c | 9 ++++-----
3 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4
index 106e10babe78..cc58bd47cd60 100644
--- a/lustre/autoconf/lustre-core.m4
+++ b/lustre/autoconf/lustre-core.m4
@@ -2104,6 +2104,29 @@ percpu_counter_init, [
])
]) # LC_PERCPU_COUNTER_INIT
+#
+# 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 <linux/uaccess.h>
+],[
+ 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
+
#
# LC_KIOCB_HAS_NBYTES
#
@@ -3508,6 +3531,9 @@ AC_DEFUN([LC_PROG_LINUX], [
LC_UAPI_LINUX_MOUNT_H
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 70c8cae1505d..6ccc03015e9e 100644
--- a/lustre/include/lustre_compat.h
+++ b/lustre/include/lustre_compat.h
@@ -861,4 +861,9 @@ static inline int ll_vfs_removexattr(struct dentry *dentry, struct inode *inode,
#define ll_set_acl(ns, inode, acl, type) ll_set_acl(inode, acl, type)
#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/obdclass/obd_config.c b/lustre/obdclass/obd_config.c
index 961e034acb72..a04f2dd441ce 100644
--- a/lustre/obdclass/obd_config.c
+++ b/lustre/obdclass/obd_config.c
@@ -1491,13 +1491,12 @@ int class_process_proc_param(char *prefix, struct lprocfs_vars *lvars,
matched++;
rc = -EROFS;
- if (var->fops && var->fops->write) {
+ if (var->fops && var->fops->proc_write) {
mm_segment_t oldfs;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- rc = (var->fops->write)(&fakefile, sval,
+ oldfs = force_uaccess_begin();
+ rc = (var->fops->proc_write)(&fakefile, sval,
vallen, NULL);
- set_fs(oldfs);
+ force_uaccess_end(oldfs);
}
break;
}
--
2.41.0