1eda14cbcSMatt Macydnl # 2eda14cbcSMatt Macydnl # Linux 4.8 API, 3eda14cbcSMatt Macydnl # 4eda14cbcSMatt Macydnl # The bio_op() helper was introduced as a replacement for explicitly 5eda14cbcSMatt Macydnl # checking the bio->bi_rw flags. The following checks are used to 6eda14cbcSMatt Macydnl # detect if a specific operation is supported. 7eda14cbcSMatt Macydnl # 8eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_OPS], [ 9eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([bio_set_op_attrs], [ 10eda14cbcSMatt Macy #include <linux/bio.h> 11eda14cbcSMatt Macy ],[ 12eda14cbcSMatt Macy struct bio *bio __attribute__ ((unused)) = NULL; 13eda14cbcSMatt Macy bio_set_op_attrs(bio, 0, 0); 14eda14cbcSMatt Macy ]) 15eda14cbcSMatt Macy]) 16eda14cbcSMatt Macy 17eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_BIO_SET_OP_ATTRS], [ 18eda14cbcSMatt Macy AC_MSG_CHECKING([whether bio_set_op_attrs is available]) 19eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([bio_set_op_attrs], [ 20eda14cbcSMatt Macy AC_MSG_RESULT(yes) 21eda14cbcSMatt Macy AC_DEFINE(HAVE_BIO_SET_OP_ATTRS, 1, 22eda14cbcSMatt Macy [bio_set_op_attrs is available]) 23eda14cbcSMatt Macy ],[ 24eda14cbcSMatt Macy AC_MSG_RESULT(no) 25eda14cbcSMatt Macy ]) 26eda14cbcSMatt Macy]) 27eda14cbcSMatt Macy 28eda14cbcSMatt Macydnl # 29eda14cbcSMatt Macydnl # Linux 4.14 API, 30eda14cbcSMatt Macydnl # 31eda14cbcSMatt Macydnl # The bio_set_dev() helper macro was introduced as part of the transition 32eda14cbcSMatt Macydnl # to have struct gendisk in struct bio. 33eda14cbcSMatt Macydnl # 34eda14cbcSMatt Macydnl # Linux 5.0 API, 35eda14cbcSMatt Macydnl # 36eda14cbcSMatt Macydnl # The bio_set_dev() helper macro was updated to internally depend on 37eda14cbcSMatt Macydnl # bio_associate_blkg() symbol which is exported GPL-only. 38eda14cbcSMatt Macydnl # 39eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV], [ 40eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([bio_set_dev], [ 41eda14cbcSMatt Macy #include <linux/bio.h> 42eda14cbcSMatt Macy #include <linux/fs.h> 43eda14cbcSMatt Macy ],[ 44eda14cbcSMatt Macy struct block_device *bdev = NULL; 45eda14cbcSMatt Macy struct bio *bio = NULL; 46eda14cbcSMatt Macy bio_set_dev(bio, bdev); 477877fdebSMatt Macy ], [], [ZFS_META_LICENSE]) 48eda14cbcSMatt Macy]) 49eda14cbcSMatt Macy 50681ce946SMartin Matuskadnl # 51681ce946SMartin Matuskadnl # Linux 5.16 API 52681ce946SMartin Matuskadnl # 53681ce946SMartin Matuskadnl # bio_set_dev is no longer a helper macro and is now an inline function, 54681ce946SMartin Matuskadnl # meaning that the function it calls internally can no longer be overridden 55681ce946SMartin Matuskadnl # by our code 56681ce946SMartin Matuskadnl # 57681ce946SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV_MACRO], [ 58681ce946SMartin Matuska ZFS_LINUX_TEST_SRC([bio_set_dev_macro], [ 59681ce946SMartin Matuska #include <linux/bio.h> 60681ce946SMartin Matuska #include <linux/fs.h> 61681ce946SMartin Matuska ],[ 62681ce946SMartin Matuska #ifndef bio_set_dev 63681ce946SMartin Matuska #error Not a macro 64681ce946SMartin Matuska #endif 65681ce946SMartin Matuska ], [], [ZFS_META_LICENSE]) 66681ce946SMartin Matuska]) 67681ce946SMartin Matuska 68eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [ 69eda14cbcSMatt Macy AC_MSG_CHECKING([whether bio_set_dev() is GPL-only]) 70eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([bio_set_dev_license], [ 71eda14cbcSMatt Macy AC_MSG_RESULT(no) 72eda14cbcSMatt Macy ],[ 73eda14cbcSMatt Macy AC_MSG_RESULT(yes) 74eda14cbcSMatt Macy AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1, 75eda14cbcSMatt Macy [bio_set_dev() GPL-only]) 76eda14cbcSMatt Macy ]) 77681ce946SMartin Matuska 78681ce946SMartin Matuska AC_MSG_CHECKING([whether bio_set_dev() is a macro]) 79681ce946SMartin Matuska ZFS_LINUX_TEST_RESULT([bio_set_dev_macro], [ 80681ce946SMartin Matuska AC_MSG_RESULT(yes) 81681ce946SMartin Matuska AC_DEFINE(HAVE_BIO_SET_DEV_MACRO, 1, 82681ce946SMartin Matuska [bio_set_dev() is a macro]) 83681ce946SMartin Matuska ],[ 84681ce946SMartin Matuska AC_MSG_RESULT(no) 85681ce946SMartin Matuska ]) 86eda14cbcSMatt Macy]) 87eda14cbcSMatt Macy 88eda14cbcSMatt Macydnl # 89eda14cbcSMatt Macydnl # 2.6.34 API change 90eda14cbcSMatt Macydnl # current->bio_list 91eda14cbcSMatt Macydnl # 92eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST], [ 93eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([current_bio_list], [ 94eda14cbcSMatt Macy #include <linux/sched.h> 95eda14cbcSMatt Macy ], [ 96eda14cbcSMatt Macy current->bio_list = (struct bio_list *) NULL; 97eda14cbcSMatt Macy ]) 98eda14cbcSMatt Macy]) 99eda14cbcSMatt Macy 100eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST], [ 101eda14cbcSMatt Macy AC_MSG_CHECKING([whether current->bio_list exists]) 102eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([current_bio_list], [ 103eda14cbcSMatt Macy AC_MSG_RESULT(yes) 104eda14cbcSMatt Macy ],[ 105eda14cbcSMatt Macy ZFS_LINUX_TEST_ERROR([bio_list]) 106eda14cbcSMatt Macy ]) 107eda14cbcSMatt Macy]) 108eda14cbcSMatt Macy 109eda14cbcSMatt Macydnl # 110eda14cbcSMatt Macydnl # Linux 5.5 API, 111eda14cbcSMatt Macydnl # 112eda14cbcSMatt Macydnl # The Linux 5.5 kernel updated percpu_ref_tryget() which is inlined by 113eda14cbcSMatt Macydnl # blkg_tryget() to use rcu_read_lock() instead of rcu_read_lock_sched(). 114eda14cbcSMatt Macydnl # As a side effect the function was converted to GPL-only. 115eda14cbcSMatt Macydnl # 116eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_BLKG_TRYGET], [ 117eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([blkg_tryget], [ 118eda14cbcSMatt Macy #include <linux/blk-cgroup.h> 119eda14cbcSMatt Macy #include <linux/bio.h> 120eda14cbcSMatt Macy #include <linux/fs.h> 121eda14cbcSMatt Macy ],[ 122180f8225SMatt Macy struct blkcg_gq blkg __attribute__ ((unused)) = {}; 123eda14cbcSMatt Macy bool rc __attribute__ ((unused)); 124eda14cbcSMatt Macy rc = blkg_tryget(&blkg); 1257877fdebSMatt Macy ], [], [ZFS_META_LICENSE]) 126eda14cbcSMatt Macy]) 127eda14cbcSMatt Macy 128eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_BLKG_TRYGET], [ 129eda14cbcSMatt Macy AC_MSG_CHECKING([whether blkg_tryget() is available]) 130eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([blkg_tryget], [ 131eda14cbcSMatt Macy AC_MSG_RESULT(yes) 132eda14cbcSMatt Macy AC_DEFINE(HAVE_BLKG_TRYGET, 1, [blkg_tryget() is available]) 133eda14cbcSMatt Macy 134eda14cbcSMatt Macy AC_MSG_CHECKING([whether blkg_tryget() is GPL-only]) 135eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([blkg_tryget_license], [ 136eda14cbcSMatt Macy AC_MSG_RESULT(no) 137eda14cbcSMatt Macy ],[ 138eda14cbcSMatt Macy AC_MSG_RESULT(yes) 139eda14cbcSMatt Macy AC_DEFINE(HAVE_BLKG_TRYGET_GPL_ONLY, 1, 140eda14cbcSMatt Macy [blkg_tryget() GPL-only]) 141eda14cbcSMatt Macy ]) 142eda14cbcSMatt Macy ],[ 143eda14cbcSMatt Macy AC_MSG_RESULT(no) 144eda14cbcSMatt Macy ]) 145eda14cbcSMatt Macy]) 146eda14cbcSMatt Macy 147caed7b1cSMartin Matuskadnl # 148caed7b1cSMartin Matuskadnl # Linux 5.12 API, 149caed7b1cSMartin Matuskadnl # 150caed7b1cSMartin Matuskadnl # The Linux 5.12 kernel updated struct bio to create a new bi_bdev member 151caed7b1cSMartin Matuskadnl # and bio->bi_disk was moved to bio->bi_bdev->bd_disk 152caed7b1cSMartin Matuskadnl # 153caed7b1cSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK], [ 154caed7b1cSMartin Matuska ZFS_LINUX_TEST_SRC([bio_bdev_disk], [ 155caed7b1cSMartin Matuska #include <linux/blk_types.h> 156caed7b1cSMartin Matuska #include <linux/blkdev.h> 157caed7b1cSMartin Matuska ],[ 158caed7b1cSMartin Matuska struct bio *b = NULL; 159caed7b1cSMartin Matuska struct gendisk *d = b->bi_bdev->bd_disk; 160caed7b1cSMartin Matuska blk_register_queue(d); 161caed7b1cSMartin Matuska ]) 162caed7b1cSMartin Matuska]) 163caed7b1cSMartin Matuska 164caed7b1cSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_BIO_BDEV_DISK], [ 165caed7b1cSMartin Matuska AC_MSG_CHECKING([whether bio->bi_bdev->bd_disk exists]) 166caed7b1cSMartin Matuska ZFS_LINUX_TEST_RESULT([bio_bdev_disk], [ 167caed7b1cSMartin Matuska AC_MSG_RESULT(yes) 168caed7b1cSMartin Matuska AC_DEFINE(HAVE_BIO_BDEV_DISK, 1, [bio->bi_bdev->bd_disk exists]) 169caed7b1cSMartin Matuska ],[ 170caed7b1cSMartin Matuska AC_MSG_RESULT(no) 171caed7b1cSMartin Matuska ]) 172caed7b1cSMartin Matuska]) 173caed7b1cSMartin Matuska 174681ce946SMartin Matuskadnl # 175681ce946SMartin Matuskadnl # Linux 5.16 API 176681ce946SMartin Matuskadnl # 177681ce946SMartin Matuskadnl # The Linux 5.16 API for submit_bio changed the return type to be 178681ce946SMartin Matuskadnl # void instead of int 179681ce946SMartin Matuskadnl # 180681ce946SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID], [ 181681ce946SMartin Matuska ZFS_LINUX_TEST_SRC([bio_bdev_submit_bio_void], [ 182681ce946SMartin Matuska #include <linux/blkdev.h> 183681ce946SMartin Matuska ],[ 184681ce946SMartin Matuska struct block_device_operations *bdev = NULL; 185681ce946SMartin Matuska __attribute__((unused)) void(*f)(struct bio *) = bdev->submit_bio; 186681ce946SMartin Matuska ]) 187681ce946SMartin Matuska]) 188681ce946SMartin Matuska 189681ce946SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID], [ 190681ce946SMartin Matuska AC_MSG_CHECKING( 191681ce946SMartin Matuska [whether block_device_operations->submit_bio() returns void]) 192681ce946SMartin Matuska ZFS_LINUX_TEST_RESULT([bio_bdev_submit_bio_void], [ 193681ce946SMartin Matuska AC_MSG_RESULT(yes) 194681ce946SMartin Matuska AC_DEFINE(HAVE_BDEV_SUBMIT_BIO_RETURNS_VOID, 1, 195681ce946SMartin Matuska [block_device_operations->submit_bio() returns void]) 196681ce946SMartin Matuska ],[ 197681ce946SMartin Matuska AC_MSG_RESULT(no) 198681ce946SMartin Matuska ]) 199681ce946SMartin Matuska]) 200681ce946SMartin Matuska 201681ce946SMartin Matuskadnl # 202da5137abSMartin Matuskadnl # Linux 5.18 API 203da5137abSMartin Matuskadnl # 204da5137abSMartin Matuskadnl # In 07888c665b405b1cd3577ddebfeb74f4717a84c4 ("block: pass a block_device and opf to bio_alloc") 205da5137abSMartin Matuskadnl # bio_alloc(gfp_t gfp_mask, unsigned short nr_iovecs) 206da5137abSMartin Matuskadnl # became 207da5137abSMartin Matuskadnl # bio_alloc(struct block_device *bdev, unsigned short nr_vecs, unsigned int opf, gfp_t gfp_mask) 208da5137abSMartin Matuskadnl # however 209da5137abSMartin Matuskadnl # > NULL/0 can be passed, both for the 210da5137abSMartin Matuskadnl # > passthrough case on a raw request_queue and to temporarily avoid 211da5137abSMartin Matuskadnl # > refactoring some nasty code. 212da5137abSMartin Matuskadnl # 213da5137abSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_ALLOC_4ARG], [ 214da5137abSMartin Matuska ZFS_LINUX_TEST_SRC([bio_alloc_4arg], [ 215da5137abSMartin Matuska #include <linux/bio.h> 216da5137abSMartin Matuska ],[ 217da5137abSMartin Matuska gfp_t gfp_mask = 0; 218da5137abSMartin Matuska unsigned short nr_iovecs = 0; 219da5137abSMartin Matuska struct block_device *bdev = NULL; 220da5137abSMartin Matuska unsigned int opf = 0; 221da5137abSMartin Matuska 222da5137abSMartin Matuska struct bio *__attribute__((unused)) allocated = bio_alloc(bdev, nr_iovecs, opf, gfp_mask); 223da5137abSMartin Matuska ]) 224da5137abSMartin Matuska]) 225da5137abSMartin Matuska 226da5137abSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_BIO_ALLOC_4ARG], [ 227*e3aa18adSMartin Matuska AC_MSG_CHECKING([whether bio_alloc() wants 4 args]) 228da5137abSMartin Matuska ZFS_LINUX_TEST_RESULT([bio_alloc_4arg],[ 229da5137abSMartin Matuska AC_MSG_RESULT(yes) 230da5137abSMartin Matuska AC_DEFINE([HAVE_BIO_ALLOC_4ARG], 1, [bio_alloc() takes 4 arguments]) 231da5137abSMartin Matuska ],[ 232da5137abSMartin Matuska AC_MSG_RESULT(no) 233da5137abSMartin Matuska ]) 234da5137abSMartin Matuska]) 235da5137abSMartin Matuska 236eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [ 237eda14cbcSMatt Macy ZFS_AC_KERNEL_SRC_BIO_OPS 238eda14cbcSMatt Macy ZFS_AC_KERNEL_SRC_BIO_SET_DEV 239eda14cbcSMatt Macy ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST 240eda14cbcSMatt Macy ZFS_AC_KERNEL_SRC_BLKG_TRYGET 241caed7b1cSMartin Matuska ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK 242681ce946SMartin Matuska ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID 243681ce946SMartin Matuska ZFS_AC_KERNEL_SRC_BIO_SET_DEV_MACRO 244da5137abSMartin Matuska ZFS_AC_KERNEL_SRC_BIO_ALLOC_4ARG 245eda14cbcSMatt Macy]) 246eda14cbcSMatt Macy 247eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_BIO], [ 248eda14cbcSMatt Macy ZFS_AC_KERNEL_BIO_SET_OP_ATTRS 249eda14cbcSMatt Macy ZFS_AC_KERNEL_BIO_SET_DEV 250eda14cbcSMatt Macy ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST 251eda14cbcSMatt Macy ZFS_AC_KERNEL_BLKG_TRYGET 252caed7b1cSMartin Matuska ZFS_AC_KERNEL_BIO_BDEV_DISK 253681ce946SMartin Matuska ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID 254da5137abSMartin Matuska ZFS_AC_KERNEL_BIO_ALLOC_4ARG 255eda14cbcSMatt Macy]) 256