From 980aca470c229b2fd238076e9c3c4d285c20279a Mon Sep 17 00:00:00 2001 From: Ryan Lahfa Date: Fri, 21 Jun 2024 00:54:58 +0200 Subject: [PATCH] Linux 6.9 compat: blk_alloc_disk takes 2 args Now, it takes queue limits, this is a trivial implementation with no queue limits, implementing proper queue limits is left as an exercise to the reader. Signed-off-by: Ryan Lahfa --- config/kernel-make-request-fn.m4 | 50 +++++++++++++++++++++++--------- module/os/linux/zfs/zvol_os.c | 4 +++ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/config/kernel-make-request-fn.m4 b/config/kernel-make-request-fn.m4 index 4d20dd45c4..ef79612f9d 100644 --- a/config/kernel-make-request-fn.m4 +++ b/config/kernel-make-request-fn.m4 @@ -50,6 +50,13 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN], [ disk = blk_alloc_disk(NUMA_NO_NODE); ]) + ZFS_LINUX_TEST_SRC([blk_alloc_disk_2args], [ + #include + ],[ + struct gendisk *disk __attribute__ ((unused)); + disk = blk_alloc_disk(NULL, NUMA_NO_NODE); + ]) + ZFS_LINUX_TEST_SRC([blk_cleanup_disk], [ #include ],[ @@ -71,30 +78,45 @@ AC_DEFUN([ZFS_AC_KERNEL_MAKE_REQUEST_FN], [ AC_DEFINE(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS, 1, [submit_bio is member of struct block_device_operations]) + dnl + dnl # Linux 6.9 API change + dnl # blk_alloc_disk() takes 2 arguments: + dnl # a queue limit and NUMA node ID. dnl # - dnl # Linux 5.14 API Change: - dnl # blk_alloc_queue() + alloc_disk() combo replaced by - dnl # a single call to blk_alloc_disk(). - dnl # - AC_MSG_CHECKING([whether blk_alloc_disk() exists]) - ZFS_LINUX_TEST_RESULT([blk_alloc_disk], [ + AC_MSG_CHECKING([whether blk_alloc_disk() takes 2 args]) + ZFS_LINUX_TEST_RESULT([blk_alloc_disk_2args], [ AC_MSG_RESULT(yes) AC_DEFINE([HAVE_BLK_ALLOC_DISK], 1, [blk_alloc_disk() exists]) + AC_DEFINE([HAVE_BLK_ALLOC_DISK_2ARGS], 1, [blk_alloc_disk() takes 2 args]) + dnl # put_disk() should be used in 6.9. + ], [ + AC_MSG_RESULT(no) dnl # - dnl # 5.20 API change, - dnl # Removed blk_cleanup_disk(), put_disk() should be used. + dnl # Linux 5.14 API Change: + dnl # blk_alloc_queue() + alloc_disk() combo replaced by + dnl # a single call to blk_alloc_disk(). dnl # - AC_MSG_CHECKING([whether blk_cleanup_disk() exists]) - ZFS_LINUX_TEST_RESULT([blk_cleanup_disk], [ + AC_MSG_CHECKING([whether blk_alloc_disk() exists]) + ZFS_LINUX_TEST_RESULT([blk_alloc_disk], [ AC_MSG_RESULT(yes) - AC_DEFINE([HAVE_BLK_CLEANUP_DISK], 1, - [blk_cleanup_disk() exists]) + AC_DEFINE([HAVE_BLK_ALLOC_DISK], 1, [blk_alloc_disk() exists]) + + dnl # + dnl # 5.20 API change, + dnl # Removed blk_cleanup_disk(), put_disk() should be used. + dnl # + AC_MSG_CHECKING([whether blk_cleanup_disk() exists]) + ZFS_LINUX_TEST_RESULT([blk_cleanup_disk], [ + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_BLK_CLEANUP_DISK], 1, + [blk_cleanup_disk() exists]) + ], [ + AC_MSG_RESULT(no) + ]) ], [ AC_MSG_RESULT(no) ]) - ], [ - AC_MSG_RESULT(no) ]) ],[ AC_MSG_RESULT(no) diff --git a/module/os/linux/zfs/zvol_os.c b/module/os/linux/zfs/zvol_os.c index 87288190e7..92d1189d0e 100644 --- a/module/os/linux/zfs/zvol_os.c +++ b/module/os/linux/zfs/zvol_os.c @@ -874,7 +874,11 @@ zvol_alloc(dev_t dev, const char *name) #ifdef HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS #ifdef HAVE_BLK_ALLOC_DISK +#ifdef HAVE_BLK_ALLOC_DISK_2ARGS + zso->zvo_disk = blk_alloc_disk(NULL, NUMA_NO_NODE); +#else zso->zvo_disk = blk_alloc_disk(NUMA_NO_NODE); +#endif if (zso->zvo_disk == NULL) goto out_kmem;