From 08f57a31507274fd19c3fe207ffca21b3d1fcf74 Mon Sep 17 00:00:00 2001 From: Ryan Lahfa Date: Fri, 21 Jun 2024 00:39:40 +0200 Subject: [PATCH] Linux 6.9 compat: fput for block device release With new file-driven API, it is sufficient to `fput` the block device handle to release it. Signed-off-by: Ryan Lahfa --- config/kernel-blkdev.m4 | 24 +++++++++++++++++++++++- module/os/linux/zfs/vdev_disk.c | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/config/kernel-blkdev.m4 b/config/kernel-blkdev.m4 index b3bc5739ad..88b2f69cc4 100644 --- a/config/kernel-blkdev.m4 +++ b/config/kernel-blkdev.m4 @@ -178,6 +178,20 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_RELEASE], [ ]) ]) +dnl # +dnl # 6.9.x API change +dnl # fput() replaces bdev_release() +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_FPUT], [ + ZFS_LINUX_TEST_SRC([fput], [ + #include + #include + ], [ + struct file *f = NULL; + fput(f); + ]) +]) + AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_PUT], [ AC_MSG_CHECKING([whether blkdev_put() exists]) ZFS_LINUX_TEST_RESULT([blkdev_put], [ @@ -197,7 +211,14 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_PUT], [ AC_DEFINE(HAVE_BDEV_RELEASE, 1, [bdev_release() exists]) ], [ - ZFS_LINUX_TEST_ERROR([blkdev_put()]) + ZFS_LINUX_TEST_RESULT([fput], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_BDEV_RELEASE_VIA_FPUT, 1, + [fput() can release a block device and exists] + ) + ], [ + ZFS_LINUX_TEST_ERROR([blkdev_put()]) + ]) ]) ]) ]) @@ -654,6 +675,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [ ZFS_AC_KERNEL_SRC_BLKDEV_PUT ZFS_AC_KERNEL_SRC_BLKDEV_PUT_HOLDER ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_RELEASE + ZFS_AC_KERNEL_SRC_BLKDEV_FPUT ZFS_AC_KERNEL_SRC_BLKDEV_REREAD_PART ZFS_AC_KERNEL_SRC_BLKDEV_INVALIDATE_BDEV ZFS_AC_KERNEL_SRC_BLKDEV_LOOKUP_BDEV diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c index 9f5b526d72..da30dfad5a 100644 --- a/module/os/linux/zfs/vdev_disk.c +++ b/module/os/linux/zfs/vdev_disk.c @@ -263,6 +263,8 @@ vdev_blkdev_put(zfs_bdev_handle_t *bdh, spa_mode_t mode, void *holder) { #if defined(HAVE_BDEV_RELEASE) return (bdev_release(bdh)); +#elif defined(HAVE_BDEV_RELEASE_VIA_FPUT) + return (fput(bdh)); #elif defined(HAVE_BLKDEV_PUT_HOLDER) return (blkdev_put(BDH_BDEV(bdh), holder)); #else