summaryrefslogtreecommitdiff
path: root/sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff')
-rw-r--r--sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff133
1 files changed, 133 insertions, 0 deletions
diff --git a/sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff b/sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff
new file mode 100644
index 00000000..1e72ebaf
--- /dev/null
+++ b/sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff
@@ -0,0 +1,133 @@
+diff --git a/config/kernel-make-request-fn.m4 b/config/kernel-make-request-fn.m4
+index 290ef6b8da7..86b202a7a27 100644
+--- a/config/kernel-make-request-fn.m4
++++ b/config/kernel-make-request-fn.m4
+@@ -42,6 +42,13 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN], [
+ struct block_device_operations o;
+ o.submit_bio = NULL;
+ ])
++
++ ZFS_LINUX_TEST_SRC([blk_alloc_disk], [
++ #include <linux/blkdev.h>
++ ],[
++ struct gendisk *disk __attribute__ ((unused));
++ disk = blk_alloc_disk(NUMA_NO_NODE);
++ ])
+ ])
+
+ AC_DEFUN([ZFS_AC_KERNEL_MAKE_REQUEST_FN], [
+@@ -56,6 +63,19 @@ 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 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_RESULT(yes)
++ AC_DEFINE([HAVE_BLK_ALLOC_DISK], 1, [blk_alloc_disk() exists])
++ ], [
++ 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 741979f11af..8b29d73a3e0 100644
+--- a/module/os/linux/zfs/zvol_os.c
++++ b/module/os/linux/zfs/zvol_os.c
+@@ -762,7 +762,7 @@ static struct block_device_operations zvol_ops = {
+ .getgeo = zvol_getgeo,
+ .owner = THIS_MODULE,
+ #ifdef HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS
+- .submit_bio = zvol_submit_bio,
++ .submit_bio = zvol_submit_bio,
+ #endif
+ };
+
+@@ -795,13 +795,40 @@ zvol_alloc(dev_t dev, const char *name)
+ mutex_init(&zv->zv_state_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ #ifdef HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS
++#ifdef HAVE_BLK_ALLOC_DISK
++ zso->zvo_disk = blk_alloc_disk(NUMA_NO_NODE);
++ if (zso->zvo_disk == NULL)
++ goto out_kmem;
++
++ 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)
++ goto out_kmem;
++
++ zso->zvo_disk = alloc_disk(ZVOL_MINORS);
++ if (zso->zvo_disk == NULL) {
++ blk_cleanup_queue(zso->zvo_queue);
++ goto out_kmem;
++ }
++
++ zso->zvo_disk->queue = zso->zvo_queue;
++#endif /* HAVE_BLK_ALLOC_DISK */
+ #else
+ zso->zvo_queue = blk_generic_alloc_queue(zvol_request, NUMA_NO_NODE);
+-#endif
+ if (zso->zvo_queue == NULL)
+ goto out_kmem;
+
++ zso->zvo_disk = alloc_disk(ZVOL_MINORS);
++ if (zso->zvo_disk == NULL) {
++ blk_cleanup_queue(zso->zvo_queue);
++ goto out_kmem;
++ }
++
++ zso->zvo_disk->queue = zso->zvo_queue;
++#endif /* HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS */
++
+ blk_queue_set_write_cache(zso->zvo_queue, B_TRUE, B_TRUE);
+
+ /* Limit read-ahead to a single page to prevent over-prefetching. */
+@@ -810,10 +837,6 @@ zvol_alloc(dev_t dev, const char *name)
+ /* Disable write merging in favor of the ZIO pipeline. */
+ blk_queue_flag_set(QUEUE_FLAG_NOMERGES, zso->zvo_queue);
+
+- zso->zvo_disk = alloc_disk(ZVOL_MINORS);
+- if (zso->zvo_disk == NULL)
+- goto out_queue;
+-
+ zso->zvo_queue->queuedata = zv;
+ zso->zvo_dev = dev;
+ zv->zv_open_count = 0;
+@@ -844,14 +867,11 @@ zvol_alloc(dev_t dev, const char *name)
+ zso->zvo_disk->first_minor = (dev & MINORMASK);
+ zso->zvo_disk->fops = &zvol_ops;
+ zso->zvo_disk->private_data = zv;
+- zso->zvo_disk->queue = zso->zvo_queue;
+ snprintf(zso->zvo_disk->disk_name, DISK_NAME_LEN, "%s%d",
+ ZVOL_DEV_NAME, (dev & MINORMASK));
+
+ return (zv);
+
+-out_queue:
+- blk_cleanup_queue(zso->zvo_queue);
+ out_kmem:
+ kmem_free(zso, sizeof (struct zvol_state_os));
+ kmem_free(zv, sizeof (zvol_state_t));
+@@ -882,8 +902,13 @@ zvol_free(zvol_state_t *zv)
+ zfs_rangelock_fini(&zv->zv_rangelock);
+
+ del_gendisk(zv->zv_zso->zvo_disk);
++#if defined(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS) && \
++ defined(HAVE_BLK_ALLOC_DISK)
++ blk_cleanup_disk(zv->zv_zso->zvo_disk);
++#else
+ blk_cleanup_queue(zv->zv_zso->zvo_queue);
+ put_disk(zv->zv_zso->zvo_disk);
++#endif
+
+ ida_simple_remove(&zvol_ida,
+ MINOR(zv->zv_zso->zvo_dev) >> ZVOL_MINOR_BITS);