mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +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
(cherry picked from commit ffd6978ef5)
Signed-off-by: Jonathon Fernyhough <jonathon@m2x.dev>
			
			
This commit is contained in:
		
							parent
							
								
									91d5ac85c0
								
							
						
					
					
						commit
						5722dce473
					
				
							
								
								
									
										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)
 | 
			
		||||
	])
 | 
			
		||||
])
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -593,9 +593,14 @@ retry:
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* 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));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user