From 080e73e2362233953e6771f58c2ab7b78c2ee76d Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Mon, 20 Apr 2015 10:41:53 -0300 Subject: [PATCH] Linux 4.1: Don't define or use ->write directly We no longer have to define a ->write operation, and we can't expect the underlying disk cache filesystem to have one. Use the new __vfs_read/write helpers that will select the operation to use based on what's available for that particular filesystem. Reviewed-on: http://gerrit.openafs.org/11849 Tested-by: BuildBot Reviewed-by: Chas Williams <3chas3@gmail.com> Reviewed-by: Benjamin Kaduk Reviewed-by: Jeffrey Altman (cherry picked from commit 5c1237432edf4600111845d175c92252430d5f76) Change-Id: I21bca85637e07d0e03ef471896d0454eeef68a14 Reviewed-on: http://gerrit.openafs.org/11873 Tested-by: BuildBot Reviewed-by: Daria Brashear Reviewed-by: Benjamin Kaduk Reviewed-by: Stephan Wiesand --- acinclude.m4 | 3 +++ src/afs/LINUX/osi_compat.h | 20 ++++++++++++++++++++ src/afs/LINUX/osi_file.c | 4 ++-- src/afs/LINUX/osi_vnodeops.c | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index c9ada2cdd..79df95afb 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -902,6 +902,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) dnl Function existence checks + AC_CHECK_LINUX_FUNC([__vfs_read], + [#include ], + [__vfs_read(NULL, NULL, 0, NULL);]) AC_CHECK_LINUX_FUNC([bdi_init], [#include ], [bdi_init(NULL);]) diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h index 97369a2b1..47450e65a 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -578,4 +578,24 @@ afs_d_invalidate(struct dentry *dp) #endif } +static inline int +afs_file_read(struct file *filp, char __user *buf, size_t len, loff_t *pos) +{ +#if defined(HAVE_LINUX___VFS_READ) + return __vfs_read(filp, buf, len, pos); +#else + return filp->f_op->read(filp, buf, len, pos); +#endif +} + +static inline int +afs_file_write(struct file *filp, char __user *buf, size_t len, loff_t *pos) +{ +#if defined(HAVE_LINUX___VFS_READ) + return __vfs_write(filp, buf, len, pos); +#else + return filp->f_op->write(filp, buf, len, pos); +#endif +} + #endif /* AFS_LINUX_OSI_COMPAT_H */ diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c index 6261c93e7..c1e52e3cb 100644 --- a/src/afs/LINUX/osi_file.c +++ b/src/afs/LINUX/osi_file.c @@ -376,9 +376,9 @@ osi_rdwr(struct osi_file *osifile, struct uio *uiop, int rw) pos = uiop->uio_offset; if (rw == UIO_READ) - code = filp->f_op->read(filp, iov->iov_base, count, &pos); + code = afs_file_read(filp, iov->iov_base, count, &pos); else - code = filp->f_op->write(filp, iov->iov_base, count, &pos); + code = afs_file_write(filp, iov->iov_base, count, &pos); if (code < 0) { code = -code; diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 0a898d9b0..0aaad2d9c 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -807,8 +807,10 @@ struct file_operations afs_file_fops = { #ifdef STRUCT_FILE_OPERATIONS_HAS_READ_ITER .read_iter = afs_linux_read_iter, .write_iter = afs_linux_write_iter, +# if !defined(HAVE_LINUX___VFS_READ) .read = new_sync_read, .write = new_sync_write, +# endif #elif defined(HAVE_LINUX_GENERIC_FILE_AIO_READ) .aio_read = afs_linux_aio_read, .aio_write = afs_linux_aio_write, -- 2.39.5