summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--metadata/md5-cache/sys-fs/zfs-utils-2.1.0-r1 (renamed from metadata/md5-cache/sys-fs/zfs-utils-2.1.0)2
-rw-r--r--metadata/md5-cache/sys-kernel/zfs-dkms-2.1.0-r1 (renamed from metadata/md5-cache/sys-kernel/zfs-dkms-2.1.0)2
-rw-r--r--metadata/pkg_desc_index4
-rw-r--r--sys-fs/zfs-utils/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff84
-rw-r--r--sys-fs/zfs-utils/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff133
-rw-r--r--sys-fs/zfs-utils/zfs-utils-2.1.0-r1.ebuild (renamed from sys-fs/zfs-utils/zfs-utils-2.1.0.ebuild)5
-rw-r--r--sys-kernel/zfs-dkms/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff84
-rw-r--r--sys-kernel/zfs-dkms/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff133
-rw-r--r--sys-kernel/zfs-dkms/zfs-dkms-2.1.0-r1.ebuild (renamed from sys-kernel/zfs-dkms/zfs-dkms-2.1.0.ebuild)5
9 files changed, 448 insertions, 4 deletions
diff --git a/metadata/md5-cache/sys-fs/zfs-utils-2.1.0 b/metadata/md5-cache/sys-fs/zfs-utils-2.1.0-r1
index 3e103ef2..90316b3b 100644
--- a/metadata/md5-cache/sys-fs/zfs-utils-2.1.0
+++ b/metadata/md5-cache/sys-fs/zfs-utils-2.1.0-r1
@@ -13,4 +13,4 @@ RESTRICT=test
SLOT=0
SRC_URI=https://github.com/openzfs/zfs-utils/releases/download/zfs-2.1.0/zfs-2.1.0.tar.gz
_eclasses_=bash-completion-r1 d3a60385655d9b402be765a6de333245 distutils-r1 6088739b8548699015d46289639d660c eapi8-dosym cd7d420bb5be5ee079f27239ce76b8f5 edos2unix 33e347e171066657f91f8b0c72ec8773 eutils dab5d8ec471d025b79c9e6906bcf3bff flag-o-matic 4134b5c0fb719b9161d10bdaba9e09e5 multibuild 05a584848db4901c97fcd94ae7cc3a97 multilib 4b66d835ec72e021e359bb81eacfe988 multiprocessing 61c959fc55c15c00bbb1079d6a71370b pam 41ce39f668e11d31ff4734f3b5794f7d python-r1 e574a3642f886323f18f867ecc4d91c4 python-utils-r1 08d890890f70fe0096093016e55438d5 strip-linguas ac3ee41ee2d31d8c41a77c0838320cc7 toolchain-funcs 9ea1c67b6f8315fdc2568abb674519aa udev 0a92682c0f65a60d01453db598fc6490 wrapper 4251d4c84c25f59094fd557e0063a974
-_md5_=332639468a8a8a2a0678ff410d2da163
+_md5_=e7cbc64bf85cdc05c92f0c07ca6091a7
diff --git a/metadata/md5-cache/sys-kernel/zfs-dkms-2.1.0 b/metadata/md5-cache/sys-kernel/zfs-dkms-2.1.0-r1
index cf67bb53..d3169e7e 100644
--- a/metadata/md5-cache/sys-kernel/zfs-dkms-2.1.0
+++ b/metadata/md5-cache/sys-kernel/zfs-dkms-2.1.0-r1
@@ -9,4 +9,4 @@ RDEPEND=sys-kernel/dkms
SLOT=0
SRC_URI=https://github.com/zfsonlinux/zfs/releases/download/zfs-2.1.0/zfs-2.1.0.tar.gz
_eclasses_=edos2unix 33e347e171066657f91f8b0c72ec8773 eutils dab5d8ec471d025b79c9e6906bcf3bff strip-linguas ac3ee41ee2d31d8c41a77c0838320cc7 wrapper 4251d4c84c25f59094fd557e0063a974
-_md5_=c99b139394da5f09fe55671b0f12322c
+_md5_=5ffcef0b9dbfc20608e0604ce0097563
diff --git a/metadata/pkg_desc_index b/metadata/pkg_desc_index
index 8e176eea..ee24eb0e 100644
--- a/metadata/pkg_desc_index
+++ b/metadata/pkg_desc_index
@@ -57,7 +57,7 @@ sys-fs/cryptsetup 2.3.4-r10: Tool to setup encrypted devices with dm-crypt
sys-fs/gocryptfs 2.0.1-r1: Encrypted overlay filesystem written in Go
sys-fs/vhba 20190831-r2: Virtual (SCSI) Host Bus Adapter kernel module for the CDEmu suite
sys-fs/zfs 2.1.0: ZFS meta-package (Gentoo compatibility ebuild)
-sys-fs/zfs-utils 2.1.0: Userland utilities for ZFS Linux kernel module
+sys-fs/zfs-utils 2.1.0-r1: Userland utilities for ZFS Linux kernel module
sys-kernel/bbswitch-dkms 0.8-r1: BBswitch sources for linux
sys-kernel/broadcom-sta-dkms 6.30.223.271-r5: Broadcom's IEEE 802.11a/b/g/n hybrid Linux device driver source
sys-kernel/dkms 2.3-r1: Dynamic Kernel Module Support
@@ -75,7 +75,7 @@ sys-kernel/nvidia-drivers-legacy-dkms 390.144: NVIDIA driver sources for linux
sys-kernel/rtl8821cu-dkms 5.8.1: Realtek RTL8811CU/RTL8821CU USB Wi-Fi adapter driver for Linux
sys-kernel/vhba-dkms 20190831: Virtual (SCSI) Host Bus Adapter kernel module for the CDEmu suite sources
sys-kernel/virtualbox-modules-dkms 6.1.18-r1: Kernel Modules source for Virtualbox
-sys-kernel/zfs-dkms 2.1.0: ZFS sources for linux
+sys-kernel/zfs-dkms 2.1.0-r1: ZFS sources for linux
sys-libs/binutils-libs 2.35.2-r10: Core binutils libraries (libbfd, libopcodes, libiberty) for external packages
sys-libs/glibc 2.33-r10: GNU libc C library
sys-power/radeon-profile 20200824-r10: Read current clocks of ATi/AMD Radeon cards
diff --git a/sys-fs/zfs-utils/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff b/sys-fs/zfs-utils/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff
new file mode 100644
index 00000000..e53bfb1c
--- /dev/null
+++ b/sys-fs/zfs-utils/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff
@@ -0,0 +1,84 @@
+diff --git a/config/kernel-vfs-set_page_dirty.m4 b/config/kernel-vfs-set_page_dirty.m4
+new file mode 100644
+index 00000000000..a9d252e4e01
+--- /dev/null
++++ b/config/kernel-vfs-set_page_dirty.m4
+@@ -0,0 +1,34 @@
++dnl #
++dnl # Linux 5.14 adds a change to require set_page_dirty to be manually
++dnl # wired up in struct address_space_operations. Determine if this needs
++dnl # to be done. This patch set also introduced __set_page_dirty_nobuffers
++dnl # declaration in linux/pagemap.h, so these tests look for the presence
++dnl # of that function to tell the compiler to assign set_page_dirty in
++dnl # module/os/linux/zfs/zpl_file.c
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS], [
++ ZFS_LINUX_TEST_SRC([vfs_has_set_page_dirty_nobuffers], [
++ #include <linux/pagemap.h>
++ #include <linux/fs.h>
++
++ static const struct address_space_operations
++ aops __attribute__ ((unused)) = {
++ .set_page_dirty = __set_page_dirty_nobuffers,
++ };
++ ],[])
++])
++
++AC_DEFUN([ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS], [
++ dnl #
++ dnl # Linux 5.14 change requires set_page_dirty() to be assigned
++ dnl # in address_space_operations()
++ dnl #
++ AC_MSG_CHECKING([__set_page_dirty_nobuffers exists])
++ ZFS_LINUX_TEST_RESULT([vfs_has_set_page_dirty_nobuffers], [
++ AC_MSG_RESULT([yes])
++ AC_DEFINE(HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS, 1,
++ [__set_page_dirty_nobuffers exists])
++ ],[
++ AC_MSG_RESULT([no])
++ ])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 7196e66ca28..5ea2286dbcc 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -132,6 +132,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
+ ZFS_AC_KERNEL_SRC_SIGNAL_STOP
+ ZFS_AC_KERNEL_SRC_SIGINFO
+ ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
++ ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
+
+ AC_MSG_CHECKING([for available kernel interfaces])
+ ZFS_LINUX_TEST_COMPILE_ALL([kabi])
+@@ -237,6 +238,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
+ ZFS_AC_KERNEL_SIGNAL_STOP
+ ZFS_AC_KERNEL_SIGINFO
+ ZFS_AC_KERNEL_SET_SPECIAL_STATE
++ ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
+ ])
+
+ dnl #
+diff --git a/module/os/linux/zfs/zpl_file.c b/module/os/linux/zfs/zpl_file.c
+index 0319148b983..63002fe3b93 100644
+--- a/module/os/linux/zfs/zpl_file.c
++++ b/module/os/linux/zfs/zpl_file.c
+@@ -33,6 +33,9 @@
+ #include <sys/zfs_vfsops.h>
+ #include <sys/zfs_vnops.h>
+ #include <sys/zfs_project.h>
++#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
++#include <linux/pagemap.h>
++#endif
+
+ /*
+ * When using fallocate(2) to preallocate space, inflate the requested
+@@ -1018,6 +1021,9 @@ const struct address_space_operations zpl_address_space_operations = {
+ .writepage = zpl_writepage,
+ .writepages = zpl_writepages,
+ .direct_IO = zpl_direct_IO,
++#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
++ .set_page_dirty = __set_page_dirty_nobuffers,
++#endif
+ };
+
+ const struct file_operations zpl_file_operations = {
diff --git a/sys-fs/zfs-utils/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff b/sys-fs/zfs-utils/files/eb17f92e1edabcde442e5fbdff4525054be8595.diff
new file mode 100644
index 00000000..1e72ebaf
--- /dev/null
+++ b/sys-fs/zfs-utils/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);
diff --git a/sys-fs/zfs-utils/zfs-utils-2.1.0.ebuild b/sys-fs/zfs-utils/zfs-utils-2.1.0-r1.ebuild
index ee5703b3..fef710b0 100644
--- a/sys-fs/zfs-utils/zfs-utils-2.1.0.ebuild
+++ b/sys-fs/zfs-utils/zfs-utils-2.1.0-r1.ebuild
@@ -59,6 +59,11 @@ REQUIRED_USE="${PYTHON_REQUIRED_USE}"
RESTRICT="test"
+PATCHES=(
+ "${FILESDIR}"/eb17f92e1edabcde442e5fbdff4525054be8595.diff
+ "${FILESDIR}"/1c24bf966c373009f2be77438e8696aabf50a7e7.diff
+)
+
src_prepare() {
default
diff --git a/sys-kernel/zfs-dkms/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff b/sys-kernel/zfs-dkms/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff
new file mode 100644
index 00000000..e53bfb1c
--- /dev/null
+++ b/sys-kernel/zfs-dkms/files/1c24bf966c373009f2be77438e8696aabf50a7e7.diff
@@ -0,0 +1,84 @@
+diff --git a/config/kernel-vfs-set_page_dirty.m4 b/config/kernel-vfs-set_page_dirty.m4
+new file mode 100644
+index 00000000000..a9d252e4e01
+--- /dev/null
++++ b/config/kernel-vfs-set_page_dirty.m4
+@@ -0,0 +1,34 @@
++dnl #
++dnl # Linux 5.14 adds a change to require set_page_dirty to be manually
++dnl # wired up in struct address_space_operations. Determine if this needs
++dnl # to be done. This patch set also introduced __set_page_dirty_nobuffers
++dnl # declaration in linux/pagemap.h, so these tests look for the presence
++dnl # of that function to tell the compiler to assign set_page_dirty in
++dnl # module/os/linux/zfs/zpl_file.c
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS], [
++ ZFS_LINUX_TEST_SRC([vfs_has_set_page_dirty_nobuffers], [
++ #include <linux/pagemap.h>
++ #include <linux/fs.h>
++
++ static const struct address_space_operations
++ aops __attribute__ ((unused)) = {
++ .set_page_dirty = __set_page_dirty_nobuffers,
++ };
++ ],[])
++])
++
++AC_DEFUN([ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS], [
++ dnl #
++ dnl # Linux 5.14 change requires set_page_dirty() to be assigned
++ dnl # in address_space_operations()
++ dnl #
++ AC_MSG_CHECKING([__set_page_dirty_nobuffers exists])
++ ZFS_LINUX_TEST_RESULT([vfs_has_set_page_dirty_nobuffers], [
++ AC_MSG_RESULT([yes])
++ AC_DEFINE(HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS, 1,
++ [__set_page_dirty_nobuffers exists])
++ ],[
++ AC_MSG_RESULT([no])
++ ])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 7196e66ca28..5ea2286dbcc 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -132,6 +132,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
+ ZFS_AC_KERNEL_SRC_SIGNAL_STOP
+ ZFS_AC_KERNEL_SRC_SIGINFO
+ ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
++ ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
+
+ AC_MSG_CHECKING([for available kernel interfaces])
+ ZFS_LINUX_TEST_COMPILE_ALL([kabi])
+@@ -237,6 +238,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
+ ZFS_AC_KERNEL_SIGNAL_STOP
+ ZFS_AC_KERNEL_SIGINFO
+ ZFS_AC_KERNEL_SET_SPECIAL_STATE
++ ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
+ ])
+
+ dnl #
+diff --git a/module/os/linux/zfs/zpl_file.c b/module/os/linux/zfs/zpl_file.c
+index 0319148b983..63002fe3b93 100644
+--- a/module/os/linux/zfs/zpl_file.c
++++ b/module/os/linux/zfs/zpl_file.c
+@@ -33,6 +33,9 @@
+ #include <sys/zfs_vfsops.h>
+ #include <sys/zfs_vnops.h>
+ #include <sys/zfs_project.h>
++#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
++#include <linux/pagemap.h>
++#endif
+
+ /*
+ * When using fallocate(2) to preallocate space, inflate the requested
+@@ -1018,6 +1021,9 @@ const struct address_space_operations zpl_address_space_operations = {
+ .writepage = zpl_writepage,
+ .writepages = zpl_writepages,
+ .direct_IO = zpl_direct_IO,
++#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
++ .set_page_dirty = __set_page_dirty_nobuffers,
++#endif
+ };
+
+ const struct file_operations zpl_file_operations = {
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);
diff --git a/sys-kernel/zfs-dkms/zfs-dkms-2.1.0.ebuild b/sys-kernel/zfs-dkms/zfs-dkms-2.1.0-r1.ebuild
index cec96ca3..f4dfd6c1 100644
--- a/sys-kernel/zfs-dkms/zfs-dkms-2.1.0.ebuild
+++ b/sys-kernel/zfs-dkms/zfs-dkms-2.1.0-r1.ebuild
@@ -20,6 +20,11 @@ IUSE=""
DEPEND="sys-kernel/dkms"
RDEPEND="${DEPEND}"
+PATCHES=(
+ "${FILESDIR}"/eb17f92e1edabcde442e5fbdff4525054be8595.diff
+ "${FILESDIR}"/1c24bf966c373009f2be77438e8696aabf50a7e7.diff
+)
+
S="${WORKDIR}/${MY_P}"
src_configure() {