Linux 6.5 compat: Use copy_splice_read instead of filemap_splice_read

Using the filemap_splice_read function for the splice_read handler was
leading to occasional data corruption under certain circumstances. Favor
using copy_splice_read instead, which does not demonstrate the same
erroneous behavior under the tested failure cases.

Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Coleman Kane <ckane@colemankane.org>
Closes #15164
This commit is contained in:
Coleman Kane 2023-08-08 18:42:32 -04:00 committed by GitHub
parent 8150090257
commit 8ce2eba9e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 13 deletions

View File

@ -1,24 +1,24 @@
AC_DEFUN([ZFS_AC_KERNEL_SRC_FILEMAP_SPLICE_READ], [ AC_DEFUN([ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ], [
dnl # dnl #
dnl # Kernel 6.5 - generic_file_splice_read was removed in favor dnl # Kernel 6.5 - generic_file_splice_read was removed in favor
dnl # of filemap_splice_read for the .splice_read member of the dnl # of copy_splice_read for the .splice_read member of the
dnl # file_operations struct. dnl # file_operations struct.
dnl # dnl #
ZFS_LINUX_TEST_SRC([has_filemap_splice_read], [ ZFS_LINUX_TEST_SRC([has_copy_splice_read], [
#include <linux/fs.h> #include <linux/fs.h>
struct file_operations fops __attribute__((unused)) = { struct file_operations fops __attribute__((unused)) = {
.splice_read = filemap_splice_read, .splice_read = copy_splice_read,
}; };
],[]) ],[])
]) ])
AC_DEFUN([ZFS_AC_KERNEL_FILEMAP_SPLICE_READ], [ AC_DEFUN([ZFS_AC_KERNEL_COPY_SPLICE_READ], [
AC_MSG_CHECKING([whether filemap_splice_read() exists]) AC_MSG_CHECKING([whether copy_splice_read() exists])
ZFS_LINUX_TEST_RESULT([has_filemap_splice_read], [ ZFS_LINUX_TEST_RESULT([has_copy_splice_read], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_FILEMAP_SPLICE_READ, 1, AC_DEFINE(HAVE_COPY_SPLICE_READ, 1,
[filemap_splice_read exists]) [copy_splice_read exists])
],[ ],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
]) ])

View File

@ -161,7 +161,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
ZFS_AC_KERNEL_SRC_WRITEPAGE_T ZFS_AC_KERNEL_SRC_WRITEPAGE_T
ZFS_AC_KERNEL_SRC_RECLAIMED ZFS_AC_KERNEL_SRC_RECLAIMED
ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE
ZFS_AC_KERNEL_SRC_FILEMAP_SPLICE_READ ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ
case "$host_cpu" in case "$host_cpu" in
powerpc*) powerpc*)
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
@ -302,7 +302,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
ZFS_AC_KERNEL_WRITEPAGE_T ZFS_AC_KERNEL_WRITEPAGE_T
ZFS_AC_KERNEL_RECLAIMED ZFS_AC_KERNEL_RECLAIMED
ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
ZFS_AC_KERNEL_FILEMAP_SPLICE_READ ZFS_AC_KERNEL_COPY_SPLICE_READ
case "$host_cpu" in case "$host_cpu" in
powerpc*) powerpc*)
ZFS_AC_KERNEL_CPU_HAS_FEATURE ZFS_AC_KERNEL_CPU_HAS_FEATURE

View File

@ -1323,8 +1323,8 @@ const struct file_operations zpl_file_operations = {
.read_iter = zpl_iter_read, .read_iter = zpl_iter_read,
.write_iter = zpl_iter_write, .write_iter = zpl_iter_write,
#ifdef HAVE_VFS_IOV_ITER #ifdef HAVE_VFS_IOV_ITER
#ifdef HAVE_FILEMAP_SPLICE_READ #ifdef HAVE_COPY_SPLICE_READ
.splice_read = filemap_splice_read, .splice_read = copy_splice_read,
#else #else
.splice_read = generic_file_splice_read, .splice_read = generic_file_splice_read,
#endif #endif