mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	 6152014d1a
			
		
	
	
		6152014d1a
		
			
		
	
	
	
	
		
			
			The CentOS stream 4.18.0-257 kernel appears to have backported the Linux 5.9 change to make_request_fn and the associated API. To maintain weak modules compatibility the original symbol was retained and the new interface blk_alloc_queue_rh() was added. Unfortunately, blk_alloc_queue() was replaced in the blkdev.h header by blk_alloc_queue_bh() so there doesn't seem to be a way to build new kmods against the old interfces. Even though they appear to still be available for weak module binding. To accommodate this a configure check is added for the new _rh() variant of the function and used if available. If compatibility code gets added to the kernel for the original blk_alloc_queue() interface this should be fine. OpenZFS will simply continue to prefer the new interface and only fallback to blk_alloc_queue() when blk_alloc_queue_rh() isn't available. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #11374
		
			
				
	
	
		
			141 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| dnl #
 | |
| dnl # Check for make_request_fn interface.
 | |
| dnl #
 | |
| AC_DEFUN([ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN], [
 | |
| 	ZFS_LINUX_TEST_SRC([make_request_fn_void], [
 | |
| 		#include <linux/blkdev.h>
 | |
| 		void make_request(struct request_queue *q,
 | |
| 		    struct bio *bio) { return; }
 | |
| 	],[
 | |
| 		blk_queue_make_request(NULL, &make_request);
 | |
| 	])
 | |
| 
 | |
| 	ZFS_LINUX_TEST_SRC([make_request_fn_blk_qc_t], [
 | |
| 		#include <linux/blkdev.h>
 | |
| 		blk_qc_t make_request(struct request_queue *q,
 | |
| 		    struct bio *bio) { return (BLK_QC_T_NONE); }
 | |
| 	],[
 | |
| 		blk_queue_make_request(NULL, &make_request);
 | |
| 	])
 | |
| 
 | |
| 	ZFS_LINUX_TEST_SRC([blk_alloc_queue_request_fn], [
 | |
| 		#include <linux/blkdev.h>
 | |
| 		blk_qc_t make_request(struct request_queue *q,
 | |
| 		    struct bio *bio) { return (BLK_QC_T_NONE); }
 | |
| 	],[
 | |
| 		struct request_queue *q __attribute__ ((unused));
 | |
| 		q = blk_alloc_queue(make_request, NUMA_NO_NODE);
 | |
| 	])
 | |
| 
 | |
| 	ZFS_LINUX_TEST_SRC([blk_alloc_queue_request_fn_rh], [
 | |
| 		#include <linux/blkdev.h>
 | |
| 		blk_qc_t make_request(struct request_queue *q,
 | |
| 		    struct bio *bio) { return (BLK_QC_T_NONE); }
 | |
| 	],[
 | |
| 		struct request_queue *q __attribute__ ((unused));
 | |
| 		q = blk_alloc_queue_rh(make_request, NUMA_NO_NODE);
 | |
| 	])
 | |
| 
 | |
| 	ZFS_LINUX_TEST_SRC([block_device_operations_submit_bio], [
 | |
| 		#include <linux/blkdev.h>
 | |
| 	],[
 | |
| 		struct block_device_operations o;
 | |
| 		o.submit_bio = NULL;
 | |
| 	])
 | |
| ])
 | |
| 
 | |
| AC_DEFUN([ZFS_AC_KERNEL_MAKE_REQUEST_FN], [
 | |
| 	dnl # Checked as part of the blk_alloc_queue_request_fn test
 | |
| 	dnl #
 | |
| 	dnl # Linux 5.9 API Change
 | |
| 	dnl # make_request_fn was moved into block_device_operations->submit_bio
 | |
| 	dnl #
 | |
| 	AC_MSG_CHECKING([whether submit_bio is member of struct block_device_operations])
 | |
| 	ZFS_LINUX_TEST_RESULT([block_device_operations_submit_bio], [
 | |
| 		AC_MSG_RESULT(yes)
 | |
| 
 | |
| 		AC_DEFINE(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS, 1,
 | |
| 		    [submit_bio is member of struct block_device_operations])
 | |
| 	],[
 | |
| 		AC_MSG_RESULT(no)
 | |
| 
 | |
| 		dnl # Checked as part of the blk_alloc_queue_request_fn test
 | |
| 		dnl #
 | |
| 		dnl # Linux 5.7 API Change
 | |
| 		dnl # blk_alloc_queue() expects request function.
 | |
| 		dnl #
 | |
| 		AC_MSG_CHECKING([whether blk_alloc_queue() expects request function])
 | |
| 		ZFS_LINUX_TEST_RESULT([blk_alloc_queue_request_fn], [
 | |
| 			AC_MSG_RESULT(yes)
 | |
| 
 | |
| 			dnl # This is currently always the case.
 | |
| 			AC_MSG_CHECKING([whether make_request_fn() returns blk_qc_t])
 | |
| 			AC_MSG_RESULT(yes)
 | |
| 
 | |
| 			AC_DEFINE(HAVE_BLK_ALLOC_QUEUE_REQUEST_FN, 1,
 | |
| 			    [blk_alloc_queue() expects request function])
 | |
| 			AC_DEFINE(MAKE_REQUEST_FN_RET, blk_qc_t,
 | |
| 			    [make_request_fn() return type])
 | |
| 			AC_DEFINE(HAVE_MAKE_REQUEST_FN_RET_QC, 1,
 | |
| 			    [Noting that make_request_fn() returns blk_qc_t])
 | |
| 		],[
 | |
| 			dnl #
 | |
| 			dnl # CentOS Stream 4.18.0-257 API Change
 | |
| 			dnl # The Linux 5.7 blk_alloc_queue() change was back-
 | |
| 			dnl # ported and the symbol renamed blk_alloc_queue_rh().
 | |
| 			dnl # As of this kernel version they're not providing
 | |
| 			dnl # any compatibility code in the kernel for this.
 | |
| 			dnl #
 | |
| 			ZFS_LINUX_TEST_RESULT([blk_alloc_queue_request_fn_rh], [
 | |
| 				AC_MSG_RESULT(yes)
 | |
| 
 | |
| 				dnl # This is currently always the case.
 | |
| 				AC_MSG_CHECKING([whether make_request_fn_rh() returns blk_qc_t])
 | |
| 				AC_MSG_RESULT(yes)
 | |
| 
 | |
| 				AC_DEFINE(HAVE_BLK_ALLOC_QUEUE_REQUEST_FN_RH, 1,
 | |
| 				    [blk_alloc_queue_rh() expects request function])
 | |
| 				AC_DEFINE(MAKE_REQUEST_FN_RET, blk_qc_t,
 | |
| 				    [make_request_fn() return type])
 | |
| 				AC_DEFINE(HAVE_MAKE_REQUEST_FN_RET_QC, 1,
 | |
| 				    [Noting that make_request_fn() returns blk_qc_t])
 | |
| 			],[
 | |
| 				AC_MSG_RESULT(no)
 | |
| 
 | |
| 				dnl #
 | |
| 				dnl # Linux 3.2 API Change
 | |
| 				dnl # make_request_fn returns void.
 | |
| 				dnl #
 | |
| 				AC_MSG_CHECKING(
 | |
| 				    [whether make_request_fn() returns void])
 | |
| 				ZFS_LINUX_TEST_RESULT([make_request_fn_void], [
 | |
| 					AC_MSG_RESULT(yes)
 | |
| 					AC_DEFINE(MAKE_REQUEST_FN_RET, void,
 | |
| 					    [make_request_fn() return type])
 | |
| 					AC_DEFINE(HAVE_MAKE_REQUEST_FN_RET_VOID, 1,
 | |
| 					    [Noting that make_request_fn() returns void])
 | |
| 				],[
 | |
| 					AC_MSG_RESULT(no)
 | |
| 
 | |
| 					dnl #
 | |
| 					dnl # Linux 4.4 API Change
 | |
| 					dnl # make_request_fn returns blk_qc_t.
 | |
| 					dnl #
 | |
| 					AC_MSG_CHECKING(
 | |
| 					    [whether make_request_fn() returns blk_qc_t])
 | |
| 					ZFS_LINUX_TEST_RESULT([make_request_fn_blk_qc_t], [
 | |
| 						AC_MSG_RESULT(yes)
 | |
| 						AC_DEFINE(MAKE_REQUEST_FN_RET, blk_qc_t,
 | |
| 						    [make_request_fn() return type])
 | |
| 						AC_DEFINE(HAVE_MAKE_REQUEST_FN_RET_QC, 1,
 | |
| 						    [Noting that make_request_fn() ]
 | |
| 						    [returns blk_qc_t])
 | |
| 					],[
 | |
| 						ZFS_LINUX_TEST_ERROR([make_request_fn])
 | |
| 					])
 | |
| 				])
 | |
| 			])
 | |
| 		])
 | |
| 	])
 | |
| ])
 |