[packages/zfs] - up to 2.2.0 final, needs fix to build with kernel 6.6

baggins baggins at pld-linux.org
Fri Nov 17 02:31:20 CET 2023


commit bf636acc1e71cd78273831c01b7a5138b668ce56
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Fri Nov 17 00:35:19 2023 +0100

    - up to 2.2.0 final, needs fix to build with kernel 6.6

 blkdev.patch     | 222 -------------
 kernel-6.5.patch | 934 -------------------------------------------------------
 zfs.spec         |  12 +-
 3 files changed, 5 insertions(+), 1163 deletions(-)
---
diff --git a/zfs.spec b/zfs.spec
index a415511..508db3d 100644
--- a/zfs.spec
+++ b/zfs.spec
@@ -24,8 +24,8 @@ exit 1
 
 %define		_duplicate_files_terminate_build	0
 
-%define	pre	rc3
-%define	rel	0.%{pre}.1
+#define	pre	rc3
+%define	rel	0.1
 %define	pname	zfs
 Summary:	Native Linux port of the ZFS filesystem
 Summary(pl.UTF-8):	Natywny linuksowy port systemu plików ZFS
@@ -34,10 +34,9 @@ Version:	2.2.0
 Release:	%{rel}%{?_pld_builder:%{?with_kernel:@%{_kernel_ver_str}}}
 License:	CDDL
 Group:		Applications/System
-Source0:	https://github.com/openzfs/zfs/releases/download/zfs-%{version}-%{pre}/%{pname}-%{version}-%{pre}.tar.gz
-# Source0-md5:	75fd8dc40d9601db40029b357c824f3f
+Source0:	https://github.com/openzfs/zfs/releases/download/zfs-%{version}/%{pname}-%{version}.tar.gz
+# Source0-md5:	d7e2ec4c52d6a48653ce4a5b96c24a01
 Patch0:		initdir.patch
-Patch3:		kernel-6.5.patch
 URL:		https://zfsonlinux.org/
 BuildRequires:	autoconf >= 2.50
 BuildRequires:	automake
@@ -267,9 +266,8 @@ p=`pwd`\
 %{?with_kernel:%{expand:%create_kernel_packages}}
 
 %prep
-%setup -q -n %{pname}-%{version}-%{pre}
+%setup -q -n %{pname}-%{version}
 %patch0 -p1
-%patch3 -p1
 
 %{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+python3(\s|$),#!%{__python3}\1,' \
       cmd/arc_summary
diff --git a/blkdev.patch b/blkdev.patch
deleted file mode 100644
index e8a00db..0000000
--- a/blkdev.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-From ae0b1f66c707cff09bfde54aade784a016559a34 Mon Sep 17 00:00:00 2001
-From: Rich Ercolani <214141+rincebrain at users.noreply.github.com>
-Date: Mon, 27 Mar 2023 14:29:19 -0400
-Subject: [PATCH] linux 6.3 compat: add another bdev_io_acct case
-
-Linux 6.3+, and backports from it (6.2.8+), changed the
-signatures on bdev_io_{start,end}_acct.  Add a case for it.
-
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Signed-off-by: Rich Ercolani <rincebrain at gmail.com>
-Closes #14658
-Closes #14668
----
- config/kernel-generic_io_acct.m4              | 98 ++++++++++++-------
- include/os/linux/kernel/linux/blkdev_compat.h | 10 +-
- 2 files changed, 69 insertions(+), 39 deletions(-)
-
-diff --git a/config/kernel-generic_io_acct.m4 b/config/kernel-generic_io_acct.m4
-index a8a448c6fe9..a6a10900429 100644
---- a/config/kernel-generic_io_acct.m4
-+++ b/config/kernel-generic_io_acct.m4
-@@ -2,7 +2,20 @@ dnl #
- dnl # Check for generic io accounting interface.
- dnl #
- AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
--	ZFS_LINUX_TEST_SRC([bdev_io_acct], [
-+	ZFS_LINUX_TEST_SRC([bdev_io_acct_63], [
-+		#include <linux/blkdev.h>
-+	], [
-+		struct block_device *bdev = NULL;
-+		struct bio *bio = NULL;
-+		unsigned long passed_time = 0;
-+		unsigned long start_time;
-+
-+		start_time = bdev_start_io_acct(bdev, bio_op(bio),
-+		    passed_time);
-+		bdev_end_io_acct(bdev, bio_op(bio), bio_sectors(bio), start_time);
-+	])
-+
-+	ZFS_LINUX_TEST_SRC([bdev_io_acct_old], [
- 		#include <linux/blkdev.h>
- 	], [
- 		struct block_device *bdev = NULL;
-@@ -63,74 +76,85 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
- 
- AC_DEFUN([ZFS_AC_KERNEL_GENERIC_IO_ACCT], [
- 	dnl #
--	dnl # 5.19 API,
-+	dnl # Linux 6.3, and then backports thereof, changed
-+	dnl # the signatures on bdev_start_io_acct/bdev_end_io_acct
- 	dnl #
--	dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
--	dnl # bdev_start_io_acct() and bdev_end_io_acct().
--	dnl #
--	AC_MSG_CHECKING([whether generic bdev_*_io_acct() are available])
--	ZFS_LINUX_TEST_RESULT([bdev_io_acct], [
-+	AC_MSG_CHECKING([whether 6.3+ bdev_*_io_acct() are available])
-+	ZFS_LINUX_TEST_RESULT([bdev_io_acct_63], [
- 		AC_MSG_RESULT(yes)
--		AC_DEFINE(HAVE_BDEV_IO_ACCT, 1, [bdev_*_io_acct() available])
-+		AC_DEFINE(HAVE_BDEV_IO_ACCT_63, 1, [bdev_*_io_acct() available])
- 	], [
- 		AC_MSG_RESULT(no)
- 
- 		dnl #
--		dnl # 5.12 API,
-+		dnl # 5.19 API,
- 		dnl #
--		dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
--		dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
-+		dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
-+		dnl # bdev_start_io_acct() and bdev_end_io_acct().
- 		dnl #
--		AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
--		ZFS_LINUX_TEST_RESULT([disk_io_acct], [
-+		AC_MSG_CHECKING([whether pre-6.3 bdev_*_io_acct() are available])
-+		ZFS_LINUX_TEST_RESULT([bdev_io_acct_old], [
- 			AC_MSG_RESULT(yes)
--			AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
-+			AC_DEFINE(HAVE_BDEV_IO_ACCT_OLD, 1, [bdev_*_io_acct() available])
- 		], [
- 			AC_MSG_RESULT(no)
--
- 			dnl #
--			dnl # 5.7 API,
-+			dnl # 5.12 API,
- 			dnl #
--			dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
-+			dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
-+			dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
- 			dnl #
--			AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
--			ZFS_LINUX_TEST_RESULT([bio_io_acct], [
-+			AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
-+			ZFS_LINUX_TEST_RESULT([disk_io_acct], [
- 				AC_MSG_RESULT(yes)
--				AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
-+				AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
- 			], [
- 				AC_MSG_RESULT(no)
- 
- 				dnl #
--				dnl # 4.14 API,
-+				dnl # 5.7 API,
- 				dnl #
--				dnl # generic_start_io_acct/generic_end_io_acct now require
--				dnl # request_queue to be provided. No functional changes,
--				dnl # but preparation for inflight accounting.
-+				dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
- 				dnl #
--				AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
--				ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
--				    [generic_start_io_acct], [block/bio.c], [
-+				AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
-+				ZFS_LINUX_TEST_RESULT([bio_io_acct], [
- 					AC_MSG_RESULT(yes)
--					AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
--					    [generic_*_io_acct() 4 arg available])
-+					AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
- 				], [
- 					AC_MSG_RESULT(no)
- 
- 					dnl #
--					dnl # 3.19 API addition
-+					dnl # 4.14 API,
- 					dnl #
--					dnl # torvalds/linux at 394ffa50 allows us to increment
--					dnl # iostat counters without generic_make_request().
-+					dnl # generic_start_io_acct/generic_end_io_acct now require
-+					dnl # request_queue to be provided. No functional changes,
-+					dnl # but preparation for inflight accounting.
- 					dnl #
--					AC_MSG_CHECKING(
--					    [whether generic_*_io_acct wants 3 args])
--					ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
-+					AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
-+					ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
- 					    [generic_start_io_acct], [block/bio.c], [
- 						AC_MSG_RESULT(yes)
--						AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
--						    [generic_*_io_acct() 3 arg available])
-+						AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
-+						    [generic_*_io_acct() 4 arg available])
- 					], [
- 						AC_MSG_RESULT(no)
-+
-+						dnl #
-+						dnl # 3.19 API addition
-+						dnl #
-+						dnl # torvalds/linux at 394ffa50 allows us to increment
-+						dnl # iostat counters without generic_make_request().
-+						dnl #
-+						AC_MSG_CHECKING(
-+						    [whether generic_*_io_acct wants 3 args])
-+						ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
-+						    [generic_start_io_acct], [block/bio.c], [
-+							AC_MSG_RESULT(yes)
-+							AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
-+							    [generic_*_io_acct() 3 arg available])
-+						], [
-+							AC_MSG_RESULT(no)
-+						])
- 					])
- 				])
- 			])
-diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h
-index f04eb5b2593..c7405ffab8b 100644
---- a/include/os/linux/kernel/linux/blkdev_compat.h
-+++ b/include/os/linux/kernel/linux/blkdev_compat.h
-@@ -592,7 +592,10 @@ blk_generic_start_io_acct(struct request_queue *q __attribute__((unused)),
-     struct gendisk *disk __attribute__((unused)),
-     int rw __attribute__((unused)), struct bio *bio)
- {
--#if defined(HAVE_BDEV_IO_ACCT)
-+#if defined(HAVE_BDEV_IO_ACCT_63)
-+	return (bdev_start_io_acct(bio->bi_bdev, bio_op(bio),
-+	    jiffies));
-+#elif defined(HAVE_BDEV_IO_ACCT_OLD)
- 	return (bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
- 	    bio_op(bio), jiffies));
- #elif defined(HAVE_DISK_IO_ACCT)
-@@ -618,7 +621,10 @@ blk_generic_end_io_acct(struct request_queue *q __attribute__((unused)),
-     struct gendisk *disk __attribute__((unused)),
-     int rw __attribute__((unused)), struct bio *bio, unsigned long start_time)
- {
--#if defined(HAVE_BDEV_IO_ACCT)
-+#if defined(HAVE_BDEV_IO_ACCT_63)
-+	bdev_end_io_acct(bio->bi_bdev, bio_op(bio), bio_sectors(bio),
-+	    start_time);
-+#elif defined(HAVE_BDEV_IO_ACCT_OLD)
- 	bdev_end_io_acct(bio->bi_bdev, bio_op(bio), start_time);
- #elif defined(HAVE_DISK_IO_ACCT)
- 	disk_end_io_acct(disk, bio_op(bio), start_time);
-From c5431f14655ce05d1ea99cb012806f0e5873d257 Mon Sep 17 00:00:00 2001
-From: youzhongyang <youzhong at gmail.com>
-Date: Fri, 31 Mar 2023 12:46:22 -0400
-Subject: [PATCH] linux 6.3 compat: needs REQ_PREFLUSH | REQ_OP_WRITE
-
-Modify bio_set_flush() so if kernel version is >= 4.10, flags
-REQ_PREFLUSH and REQ_OP_WRITE are set together.
-
-Reviewed-by: Tony Hutter <hutter2 at llnl.gov>
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Signed-off-by: Youzhong Yang <yyang at mathworks.com>
-Closes #14695
----
- include/os/linux/kernel/linux/blkdev_compat.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h
-index c7405ffab8b..c5c6385be6f 100644
---- a/include/os/linux/kernel/linux/blkdev_compat.h
-+++ b/include/os/linux/kernel/linux/blkdev_compat.h
-@@ -426,7 +426,7 @@ static inline void
- bio_set_flush(struct bio *bio)
- {
- #if defined(HAVE_REQ_PREFLUSH)	/* >= 4.10 */
--	bio_set_op_attrs(bio, 0, REQ_PREFLUSH);
-+	bio_set_op_attrs(bio, 0, REQ_PREFLUSH | REQ_OP_WRITE);
- #elif defined(WRITE_FLUSH_FUA)	/* >= 2.6.37 and <= 4.9 */
- 	bio_set_op_attrs(bio, 0, WRITE_FLUSH_FUA);
- #else
diff --git a/kernel-6.5.patch b/kernel-6.5.patch
deleted file mode 100644
index 6c4a55f..0000000
--- a/kernel-6.5.patch
+++ /dev/null
@@ -1,934 +0,0 @@
-From 3b8e318b7737fa40daf6abbc06ba31cd6ae8d572 Mon Sep 17 00:00:00 2001
-From: Coleman Kane <ckane at colemankane.org>
-Date: Tue, 1 Aug 2023 11:32:38 -0400
-Subject: [PATCH] Linux 6.5 compat: use disk_check_media_change when it exists
-
-When disk_check_media_change() exists, then define
-zfs_check_media_change() to simply call disk_check_media_change() on
-the bd_disk member of its argument. Since disk_check_media_change()
-is newer than when revalidate_disk was present in bops, we should
-be able to safely do this via a macro, instead of recreating a new
-implementation of the inline function that forces revalidation.
-
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Reviewed-by: Brian Atkinson <batkinson at lanl.gov>
-Signed-off-by: Coleman Kane <ckane at colemankane.org>
-Closes #15101
----
- include/os/linux/kernel/linux/blkdev_compat.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h
-index e0f20ba32008..1641dd92a918 100644
---- a/include/os/linux/kernel/linux/blkdev_compat.h
-+++ b/include/os/linux/kernel/linux/blkdev_compat.h
-@@ -347,6 +347,7 @@ zfs_check_media_change(struct block_device *bdev)
- #define	vdev_bdev_reread_part(bdev)	zfs_check_media_change(bdev)
- #elif defined(HAVE_DISK_CHECK_MEDIA_CHANGE)
- #define	vdev_bdev_reread_part(bdev)	disk_check_media_change(bdev->bd_disk)
-+#define	zfs_check_media_change(bdev)	disk_check_media_change(bdev->bd_disk)
- #else
- /*
-  * This is encountered if check_disk_change() and bdev_check_media_change()
-From 43e8f6e37fddc31f23301cb70d466687bd205cd9 Mon Sep 17 00:00:00 2001
-From: Coleman Kane <ckane at colemankane.org>
-Date: Tue, 1 Aug 2023 11:37:20 -0400
-Subject: [PATCH] Linux 6.5 compat: blkdev changes
-
-Multiple changes to the blkdev API were introduced in Linux 6.5. This
-includes passing (void* holder) to blkdev_put, adding a new
-blk_holder_ops* arg to blkdev_get_by_path, adding a new blk_mode_t type
-that replaces uses of fmode_t, and removing an argument from the release
-handler on block_device_operations that we weren't using. The open
-function definition has also changed to take gendisk* and blk_mode_t, so
-update it accordingly, too.
-
-Implement local wrappers for blkdev_get_by_path() and
-vdev_blkdev_put() so that the in-line calls are cleaner, and place the
-conditionally-compiled implementation details inside of both of these
-local wrappers. Both calls are exclusively used within vdev_disk.c, at
-this time.
-
-Add blk_mode_is_open_write() to test FMODE_WRITE / BLK_OPEN_WRITE
-The wrapper function is now used for testing using the appropriate
-method for the kernel, whether the open mode is writable or not.
-
-Emphasize fmode_t arg in zvol_release is not used
-
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Signed-off-by: Coleman Kane <ckane at colemankane.org>
-Closes #15099
----
- config/kernel-blkdev.m4                       | 84 ++++++++++++++++++-
- config/kernel-block-device-operations.m4      | 35 +++++++-
- include/os/linux/kernel/linux/blkdev_compat.h |  6 ++
- module/os/linux/zfs/vdev_disk.c               | 65 ++++++++++++--
- module/os/linux/zfs/zfs_vnops_os.c            |  2 +-
- module/os/linux/zfs/zpl_ctldir.c              |  2 +-
- module/os/linux/zfs/zvol_os.c                 | 28 ++++++-
- 7 files changed, 203 insertions(+), 19 deletions(-)
-
-diff --git a/config/kernel-blkdev.m4 b/config/kernel-blkdev.m4
-index 887acee670ba..e04a2bd2c3b6 100644
---- a/config/kernel-blkdev.m4
-+++ b/config/kernel-blkdev.m4
-@@ -16,12 +16,63 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH], [
- 	])
- ])
- 
-+dnl #
-+dnl # 6.5.x API change,
-+dnl # blkdev_get_by_path() takes 4 args
-+dnl #
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH_4ARG], [
-+	ZFS_LINUX_TEST_SRC([blkdev_get_by_path_4arg], [
-+		#include <linux/fs.h>
-+		#include <linux/blkdev.h>
-+	], [
-+		struct block_device *bdev __attribute__ ((unused)) = NULL;
-+		const char *path = "path";
-+		fmode_t mode = 0;
-+		void *holder = NULL;
-+		struct blk_holder_ops h;
-+
-+		bdev = blkdev_get_by_path(path, mode, holder, &h);
-+	])
-+])
-+
- AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_GET_BY_PATH], [
--	AC_MSG_CHECKING([whether blkdev_get_by_path() exists])
-+	AC_MSG_CHECKING([whether blkdev_get_by_path() exists and takes 3 args])
- 	ZFS_LINUX_TEST_RESULT([blkdev_get_by_path], [
- 		AC_MSG_RESULT(yes)
- 	], [
--		ZFS_LINUX_TEST_ERROR([blkdev_get_by_path()])
-+		AC_MSG_RESULT(no)
-+		AC_MSG_CHECKING([whether blkdev_get_by_path() exists and takes 4 args])
-+		ZFS_LINUX_TEST_RESULT([blkdev_get_by_path_4arg], [
-+			AC_DEFINE(HAVE_BLKDEV_GET_BY_PATH_4ARG, 1,
-+				[blkdev_get_by_path() exists and takes 4 args])
-+			AC_MSG_RESULT(yes)
-+		], [
-+			ZFS_LINUX_TEST_ERROR([blkdev_get_by_path()])
-+		])
-+	])
-+])
-+
-+dnl #
-+dnl # 6.5.x API change
-+dnl # blk_mode_t was added as a type to supercede some places where fmode_t
-+dnl # is used
-+dnl #
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BLK_MODE_T], [
-+	ZFS_LINUX_TEST_SRC([blk_mode_t], [
-+		#include <linux/fs.h>
-+		#include <linux/blkdev.h>
-+	], [
-+		blk_mode_t m __attribute((unused)) = (blk_mode_t)0;
-+	])
-+])
-+
-+AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BLK_MODE_T], [
-+	AC_MSG_CHECKING([whether blk_mode_t is defined])
-+	ZFS_LINUX_TEST_RESULT([blk_mode_t], [
-+		AC_MSG_RESULT(yes)
-+		AC_DEFINE(HAVE_BLK_MODE_T, 1, [blk_mode_t is defined])
-+	], [
-+		AC_MSG_RESULT(no)
- 	])
- ])
- 
-@@ -41,12 +92,35 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_PUT], [
- 	])
- ])
- 
-+dnl #
-+dnl # 6.5.x API change.
-+dnl # blkdev_put() takes (void* holder) as arg 2
-+dnl #
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_PUT_HOLDER], [
-+	ZFS_LINUX_TEST_SRC([blkdev_put_holder], [
-+		#include <linux/fs.h>
-+		#include <linux/blkdev.h>
-+	], [
-+		struct block_device *bdev = NULL;
-+		void *holder = NULL;
-+
-+		blkdev_put(bdev, holder);
-+	])
-+])
-+
- AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_PUT], [
- 	AC_MSG_CHECKING([whether blkdev_put() exists])
- 	ZFS_LINUX_TEST_RESULT([blkdev_put], [
- 		AC_MSG_RESULT(yes)
- 	], [
--		ZFS_LINUX_TEST_ERROR([blkdev_put()])
-+		AC_MSG_CHECKING([whether blkdev_put() accepts void* as arg 2])
-+		ZFS_LINUX_TEST_RESULT([blkdev_put_holder], [
-+			AC_MSG_RESULT(yes)
-+			AC_DEFINE(HAVE_BLKDEV_PUT_HOLDER, 1,
-+				[blkdev_put() accepts void* as arg 2])
-+		], [
-+			ZFS_LINUX_TEST_ERROR([blkdev_put()])
-+		])
- 	])
- ])
- 
-@@ -495,7 +569,9 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BLK_STS_RESV_CONFLICT], [
- 
- AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
- 	ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH
-+	ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH_4ARG
- 	ZFS_AC_KERNEL_SRC_BLKDEV_PUT
-+	ZFS_AC_KERNEL_SRC_BLKDEV_PUT_HOLDER
- 	ZFS_AC_KERNEL_SRC_BLKDEV_REREAD_PART
- 	ZFS_AC_KERNEL_SRC_BLKDEV_INVALIDATE_BDEV
- 	ZFS_AC_KERNEL_SRC_BLKDEV_LOOKUP_BDEV
-@@ -510,6 +586,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
- 	ZFS_AC_KERNEL_SRC_BLKDEV_PART_TO_DEV
- 	ZFS_AC_KERNEL_SRC_BLKDEV_DISK_CHECK_MEDIA_CHANGE
- 	ZFS_AC_KERNEL_SRC_BLKDEV_BLK_STS_RESV_CONFLICT
-+	ZFS_AC_KERNEL_SRC_BLKDEV_BLK_MODE_T
- ])
- 
- AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
-@@ -530,4 +607,5 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
- 	ZFS_AC_KERNEL_BLKDEV_PART_TO_DEV
- 	ZFS_AC_KERNEL_BLKDEV_DISK_CHECK_MEDIA_CHANGE
- 	ZFS_AC_KERNEL_BLKDEV_BLK_STS_RESV_CONFLICT
-+	ZFS_AC_KERNEL_BLKDEV_BLK_MODE_T
- ])
-diff --git a/config/kernel-block-device-operations.m4 b/config/kernel-block-device-operations.m4
-index 84e39dc8a2f6..d13c1337b1fb 100644
---- a/config/kernel-block-device-operations.m4
-+++ b/config/kernel-block-device-operations.m4
-@@ -49,12 +49,42 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
- 	], [], [])
- ])
- 
-+dnl #
-+dnl # 5.9.x API change
-+dnl #
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_1ARG], [
-+	ZFS_LINUX_TEST_SRC([block_device_operations_release_void_1arg], [
-+		#include <linux/blkdev.h>
-+
-+		void blk_release(struct gendisk *g) {
-+			(void) g;
-+			return;
-+		}
-+
-+		static const struct block_device_operations
-+		    bops __attribute__ ((unused)) = {
-+			.open		= NULL,
-+			.release	= blk_release,
-+			.ioctl		= NULL,
-+			.compat_ioctl	= NULL,
-+		};
-+	], [], [])
-+])
-+
- AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
--	AC_MSG_CHECKING([whether bops->release() is void])
-+	AC_MSG_CHECKING([whether bops->release() is void and takes 2 args])
- 	ZFS_LINUX_TEST_RESULT([block_device_operations_release_void], [
- 		AC_MSG_RESULT(yes)
- 	],[
--		ZFS_LINUX_TEST_ERROR([bops->release()])
-+		AC_MSG_RESULT(no)
-+		AC_MSG_CHECKING([whether bops->release() is void and takes 1 arg])
-+		ZFS_LINUX_TEST_RESULT([block_device_operations_release_void_1arg], [
-+			AC_MSG_RESULT(yes)
-+			AC_DEFINE([HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_1ARG], [1],
-+				[Define if release() in block_device_operations takes 1 arg])
-+		],[
-+			ZFS_LINUX_TEST_ERROR([bops->release()])
-+		])
- 	])
- ])
- 
-@@ -92,6 +122,7 @@ AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [
- AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS], [
- 	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS
- 	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
-+	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_1ARG
- 	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK
- ])
- 
-diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h
-index 1641dd92a918..f111e648ccf7 100644
---- a/include/os/linux/kernel/linux/blkdev_compat.h
-+++ b/include/os/linux/kernel/linux/blkdev_compat.h
-@@ -398,6 +398,12 @@ vdev_lookup_bdev(const char *path, dev_t *dev)
- #endif
- }
- 
-+#if defined(HAVE_BLK_MODE_T)
-+#define	blk_mode_is_open_write(flag)	((flag) & BLK_OPEN_WRITE)
-+#else
-+#define	blk_mode_is_open_write(flag)	((flag) & FMODE_WRITE)
-+#endif
-+
- /*
-  * Kernels without bio_set_op_attrs use bi_rw for the bio flags.
-  */
-diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
-index 925ee9d9fe9c..48ac55f07034 100644
---- a/module/os/linux/zfs/vdev_disk.c
-+++ b/module/os/linux/zfs/vdev_disk.c
-@@ -80,9 +80,22 @@ typedef struct dio_request {
- 
- static unsigned int zfs_vdev_failfast_mask = 1;
- 
-+#ifdef HAVE_BLK_MODE_T
-+static blk_mode_t
-+#else
- static fmode_t
-+#endif
- vdev_bdev_mode(spa_mode_t spa_mode)
- {
-+#ifdef HAVE_BLK_MODE_T
-+	blk_mode_t mode = 0;
-+
-+	if (spa_mode & SPA_MODE_READ)
-+		mode |= BLK_OPEN_READ;
-+
-+	if (spa_mode & SPA_MODE_WRITE)
-+		mode |= BLK_OPEN_WRITE;
-+#else
- 	fmode_t mode = 0;
- 
- 	if (spa_mode & SPA_MODE_READ)
-@@ -90,6 +103,7 @@ vdev_bdev_mode(spa_mode_t spa_mode)
- 
- 	if (spa_mode & SPA_MODE_WRITE)
- 		mode |= FMODE_WRITE;
-+#endif
- 
- 	return (mode);
- }
-@@ -197,12 +211,47 @@ vdev_disk_kobj_evt_post(vdev_t *v)
- 	}
- }
- 
-+#if !defined(HAVE_BLKDEV_GET_BY_PATH_4ARG)
-+/*
-+ * Define a dummy struct blk_holder_ops for kernel versions
-+ * prior to 6.5.
-+ */
-+struct blk_holder_ops {};
-+#endif
-+
-+static struct block_device *
-+vdev_blkdev_get_by_path(const char *path, spa_mode_t mode, void *holder,
-+    const struct blk_holder_ops *hops)
-+{
-+#ifdef HAVE_BLKDEV_GET_BY_PATH_4ARG
-+	return (blkdev_get_by_path(path,
-+	    vdev_bdev_mode(mode) | BLK_OPEN_EXCL, holder, hops));
-+#else
-+	return (blkdev_get_by_path(path,
-+	    vdev_bdev_mode(mode) | FMODE_EXCL, holder));
-+#endif
-+}
-+
-+static void
-+vdev_blkdev_put(struct block_device *bdev, spa_mode_t mode, void *holder)
-+{
-+#ifdef HAVE_BLKDEV_PUT_HOLDER
-+	return (blkdev_put(bdev, holder));
-+#else
-+	return (blkdev_put(bdev, vdev_bdev_mode(mode) | FMODE_EXCL));
-+#endif
-+}
-+
- static int
- vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
-     uint64_t *logical_ashift, uint64_t *physical_ashift)
- {
- 	struct block_device *bdev;
-+#ifdef HAVE_BLK_MODE_T
-+	blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa));
-+#else
- 	fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa));
-+#endif
- 	hrtime_t timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms);
- 	vdev_disk_t *vd;
- 
-@@ -252,15 +301,15 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
- 					reread_part = B_TRUE;
- 			}
- 
--			blkdev_put(bdev, mode | FMODE_EXCL);
-+			vdev_blkdev_put(bdev, mode, zfs_vdev_holder);
- 		}
- 
- 		if (reread_part) {
--			bdev = blkdev_get_by_path(disk_name, mode | FMODE_EXCL,
--			    zfs_vdev_holder);
-+			bdev = vdev_blkdev_get_by_path(disk_name, mode,
-+			    zfs_vdev_holder, NULL);
- 			if (!IS_ERR(bdev)) {
- 				int error = vdev_bdev_reread_part(bdev);
--				blkdev_put(bdev, mode | FMODE_EXCL);
-+				vdev_blkdev_put(bdev, mode, zfs_vdev_holder);
- 				if (error == 0) {
- 					timeout = MSEC2NSEC(
- 					    zfs_vdev_open_timeout_ms * 2);
-@@ -305,8 +354,8 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
- 	hrtime_t start = gethrtime();
- 	bdev = ERR_PTR(-ENXIO);
- 	while (IS_ERR(bdev) && ((gethrtime() - start) < timeout)) {
--		bdev = blkdev_get_by_path(v->vdev_path, mode | FMODE_EXCL,
--		    zfs_vdev_holder);
-+		bdev = vdev_blkdev_get_by_path(v->vdev_path, mode,
-+		    zfs_vdev_holder, NULL);
- 		if (unlikely(PTR_ERR(bdev) == -ENOENT)) {
- 			/*
- 			 * There is no point of waiting since device is removed
-@@ -382,8 +431,8 @@ vdev_disk_close(vdev_t *v)
- 		return;
- 
- 	if (vd->vd_bdev != NULL) {
--		blkdev_put(vd->vd_bdev,
--		    vdev_bdev_mode(spa_mode(v->vdev_spa)) | FMODE_EXCL);
-+		vdev_blkdev_put(vd->vd_bdev, spa_mode(v->vdev_spa),
-+		    zfs_vdev_holder);
- 	}
- 
- 	rw_destroy(&vd->vd_lock);
-diff --git a/module/os/linux/zfs/zfs_vnops_os.c b/module/os/linux/zfs/zfs_vnops_os.c
-index 234c4d5ef0e0..33baac9db06b 100644
---- a/module/os/linux/zfs/zfs_vnops_os.c
-+++ b/module/os/linux/zfs/zfs_vnops_os.c
-@@ -186,7 +186,7 @@ zfs_open(struct inode *ip, int mode, int flag, cred_t *cr)
- 		return (error);
- 
- 	/* Honor ZFS_APPENDONLY file attribute */
--	if ((mode & FMODE_WRITE) && (zp->z_pflags & ZFS_APPENDONLY) &&
-+	if (blk_mode_is_open_write(mode) && (zp->z_pflags & ZFS_APPENDONLY) &&
- 	    ((flag & O_APPEND) == 0)) {
- 		zfs_exit(zfsvfs, FTAG);
- 		return (SET_ERROR(EPERM));
-diff --git a/module/os/linux/zfs/zpl_ctldir.c b/module/os/linux/zfs/zpl_ctldir.c
-index 68a7de78f471..7786444fea35 100644
---- a/module/os/linux/zfs/zpl_ctldir.c
-+++ b/module/os/linux/zfs/zpl_ctldir.c
-@@ -42,7 +42,7 @@
- static int
- zpl_common_open(struct inode *ip, struct file *filp)
- {
--	if (filp->f_mode & FMODE_WRITE)
-+	if (blk_mode_is_open_write(filp->f_mode))
- 		return (-EACCES);
- 
- 	return (generic_file_open(ip, filp));
-diff --git a/module/os/linux/zfs/zvol_os.c b/module/os/linux/zfs/zvol_os.c
-index 38bc8e2c4eeb..7a95b54bdf0d 100644
---- a/module/os/linux/zfs/zvol_os.c
-+++ b/module/os/linux/zfs/zvol_os.c
-@@ -671,7 +671,11 @@ zvol_request(struct request_queue *q, struct bio *bio)
- }
- 
- static int
-+#ifdef HAVE_BLK_MODE_T
-+zvol_open(struct gendisk *disk, blk_mode_t flag)
-+#else
- zvol_open(struct block_device *bdev, fmode_t flag)
-+#endif
- {
- 	zvol_state_t *zv;
- 	int error = 0;
-@@ -686,10 +690,14 @@ zvol_open(struct block_device *bdev, fmode_t flag)
- 	/*
- 	 * Obtain a copy of private_data under the zvol_state_lock to make
- 	 * sure that either the result of zvol free code path setting
--	 * bdev->bd_disk->private_data to NULL is observed, or zvol_os_free()
-+	 * disk->private_data to NULL is observed, or zvol_os_free()
- 	 * is not called on this zv because of the positive zv_open_count.
- 	 */
-+#ifdef HAVE_BLK_MODE_T
-+	zv = disk->private_data;
-+#else
- 	zv = bdev->bd_disk->private_data;
-+#endif
- 	if (zv == NULL) {
- 		rw_exit(&zvol_state_lock);
- 		return (SET_ERROR(-ENXIO));
-@@ -769,14 +777,15 @@ zvol_open(struct block_device *bdev, fmode_t flag)
- 			}
- 		}
- 
--		error = -zvol_first_open(zv, !(flag & FMODE_WRITE));
-+		error = -zvol_first_open(zv, !(blk_mode_is_open_write(flag)));
- 
- 		if (drop_namespace)
- 			mutex_exit(&spa_namespace_lock);
- 	}
- 
- 	if (error == 0) {
--		if ((flag & FMODE_WRITE) && (zv->zv_flags & ZVOL_RDONLY)) {
-+		if ((blk_mode_is_open_write(flag)) &&
-+		    (zv->zv_flags & ZVOL_RDONLY)) {
- 			if (zv->zv_open_count == 0)
- 				zvol_last_close(zv);
- 
-@@ -791,14 +800,25 @@ zvol_open(struct block_device *bdev, fmode_t flag)
- 		rw_exit(&zv->zv_suspend_lock);
- 
- 	if (error == 0)
-+#ifdef HAVE_BLK_MODE_T
-+		disk_check_media_change(disk);
-+#else
- 		zfs_check_media_change(bdev);
-+#endif
- 
- 	return (error);
- }
- 
- static void
--zvol_release(struct gendisk *disk, fmode_t mode)
-+#ifdef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_1ARG
-+zvol_release(struct gendisk *disk)
-+#else
-+zvol_release(struct gendisk *disk, fmode_t unused)
-+#endif
- {
-+#if !defined(HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_1ARG)
-+	(void) unused;
-+#endif
- 	zvol_state_t *zv;
- 	boolean_t drop_suspend = B_TRUE;
- 
-From e47e9bbe86f2e8fe5da0fc7c3a9014e1f8c132a9 Mon Sep 17 00:00:00 2001
-From: Coleman Kane <ckane at colemankane.org>
-Date: Wed, 2 Aug 2023 17:05:46 -0400
-Subject: [PATCH] Linux 6.5 compat: register_sysctl_table removed
-
-Additionally, the .child element of ctl_table has been removed in 6.5.
-This change adds a new test for the pre-6.5 register_sysctl_table()
-function, and uses the old code in that case. If it isn't found, then
-the parentage entries in the tables are removed, and the register_sysctl
-call is provided the paths of "kernel/spl", "kernel/spl/kmem", and
-"kernel/spl/kstat" directly, to populate each subdirectory over three
-calls, as is the new API.
-
-Reviewed-by: Brian Atkinson <batkinson at lanl.gov>
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Signed-off-by: Coleman Kane <ckane at colemankane.org>
-Closes #15138
----
- config/kernel-register_sysctl_table.m4 | 27 ++++++++++++++++++++++++++
- config/kernel.m4                       |  2 ++
- module/os/linux/spl/spl-proc.c         | 26 ++++++++++++++++++++++---
- 3 files changed, 52 insertions(+), 3 deletions(-)
- create mode 100644 config/kernel-register_sysctl_table.m4
-
-diff --git a/config/kernel-register_sysctl_table.m4 b/config/kernel-register_sysctl_table.m4
-new file mode 100644
-index 000000000000..a5e934f56d29
---- /dev/null
-+++ b/config/kernel-register_sysctl_table.m4
-@@ -0,0 +1,27 @@
-+dnl #
-+dnl # Linux 6.5 removes register_sysctl_table
-+dnl #
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE], [
-+	ZFS_LINUX_TEST_SRC([has_register_sysctl_table], [
-+		#include <linux/sysctl.h>
-+
-+		static struct ctl_table dummy_table[] = {
-+			{}
-+		};
-+
-+    ],[
-+		struct ctl_table_header *h
-+			__attribute((unused)) = register_sysctl_table(dummy_table);
-+    ])
-+])
-+
-+AC_DEFUN([ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE], [
-+	AC_MSG_CHECKING([whether register_sysctl_table exists])
-+	ZFS_LINUX_TEST_RESULT([has_register_sysctl_table], [
-+		AC_MSG_RESULT([yes])
-+		AC_DEFINE(HAVE_REGISTER_SYSCTL_TABLE, 1,
-+			[register_sysctl_table exists])
-+	],[
-+		AC_MSG_RESULT([no])
-+	])
-+])
-diff --git a/config/kernel.m4 b/config/kernel.m4
-index 1487fa2e7793..28bd361d33ff 100644
---- a/config/kernel.m4
-+++ b/config/kernel.m4
-@@ -160,6 +160,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
- 	ZFS_AC_KERNEL_SRC_FILEMAP
- 	ZFS_AC_KERNEL_SRC_WRITEPAGE_T
- 	ZFS_AC_KERNEL_SRC_RECLAIMED
-+	ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE
- 	case "$host_cpu" in
- 		powerpc*)
- 			ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
-@@ -299,6 +300,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
- 	ZFS_AC_KERNEL_FILEMAP
- 	ZFS_AC_KERNEL_WRITEPAGE_T
- 	ZFS_AC_KERNEL_RECLAIMED
-+	ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
- 	case "$host_cpu" in
- 		powerpc*)
- 			ZFS_AC_KERNEL_CPU_HAS_FEATURE
-diff --git a/module/os/linux/spl/spl-proc.c b/module/os/linux/spl/spl-proc.c
-index 01f5619e1893..bcc356ae55b6 100644
---- a/module/os/linux/spl/spl-proc.c
-+++ b/module/os/linux/spl/spl-proc.c
-@@ -624,6 +624,7 @@ static struct ctl_table spl_table[] = {
- 		.mode		= 0644,
- 		.proc_handler	= &proc_dohostid,
- 	},
-+#ifdef HAVE_REGISTER_SYSCTL_TABLE
- 	{
- 		.procname	= "kmem",
- 		.mode		= 0555,
-@@ -634,9 +635,11 @@ static struct ctl_table spl_table[] = {
- 		.mode		= 0555,
- 		.child		= spl_kstat_table,
- 	},
-+#endif
- 	{},
- };
- 
-+#ifdef HAVE_REGISTER_SYSCTL_TABLE
- static struct ctl_table spl_dir[] = {
- 	{
- 		.procname	= "spl",
-@@ -648,21 +651,38 @@ static struct ctl_table spl_dir[] = {
- 
- static struct ctl_table spl_root[] = {
- 	{
--	.procname = "kernel",
--	.mode = 0555,
--	.child = spl_dir,
-+		.procname	= "kernel",
-+		.mode		= 0555,
-+		.child		= spl_dir,
- 	},
- 	{}
- };
-+#endif
- 
- int
- spl_proc_init(void)
- {
- 	int rc = 0;
- 
-+#ifdef HAVE_REGISTER_SYSCTL_TABLE
- 	spl_header = register_sysctl_table(spl_root);
- 	if (spl_header == NULL)
- 		return (-EUNATCH);
-+#else
-+	spl_header = register_sysctl("kernel/spl", spl_table);
-+	if (spl_header == NULL)
-+		return (-EUNATCH);
-+
-+	if (register_sysctl("kernel/spl/kmem", spl_kmem_table) == NULL) {
-+		rc = -EUNATCH;
-+		goto out;
-+	}
-+
-+	if (register_sysctl("kernel/spl/kstat", spl_kstat_table) == NULL) {
-+		rc = -EUNATCH;
-+		goto out;
-+	}
-+#endif
- 
- 	proc_spl = proc_mkdir("spl", NULL);
- 	if (proc_spl == NULL) {
-From 36261c8238df462b214854ccea1df4f060cf0995 Mon Sep 17 00:00:00 2001
-From: Coleman Kane <ckane at colemankane.org>
-Date: Mon, 7 Aug 2023 18:47:46 -0400
-Subject: [PATCH] Linux 6.5 compat: replace generic_file_splice_read with
- filemap_splice_read
-
-The generic_file_splice_read function was removed in Linux 6.5 in favor
-of filemap_splice_read. Add an autoconf test for filemap_splice_read and
-use it if it is found as the handler for .splice_read in the
-file_operations struct. Additionally, ITER_PIPE was removed in 6.5. This
-change removes the ITER_* macros that OpenZFS doesn't use from being
-tested in config/kernel-vfs-iov_iter.m4. The removal of ITER_PIPE was
-causing the test to fail, which also affected the code responsible for
-setting the .splice_read handler, above. That behavior caused run-time
-panics on Linux 6.5.
-
-Reviewed-by: Brian Atkinson <batkinson at lanl.gov>
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Signed-off-by: Coleman Kane <ckane at colemankane.org>
-Closes #15155
----
- config/kernel-filemap-splice-read.m4 | 25 +++++++++++++++++++++++++
- config/kernel-vfs-iov_iter.m4        |  3 +--
- config/kernel.m4                     |  2 ++
- module/os/linux/zfs/zpl_file.c       |  4 ++++
- 4 files changed, 32 insertions(+), 2 deletions(-)
- create mode 100644 config/kernel-filemap-splice-read.m4
-
-diff --git a/config/kernel-filemap-splice-read.m4 b/config/kernel-filemap-splice-read.m4
-new file mode 100644
-index 000000000000..5199b7373e4d
---- /dev/null
-+++ b/config/kernel-filemap-splice-read.m4
-@@ -0,0 +1,25 @@
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_FILEMAP_SPLICE_READ], [
-+	dnl #
-+	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 # file_operations struct.
-+	dnl #
-+	ZFS_LINUX_TEST_SRC([has_filemap_splice_read], [
-+		#include <linux/fs.h>
-+
-+		struct file_operations fops __attribute__((unused)) = {
-+			.splice_read = filemap_splice_read,
-+		};
-+	],[])
-+])
-+
-+AC_DEFUN([ZFS_AC_KERNEL_FILEMAP_SPLICE_READ], [
-+	AC_MSG_CHECKING([whether filemap_splice_read() exists])
-+	ZFS_LINUX_TEST_RESULT([has_filemap_splice_read], [
-+		AC_MSG_RESULT(yes)
-+		AC_DEFINE(HAVE_FILEMAP_SPLICE_READ, 1,
-+		    [filemap_splice_read exists])
-+	],[
-+		AC_MSG_RESULT(no)
-+	])
-+])
-diff --git a/config/kernel-vfs-iov_iter.m4 b/config/kernel-vfs-iov_iter.m4
-index cc5a7ab0c237..ff560ff3eef0 100644
---- a/config/kernel-vfs-iov_iter.m4
-+++ b/config/kernel-vfs-iov_iter.m4
-@@ -6,8 +6,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_IOV_ITER], [
- 		#include <linux/fs.h>
- 		#include <linux/uio.h>
- 	],[
--		int type __attribute__ ((unused)) =
--		    ITER_IOVEC | ITER_KVEC | ITER_BVEC | ITER_PIPE;
-+		int type __attribute__ ((unused)) = ITER_KVEC;
- 	])
- 
- 	ZFS_LINUX_TEST_SRC([iov_iter_advance], [
-diff --git a/config/kernel.m4 b/config/kernel.m4
-index 28bd361d33ff..309f1819be48 100644
---- a/config/kernel.m4
-+++ b/config/kernel.m4
-@@ -161,6 +161,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
- 	ZFS_AC_KERNEL_SRC_WRITEPAGE_T
- 	ZFS_AC_KERNEL_SRC_RECLAIMED
- 	ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE
-+	ZFS_AC_KERNEL_SRC_FILEMAP_SPLICE_READ
- 	case "$host_cpu" in
- 		powerpc*)
- 			ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
-@@ -301,6 +302,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
- 	ZFS_AC_KERNEL_WRITEPAGE_T
- 	ZFS_AC_KERNEL_RECLAIMED
- 	ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
-+	ZFS_AC_KERNEL_FILEMAP_SPLICE_READ
- 	case "$host_cpu" in
- 		powerpc*)
- 			ZFS_AC_KERNEL_CPU_HAS_FEATURE
-diff --git a/module/os/linux/zfs/zpl_file.c b/module/os/linux/zfs/zpl_file.c
-index f6af2ebd1163..24cc1064a8fc 100644
---- a/module/os/linux/zfs/zpl_file.c
-+++ b/module/os/linux/zfs/zpl_file.c
-@@ -1323,7 +1323,11 @@ const struct file_operations zpl_file_operations = {
- 	.read_iter	= zpl_iter_read,
- 	.write_iter	= zpl_iter_write,
- #ifdef HAVE_VFS_IOV_ITER
-+#ifdef HAVE_FILEMAP_SPLICE_READ
-+	.splice_read	= filemap_splice_read,
-+#else
- 	.splice_read	= generic_file_splice_read,
-+#endif
- 	.splice_write	= iter_file_splice_write,
- #endif
- #else
-From 8ce2eba9e6a384feef93d77c397f37d17dc588ce Mon Sep 17 00:00:00 2001
-From: Coleman Kane <ckane at colemankane.org>
-Date: Tue, 8 Aug 2023 18:42:32 -0400
-Subject: [PATCH] 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 at lanl.gov>
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Signed-off-by: Coleman Kane <ckane at colemankane.org>
-Closes #15164
----
- config/kernel-filemap-splice-read.m4 | 18 +++++++++---------
- config/kernel.m4                     |  4 ++--
- module/os/linux/zfs/zpl_file.c       |  4 ++--
- 3 files changed, 13 insertions(+), 13 deletions(-)
-
-diff --git a/config/kernel-filemap-splice-read.m4 b/config/kernel-filemap-splice-read.m4
-index 5199b7373e4d..4c83b31d738a 100644
---- a/config/kernel-filemap-splice-read.m4
-+++ b/config/kernel-filemap-splice-read.m4
-@@ -1,24 +1,24 @@
--AC_DEFUN([ZFS_AC_KERNEL_SRC_FILEMAP_SPLICE_READ], [
-+AC_DEFUN([ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ], [
- 	dnl #
- 	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 #
--	ZFS_LINUX_TEST_SRC([has_filemap_splice_read], [
-+	ZFS_LINUX_TEST_SRC([has_copy_splice_read], [
- 		#include <linux/fs.h>
- 
- 		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_MSG_CHECKING([whether filemap_splice_read() exists])
--	ZFS_LINUX_TEST_RESULT([has_filemap_splice_read], [
-+AC_DEFUN([ZFS_AC_KERNEL_COPY_SPLICE_READ], [
-+	AC_MSG_CHECKING([whether copy_splice_read() exists])
-+	ZFS_LINUX_TEST_RESULT([has_copy_splice_read], [
- 		AC_MSG_RESULT(yes)
--		AC_DEFINE(HAVE_FILEMAP_SPLICE_READ, 1,
--		    [filemap_splice_read exists])
-+		AC_DEFINE(HAVE_COPY_SPLICE_READ, 1,
-+		    [copy_splice_read exists])
- 	],[
- 		AC_MSG_RESULT(no)
- 	])
-diff --git a/config/kernel.m4 b/config/kernel.m4
-index 309f1819be48..df194ec72207 100644
---- a/config/kernel.m4
-+++ b/config/kernel.m4
-@@ -161,7 +161,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
- 	ZFS_AC_KERNEL_SRC_WRITEPAGE_T
- 	ZFS_AC_KERNEL_SRC_RECLAIMED
- 	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
- 		powerpc*)
- 			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_RECLAIMED
- 	ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
--	ZFS_AC_KERNEL_FILEMAP_SPLICE_READ
-+	ZFS_AC_KERNEL_COPY_SPLICE_READ
- 	case "$host_cpu" in
- 		powerpc*)
- 			ZFS_AC_KERNEL_CPU_HAS_FEATURE
-diff --git a/module/os/linux/zfs/zpl_file.c b/module/os/linux/zfs/zpl_file.c
-index 24cc1064a8fc..3caa0fc6c214 100644
---- a/module/os/linux/zfs/zpl_file.c
-+++ b/module/os/linux/zfs/zpl_file.c
-@@ -1323,8 +1323,8 @@ const struct file_operations zpl_file_operations = {
- 	.read_iter	= zpl_iter_read,
- 	.write_iter	= zpl_iter_write,
- #ifdef HAVE_VFS_IOV_ITER
--#ifdef HAVE_FILEMAP_SPLICE_READ
--	.splice_read	= filemap_splice_read,
-+#ifdef HAVE_COPY_SPLICE_READ
-+	.splice_read	= copy_splice_read,
- #else
- 	.splice_read	= generic_file_splice_read,
- #endif
-From bcb1159c095f57564914b59f5e7e82170261afb0 Mon Sep 17 00:00:00 2001
-From: Andrea Righi <andrea.righi at canonical.com>
-Date: Sat, 2 Sep 2023 02:21:40 +0200
-Subject: [PATCH] Linux 6.5 compat: safe cleanup in spl_proc_fini()
-
-If we fail to create a proc entry in spl_proc_init() we may end up
-calling unregister_sysctl_table() twice: one in the failure path of
-spl_proc_init() and another time during spl_proc_fini().
-
-Avoid the double call to unregister_sysctl_table() and while at it
-refactor the code a bit to reduce code duplication.
-
-This was accidentally introduced when the spl code was
-updated for Linux 6.5 compatibility.
-
-Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
-Reviewed-by: Ameer Hamza <ahamza at ixsystems.com>
-Signed-off-by: Andrea Righi <andrea.righi at canonical.com>
-Closes #15234
-Closes #15235
----
- module/os/linux/spl/spl-proc.c | 36 +++++++++++++++++-----------------
- 1 file changed, 18 insertions(+), 18 deletions(-)
-
-diff --git a/module/os/linux/spl/spl-proc.c b/module/os/linux/spl/spl-proc.c
-index bcc356ae55b6..5cb5a6dadb05 100644
---- a/module/os/linux/spl/spl-proc.c
-+++ b/module/os/linux/spl/spl-proc.c
-@@ -659,6 +659,21 @@ static struct ctl_table spl_root[] = {
- };
- #endif
- 
-+static void spl_proc_cleanup(void)
-+{
-+	remove_proc_entry("kstat", proc_spl);
-+	remove_proc_entry("slab", proc_spl_kmem);
-+	remove_proc_entry("kmem", proc_spl);
-+	remove_proc_entry("taskq-all", proc_spl);
-+	remove_proc_entry("taskq", proc_spl);
-+	remove_proc_entry("spl", NULL);
-+
-+	if (spl_header) {
-+		unregister_sysctl_table(spl_header);
-+		spl_header = NULL;
-+	}
-+}
-+
- int
- spl_proc_init(void)
- {
-@@ -723,15 +738,8 @@ spl_proc_init(void)
- 		goto out;
- 	}
- out:
--	if (rc) {
--		remove_proc_entry("kstat", proc_spl);
--		remove_proc_entry("slab", proc_spl_kmem);
--		remove_proc_entry("kmem", proc_spl);
--		remove_proc_entry("taskq-all", proc_spl);
--		remove_proc_entry("taskq", proc_spl);
--		remove_proc_entry("spl", NULL);
--		unregister_sysctl_table(spl_header);
--	}
-+	if (rc)
-+		spl_proc_cleanup();
- 
- 	return (rc);
- }
-@@ -739,13 +747,5 @@ spl_proc_init(void)
- void
- spl_proc_fini(void)
- {
--	remove_proc_entry("kstat", proc_spl);
--	remove_proc_entry("slab", proc_spl_kmem);
--	remove_proc_entry("kmem", proc_spl);
--	remove_proc_entry("taskq-all", proc_spl);
--	remove_proc_entry("taskq", proc_spl);
--	remove_proc_entry("spl", NULL);
--
--	ASSERT(spl_header != NULL);
--	unregister_sysctl_table(spl_header);
-+	spl_proc_cleanup();
- }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/zfs.git/commitdiff/bf636acc1e71cd78273831c01b7a5138b668ce56




More information about the pld-cvs-commit mailing list