mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 11:19:32 +03:00
d76de9fb17
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
|
|
])
|