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:
parent
8150090257
commit
8ce2eba9e6
|
@ -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)
|
||||||
])
|
])
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue