xref: /freebsd/sys/contrib/openzfs/config/kernel-bio.m4 (revision 7a7741af18d6c8a804cc643cb7ecda9d730c6aa6)
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