]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 6.9 compat: blk_alloc_disk() now takes two args
authorRob Norris <robn@despairlabs.com>
Wed, 27 Mar 2024 00:24:57 +0000 (11:24 +1100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 3 Apr 2024 22:29:39 +0000 (15:29 -0700)
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

config/kernel-make-request-fn.m4
module/os/linux/zfs/zvol_os.c

index 4d20dd45c4a110e72dccff0d98d444eb71b8b734..9813ad2fb3f30efc23204263dadffcaca55f5749 100644 (file)
@@ -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)
 
index 26cc63d426eb1c93f534cf1a96f52fc8767a9879..d815cb2ad2c42df42323c56d4493f5cf030c2786 100644 (file)
@@ -1053,6 +1053,16 @@ zvol_alloc_non_blk_mq(struct zvol_state_os *zso)
        if (zso->zvo_disk == NULL)
                return (1);
 
+       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
@@ -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