mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 01:51:00 +03:00
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 <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Coleman Kane <ckane@colemankane.org> Closes #11765
This commit is contained in:
parent
e2a8296131
commit
ffd6978ef5
23
config/kernel-bio_max_segs.m4
Normal file
23
config/kernel-bio_max_segs.m4
Normal file
@ -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 <linux/bio.h>
|
||||||
|
],[
|
||||||
|
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)
|
||||||
|
])
|
||||||
|
])
|
@ -128,6 +128,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR_USERNS
|
ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR_USERNS
|
||||||
ZFS_AC_KERNEL_SRC_MKNOD
|
ZFS_AC_KERNEL_SRC_MKNOD
|
||||||
ZFS_AC_KERNEL_SRC_SYMLINK
|
ZFS_AC_KERNEL_SRC_SYMLINK
|
||||||
|
ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
|
||||||
|
|
||||||
AC_MSG_CHECKING([for available kernel interfaces])
|
AC_MSG_CHECKING([for available kernel interfaces])
|
||||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||||
@ -229,6 +230,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_GENERIC_FILLATTR_USERNS
|
ZFS_AC_KERNEL_GENERIC_FILLATTR_USERNS
|
||||||
ZFS_AC_KERNEL_MKNOD
|
ZFS_AC_KERNEL_MKNOD
|
||||||
ZFS_AC_KERNEL_SYMLINK
|
ZFS_AC_KERNEL_SYMLINK
|
||||||
|
ZFS_AC_KERNEL_BIO_MAX_SEGS
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
|
@ -589,9 +589,14 @@ retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* bio_alloc() with __GFP_WAIT never returns NULL */
|
/* 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,
|
dr->dr_bio[i] = bio_alloc(GFP_NOIO,
|
||||||
MIN(abd_nr_pages_off(zio->io_abd, bio_size, abd_offset),
|
MIN(abd_nr_pages_off(zio->io_abd, bio_size, abd_offset),
|
||||||
BIO_MAX_PAGES));
|
BIO_MAX_PAGES));
|
||||||
|
#endif
|
||||||
if (unlikely(dr->dr_bio[i] == NULL)) {
|
if (unlikely(dr->dr_bio[i] == NULL)) {
|
||||||
vdev_disk_dio_free(dr);
|
vdev_disk_dio_free(dr);
|
||||||
return (SET_ERROR(ENOMEM));
|
return (SET_ERROR(ENOMEM));
|
||||||
|
Loading…
Reference in New Issue
Block a user