From: Marcio Barbosa Date: Thu, 16 Nov 2017 22:24:03 +0000 (-0500) Subject: afs: fix kernel_write / kernel_read arguments X-Git-Tag: openafs-devel-1_9_0~658 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=3ce55426ee6912b78460465bcaa1428333ad1fbc afs: fix kernel_write / kernel_read arguments The order / content of the arguments passed to kernel_write and kernel_read are not right. As a result, the kernel will panic if one of the functions in question is called. [kaduk@mit.edu: include configure check for multiple kernel_read() variants, per linux commits bdd1d2d3d251c65b74ac4493e08db18971c09240 and e13ec939e96b13e664bb6cee361cc976a0ee621a] FIXES 134440 Change-Id: I4753dee61f1b986bbe6a12b5568d1a8db30c65f8 Reviewed-on: https://gerrit.openafs.org/12769 Tested-by: BuildBot Tested-by: Marcio Brito Barbosa Reviewed-by: Benjamin Kaduk --- diff --git a/acinclude.m4 b/acinclude.m4 index 703d3ea..8952776 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1195,6 +1195,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_DOP_D_REVALIDATE_TAKES_UNSIGNED LINUX_IOP_LOOKUP_TAKES_UNSIGNED LINUX_D_INVALIDATE_IS_VOID + LINUX_KERNEL_READ_OFFSET_IS_LAST dnl If we are guaranteed that keyrings will work - that is dnl a) The kernel has keyrings enabled diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h index 60cfdc1..62fce21 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -659,7 +659,11 @@ afs_file_read(struct file *filp, char __user *buf, size_t len, loff_t *pos) #if defined(HAVE_LINUX___VFS_WRITE) return __vfs_read(filp, buf, len, pos); #elif defined(HAVE_LINUX_KERNEL_WRITE) +# if defined(LINUX_KERNEL_READ_OFFSET_IS_LAST) return kernel_read(filp, buf, len, pos); +# else + return kernel_read(filp, *pos, buf, len); +# endif #else return filp->f_op->read(filp, buf, len, pos); #endif @@ -671,7 +675,11 @@ afs_file_write(struct file *filp, char __user *buf, size_t len, loff_t *pos) #if defined(HAVE_LINUX___VFS_WRITE) return __vfs_write(filp, buf, len, pos); #elif defined(HAVE_LINUX_KERNEL_WRITE) +# if defined(LINUX_KERNEL_READ_OFFSET_IS_LAST) return kernel_write(filp, buf, len, pos); +# else + return kernel_write(filp, buf, len, *pos); +# endif #else return filp->f_op->write(filp, buf, len, pos); #endif diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index ed759e1..6746a10 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -799,3 +799,15 @@ AC_DEFUN([LINUX_D_INVALIDATE_IS_VOID], [ [define if your d_invalidate returns void], []) ]) + +AC_DEFUN([LINUX_KERNEL_READ_OFFSET_IS_LAST], [ + AC_CHECK_LINUX_BUILD([whether offset is the last argument to kernel_read], + [ac_cv_linux_func_kernel_read_offset_is_last], + [#include ], + [ + ssize_t kernel_read(struct file *, void *, size_t, loff_t *); + ], + [KERNEL_READ_OFFSET_IS_LAST], + [define if your kernel_read has offset as the last argument], + []) +])