As of Linux 4.14 the vfs_read() is no longer available
to kernel modules. The kernel_read() function calls
vfs_read() and will continue to be available.
Adding a configure test to use kernel_read() as the
function signature changed in 4.14 to match the other file I/O
helpers.
Also remove vfs_write() in favor of kernel_write() wrapper
cfs_kernel_write().
Fixes:
f172b1168857 ("LU-10092 llite: Add persistent cache on client")
Signed-off-by: Shaun Tancheff <stancheff@cray.com>
Signed-off-by: Qian Yingjin <qian@ddn.com>
Change-Id: I5e5fce0e6644ba750169f3bf11ac5c98525da0a7
Reviewed-on: https://review.whamcloud.com/35223
Tested-by: Jenkins
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Petros Koutoupis <pkoutoupis@cray.com>
]) # LIBCFS_NEW_KERNEL_WRITE
#
+# LIBCFS_NEW_KERNEL_WRITE
+#
+# 4.14 commit bdd1d2d3d251c65b74ac4493e08db18971c09240 changed
+# the signature of kernel_read to match other read/write helpers
+# and place offset last.
+#
+AC_DEFUN([LIBCFS_NEW_KERNEL_READ], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'kernel_read()' has loff_t *pos as last parameter],
+kernel_read, [
+ #include <linux/fs.h>
+ ],[
+ loff_t pos = 0;
+ kernel_read(NULL, NULL, 0, &pos);
+],[
+ AC_DEFINE(HAVE_KERNEL_READ_LAST_POSP, 1,
+ [kernel_read() signature ends with loff_t *pos])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_NEW_KERNEL_READ
+
+#
# LIBCFS_DEFINE_TIMER
#
# Kernel version 4.14 commit 1d27e3e2252ba9d949ca82fbdb73cde102cb2067
# 4.14
LIBCFS_DEFINE_TIMER
LIBCFS_NEW_KERNEL_WRITE
+LIBCFS_NEW_KERNEL_READ
LIBCFS_EXPORT_SAVE_STACK_TRACE_TSK
# 4.15
LIBCFS_TIMER_SETUP
int cfs_kernel_write(struct file *filp, const void *buf, size_t count,
loff_t *pos);
+ssize_t cfs_kernel_read(struct file *file, void *buf, size_t count,
+ loff_t *pos);
/*
* For RHEL6 struct kernel_parm_ops doesn't exist. Also
}
EXPORT_SYMBOL(cfs_kernel_write);
+ssize_t cfs_kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
+{
+#ifdef HAVE_KERNEL_READ_LAST_POSP
+ return kernel_read(file, buf, count, pos);
+#else
+ ssize_t size = kernel_read(file, *pos, buf, count);
+
+ if (size > 0)
+ *pos += size;
+ return size;
+#endif
+}
+EXPORT_SYMBOL(cfs_kernel_read);
+
#ifndef HAVE_KSET_FIND_OBJ
struct kobject *kset_find_obj(struct kset *kset, const char *name)
{
while (count > 0) {
ssize_t size;
- size = vfs_write(filp, (const void __user *)buf, count, offset);
+ size = cfs_kernel_write(filp, buf, count, offset);
if (size < 0)
return size;
count -= size;
{
int rc = 0;
ssize_t rc2;
- mm_segment_t oldfs;
loff_t pos, offset = 0;
size_t buf_len = 1048576;
void *buf;
if (buf == NULL)
RETURN(-ENOMEM);
- oldfs = get_fs();
- set_fs(KERNEL_DS);
while (1) {
pos = offset;
- rc2 = vfs_read(src, (void __user *)buf, buf_len, &pos);
+ rc2 = cfs_kernel_read(src, buf, buf_len, &pos);
if (rc2 < 0)
- GOTO(out_fs, rc = rc2);
+ GOTO(out_free, rc = rc2);
else if (rc2 == 0)
break;
pos = offset;
rc = pcc_filp_write(dst, buf, rc2, &pos);
if (rc < 0)
- GOTO(out_fs, rc);
+ GOTO(out_free, rc);
offset += rc2;
}
-out_fs:
- set_fs(oldfs);
+out_free:
OBD_FREE_LARGE(buf, buf_len);
RETURN(rc);
}