mirror of
				https://git.proxmox.com/git/mirror_zfs
				synced 2025-11-04 07:10:11 +00:00 
			
		
		
		
	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@llnl.gov> Signed-off-by: Coleman Kane <ckane@colemankane.org> Closes #15099
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
dnl #
 | 
						|
dnl # 2.6.38 API change
 | 
						|
dnl #
 | 
						|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS], [
 | 
						|
	ZFS_LINUX_TEST_SRC([block_device_operations_check_events], [
 | 
						|
		#include <linux/blkdev.h>
 | 
						|
 | 
						|
		unsigned int blk_check_events(struct gendisk *disk,
 | 
						|
		    unsigned int clearing) {
 | 
						|
			(void) disk, (void) clearing;
 | 
						|
			return (0);
 | 
						|
		}
 | 
						|
 | 
						|
		static const struct block_device_operations
 | 
						|
		    bops __attribute__ ((unused)) = {
 | 
						|
			.check_events	= blk_check_events,
 | 
						|
		};
 | 
						|
	], [], [])
 | 
						|
])
 | 
						|
 | 
						|
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS], [
 | 
						|
	AC_MSG_CHECKING([whether bops->check_events() exists])
 | 
						|
	ZFS_LINUX_TEST_RESULT([block_device_operations_check_events], [
 | 
						|
		AC_MSG_RESULT(yes)
 | 
						|
	],[
 | 
						|
		ZFS_LINUX_TEST_ERROR([bops->check_events()])
 | 
						|
	])
 | 
						|
])
 | 
						|
 | 
						|
dnl #
 | 
						|
dnl # 3.10.x API change
 | 
						|
dnl #
 | 
						|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
 | 
						|
	ZFS_LINUX_TEST_SRC([block_device_operations_release_void], [
 | 
						|
		#include <linux/blkdev.h>
 | 
						|
 | 
						|
		void blk_release(struct gendisk *g, fmode_t mode) {
 | 
						|
			(void) g, (void) mode;
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		static const struct block_device_operations
 | 
						|
		    bops __attribute__ ((unused)) = {
 | 
						|
			.open		= NULL,
 | 
						|
			.release	= blk_release,
 | 
						|
			.ioctl		= NULL,
 | 
						|
			.compat_ioctl	= NULL,
 | 
						|
		};
 | 
						|
	], [], [])
 | 
						|
])
 | 
						|
 | 
						|
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 and takes 2 args])
 | 
						|
	ZFS_LINUX_TEST_RESULT([block_device_operations_release_void], [
 | 
						|
		AC_MSG_RESULT(yes)
 | 
						|
	],[
 | 
						|
		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()])
 | 
						|
		])
 | 
						|
	])
 | 
						|
])
 | 
						|
 | 
						|
dnl #
 | 
						|
dnl # 5.13 API change
 | 
						|
dnl # block_device_operations->revalidate_disk() was removed
 | 
						|
dnl #
 | 
						|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [
 | 
						|
	ZFS_LINUX_TEST_SRC([block_device_operations_revalidate_disk], [
 | 
						|
		#include <linux/blkdev.h>
 | 
						|
 | 
						|
		int blk_revalidate_disk(struct gendisk *disk) {
 | 
						|
			(void) disk;
 | 
						|
			return(0);
 | 
						|
		}
 | 
						|
 | 
						|
		static const struct block_device_operations
 | 
						|
		    bops __attribute__ ((unused)) = {
 | 
						|
			.revalidate_disk	= blk_revalidate_disk,
 | 
						|
		};
 | 
						|
	], [], [])
 | 
						|
])
 | 
						|
 | 
						|
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [
 | 
						|
	AC_MSG_CHECKING([whether bops->revalidate_disk() exists])
 | 
						|
	ZFS_LINUX_TEST_RESULT([block_device_operations_revalidate_disk], [
 | 
						|
		AC_DEFINE([HAVE_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [1],
 | 
						|
			[Define if revalidate_disk() in block_device_operations])
 | 
						|
		AC_MSG_RESULT(yes)
 | 
						|
	],[
 | 
						|
		AC_MSG_RESULT(no)
 | 
						|
	])
 | 
						|
])
 | 
						|
 | 
						|
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
 | 
						|
])
 | 
						|
 | 
						|
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS], [
 | 
						|
	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS
 | 
						|
	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
 | 
						|
	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK
 | 
						|
])
 |