aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Norris <robn@despairlabs.com>2024-03-27 00:24:57 +0000
committerBrian Behlendorf <behlendorf1@llnl.gov>2024-04-03 22:29:39 +0000
commit6097a7ba8b49c9b263809d2d1092fdca86182bd3 (patch)
tree081c55684ac0fa841e50fa2de735c06a9785f661
parente3120f73d0481a5e0779e45da83518373d60dcff (diff)
downloadsrc-6097a7ba8b49c9b263809d2d1092fdca86182bd3.tar.gz
src-6097a7ba8b49c9b263809d2d1092fdca86182bd3.zip
Linux 6.9 compat: blk_alloc_disk() now takes two args
There's an extra nullable arg for queue limits. Detect it, and set it to NULL. Similar change for blk_mq_alloc_disk(), now three args, same treatment. Error return now has error encoded in the return, so detect with IS_ERR() and explicitly NULL our own return. Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rob Norris <robn@despairlabs.com> Sponsored-by: https://despairlabs.com/sponsor/ Closes #16027 Closes #16033
-rw-r--r--config/kernel-make-request-fn.m433
-rw-r--r--module/os/linux/zfs/zvol_os.c23
2 files changed, 55 insertions, 1 deletions
diff --git a/config/kernel-make-request-fn.m4 b/config/kernel-make-request-fn.m4
index 4d20dd45c4a1..9813ad2fb3f3 100644
--- a/config/kernel-make-request-fn.m4
+++ b/config/kernel-make-request-fn.m4
@@ -50,6 +50,14 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN], [
disk = blk_alloc_disk(NUMA_NO_NODE);
])
+ ZFS_LINUX_TEST_SRC([blk_alloc_disk_2arg], [
+ #include <linux/blkdev.h>
+ ],[
+ struct queue_limits *lim = NULL;
+ struct gendisk *disk __attribute__ ((unused));
+ disk = blk_alloc_disk(lim, NUMA_NO_NODE);
+ ])
+
ZFS_LINUX_TEST_SRC([blk_cleanup_disk], [
#include <linux/blkdev.h>
],[
@@ -96,6 +104,31 @@ AC_DEFUN([ZFS_AC_KERNEL_MAKE_REQUEST_FN], [
], [
AC_MSG_RESULT(no)
])
+
+ dnl #
+ dnl # Linux 6.9 API Change:
+ dnl # blk_alloc_queue() takes a nullable queue_limits arg.
+ dnl #
+ AC_MSG_CHECKING([whether blk_alloc_disk() exists and takes 2 args])
+ ZFS_LINUX_TEST_RESULT([blk_alloc_disk_2arg], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE([HAVE_BLK_ALLOC_DISK_2ARG], 1, [blk_alloc_disk() exists and takes 2 args])
+
+ 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)
diff --git a/module/os/linux/zfs/zvol_os.c b/module/os/linux/zfs/zvol_os.c
index 26cc63d426eb..d815cb2ad2c4 100644
--- a/module/os/linux/zfs/zvol_os.c
+++ b/module/os/linux/zfs/zvol_os.c
@@ -1055,6 +1055,16 @@ zvol_alloc_non_blk_mq(struct zvol_state_os *zso)
zso->zvo_disk->minors = ZVOL_MINORS;
zso->zvo_queue = zso->zvo_disk->queue;
+#elif defined(HAVE_BLK_ALLOC_DISK_2ARG)
+ struct gendisk *disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+ if (IS_ERR(disk)) {
+ zso->zvo_disk = NULL;
+ return (1);
+ }
+
+ zso->zvo_disk = disk;
+ zso->zvo_disk->minors = ZVOL_MINORS;
+ zso->zvo_queue = zso->zvo_disk->queue;
#else
zso->zvo_queue = blk_alloc_queue(NUMA_NO_NODE);
if (zso->zvo_queue == NULL)
@@ -1103,6 +1113,17 @@ zvol_alloc_blk_mq(zvol_state_t *zv)
}
zso->zvo_queue = zso->zvo_disk->queue;
zso->zvo_disk->minors = ZVOL_MINORS;
+#elif defined(HAVE_BLK_ALLOC_DISK_2ARG)
+ struct gendisk *disk = blk_mq_alloc_disk(&zso->tag_set, NULL, zv);
+ if (IS_ERR(disk)) {
+ zso->zvo_disk = NULL;
+ blk_mq_free_tag_set(&zso->tag_set);
+ return (1);
+ }
+
+ zso->zvo_disk = disk;
+ zso->zvo_queue = zso->zvo_disk->queue;
+ zso->zvo_disk->minors = ZVOL_MINORS;
#else
zso->zvo_disk = alloc_disk(ZVOL_MINORS);
if (zso->zvo_disk == NULL) {
@@ -1256,7 +1277,7 @@ zvol_os_free(zvol_state_t *zv)
del_gendisk(zv->zv_zso->zvo_disk);
#if defined(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS) && \
- defined(HAVE_BLK_ALLOC_DISK)
+ (defined(HAVE_BLK_ALLOC_DISK) || defined(HAVE_BLK_ALLOC_DISK_2ARG))
#if defined(HAVE_BLK_CLEANUP_DISK)
blk_cleanup_disk(zv->zv_zso->zvo_disk);
#else