From d18bf1e01b65ee4bf0c804e2843b282d3d4e5d7c Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Tue, 15 Jun 2021 14:57:03 +0100 Subject: gentoo resync : 15.06.2021 --- .../files/zfs-8.0.4_5.12_compat_bio_max_segs.patch | 91 ++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 sys-fs/zfs-kmod/files/zfs-8.0.4_5.12_compat_bio_max_segs.patch (limited to 'sys-fs/zfs-kmod/files/zfs-8.0.4_5.12_compat_bio_max_segs.patch') diff --git a/sys-fs/zfs-kmod/files/zfs-8.0.4_5.12_compat_bio_max_segs.patch b/sys-fs/zfs-kmod/files/zfs-8.0.4_5.12_compat_bio_max_segs.patch new file mode 100644 index 000000000000..33f9a344e2f2 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-8.0.4_5.12_compat_bio_max_segs.patch @@ -0,0 +1,91 @@ +From 77352db228c07ce8ba50478b9029820ca69c6c1b Mon Sep 17 00:00:00 2001 +From: Coleman Kane +Date: Sat, 20 Mar 2021 01:33:42 -0400 +Subject: [PATCH] Linux 5.12 update: bio_max_segs() replaces BIO_MAX_PAGES + +The BIO_MAX_PAGES macro is being retired in favor of a bio_max_segs() +function that implements the typical MIN(x,y) logic used throughout the +kernel for bounding the allocation, and also the new implementation is +intended to be signed-safe (which the former was not). + +Reviewed-by: Tony Hutter +Reviewed-by: Brian Behlendorf +Signed-off-by: Coleman Kane +Closes #11765 +(cherry picked from commit ffd6978ef59cfe2773e984bf03de2f0b93b03f5c) +Signed-off-by: Jonathon Fernyhough +--- + config/kernel-bio_max_segs.m4 | 23 +++++++++++++++++++++++ + config/kernel.m4 | 2 ++ + module/os/linux/zfs/vdev_disk.c | 5 +++++ + 3 files changed, 30 insertions(+) + create mode 100644 config/kernel-bio_max_segs.m4 + +diff --git a/config/kernel-bio_max_segs.m4 b/config/kernel-bio_max_segs.m4 +new file mode 100644 +index 00000000000..a90d75455c1 +--- /dev/null ++++ b/config/kernel-bio_max_segs.m4 +@@ -0,0 +1,23 @@ ++dnl # ++dnl # 5.12 API change removes BIO_MAX_PAGES in favor of bio_max_segs() ++dnl # which will handle the logic of setting the upper-bound to a ++dnl # BIO_MAX_PAGES, internally. ++dnl # ++AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS], [ ++ ZFS_LINUX_TEST_SRC([bio_max_segs], [ ++ #include ++ ],[ ++ bio_max_segs(1); ++ ]) ++]) ++ ++AC_DEFUN([ZFS_AC_KERNEL_BIO_MAX_SEGS], [ ++ AC_MSG_CHECKING([whether bio_max_segs() exists]) ++ ZFS_LINUX_TEST_RESULT([bio_max_segs], [ ++ AC_MSG_RESULT(yes) ++ ++ AC_DEFINE([HAVE_BIO_MAX_SEGS], 1, [bio_max_segs() is implemented]) ++ ],[ ++ AC_MSG_RESULT(no) ++ ]) ++]) +diff --git a/config/kernel.m4 b/config/kernel.m4 +index 51c7fb926ec..b8d53490a4a 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -127,6 +127,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ + ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR_USERNS + ZFS_AC_KERNEL_SRC_MKNOD + ZFS_AC_KERNEL_SRC_SYMLINK ++ ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS + + AC_MSG_CHECKING([for available kernel interfaces]) + ZFS_LINUX_TEST_COMPILE_ALL([kabi]) +@@ -227,6 +228,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ + ZFS_AC_KERNEL_GENERIC_FILLATTR_USERNS + ZFS_AC_KERNEL_MKNOD + ZFS_AC_KERNEL_SYMLINK ++ ZFS_AC_KERNEL_BIO_MAX_SEGS + ]) + + dnl # +diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c +index 08c33313407..aaaf4105979 100644 +--- a/module/os/linux/zfs/vdev_disk.c ++++ b/module/os/linux/zfs/vdev_disk.c +@@ -593,9 +593,14 @@ __vdev_disk_physio(struct block_device *bdev, zio_t *zio, + } + + /* bio_alloc() with __GFP_WAIT never returns NULL */ ++#ifdef HAVE_BIO_MAX_SEGS ++ dr->dr_bio[i] = bio_alloc(GFP_NOIO, bio_max_segs( ++ abd_nr_pages_off(zio->io_abd, bio_size, abd_offset))); ++#else + dr->dr_bio[i] = bio_alloc(GFP_NOIO, + MIN(abd_nr_pages_off(zio->io_abd, bio_size, abd_offset), + BIO_MAX_PAGES)); ++#endif + if (unlikely(dr->dr_bio[i] == NULL)) { + vdev_disk_dio_free(dr); + return (SET_ERROR(ENOMEM)); -- cgit v1.2.3