2 dnl # 2.6.36 API change,
3 dnl # REQ_FAILFAST_{DEV|TRANSPORT|DRIVER}
8 dnl # REQ_FLUSH was renamed to REQ_PREFLUSH
10 AC_DEFUN([ZFS_AC_KERNEL_SRC_REQ], [
11 ZFS_LINUX_TEST_SRC([req_failfast_mask], [
12 #include <linux/bio.h>
14 int flags __attribute__ ((unused));
15 flags = REQ_FAILFAST_MASK;
18 ZFS_LINUX_TEST_SRC([req_discard], [
19 #include <linux/bio.h>
21 int flags __attribute__ ((unused));
25 ZFS_LINUX_TEST_SRC([req_flush], [
26 #include <linux/bio.h>
28 int flags __attribute__ ((unused));
32 ZFS_LINUX_TEST_SRC([req_preflush], [
33 #include <linux/bio.h>
35 int flags __attribute__ ((unused));
40 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_FAILFAST_MASK], [
41 AC_MSG_CHECKING([whether REQ_FAILFAST_MASK is defined])
42 ZFS_LINUX_TEST_RESULT([req_failfast_mask], [
45 ZFS_LINUX_TEST_ERROR([REQ_FAILFAST_MASK])
49 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_DISCARD], [
50 AC_MSG_CHECKING([whether REQ_DISCARD is defined])
51 ZFS_LINUX_TEST_RESULT([req_discard], [
53 AC_DEFINE(HAVE_REQ_DISCARD, 1, [REQ_DISCARD is defined])
59 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_FLUSH], [
60 AC_MSG_CHECKING([whether REQ_FLUSH is defined])
61 ZFS_LINUX_TEST_RESULT([req_flush], [
63 AC_DEFINE(HAVE_REQ_FLUSH, 1, [REQ_FLUSH is defined])
69 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_PREFLUSH], [
70 AC_MSG_CHECKING([whether REQ_PREFLUSH is defined])
71 ZFS_LINUX_TEST_RESULT([req_preflush], [
73 AC_DEFINE(HAVE_REQ_PREFLUSH, 1, [REQ_PREFLUSH is defined])
82 dnl # The bio_op() helper was introduced as a replacement for explicitly
83 dnl # checking the bio->bi_rw flags. The following checks are used to
84 dnl # detect if a specific operation is supported.
86 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_OPS], [
87 ZFS_LINUX_TEST_SRC([req_op_discard], [
88 #include <linux/blk_types.h>
90 int op __attribute__ ((unused)) = REQ_OP_DISCARD;
93 ZFS_LINUX_TEST_SRC([req_op_secure_erase], [
94 #include <linux/blk_types.h>
96 int op __attribute__ ((unused)) = REQ_OP_SECURE_ERASE;
99 ZFS_LINUX_TEST_SRC([req_op_flush], [
100 #include <linux/blk_types.h>
102 int op __attribute__ ((unused)) = REQ_OP_FLUSH;
105 ZFS_LINUX_TEST_SRC([bio_bi_opf], [
106 #include <linux/bio.h>
108 struct bio bio __attribute__ ((unused));
112 ZFS_LINUX_TEST_SRC([bio_set_op_attrs], [
113 #include <linux/bio.h>
115 struct bio *bio __attribute__ ((unused)) = NULL;
116 bio_set_op_attrs(bio, 0, 0);
120 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_OP_DISCARD], [
121 AC_MSG_CHECKING([whether REQ_OP_DISCARD is defined])
122 ZFS_LINUX_TEST_RESULT([req_op_discard], [
124 AC_DEFINE(HAVE_REQ_OP_DISCARD, 1, [REQ_OP_DISCARD is defined])
130 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_OP_SECURE_ERASE], [
131 AC_MSG_CHECKING([whether REQ_OP_SECURE_ERASE is defined])
132 ZFS_LINUX_TEST_RESULT([req_op_secure_erase], [
134 AC_DEFINE(HAVE_REQ_OP_SECURE_ERASE, 1,
135 [REQ_OP_SECURE_ERASE is defined])
141 AC_DEFUN([ZFS_AC_KERNEL_BIO_REQ_OP_FLUSH], [
142 AC_MSG_CHECKING([whether REQ_OP_FLUSH is defined])
143 ZFS_LINUX_TEST_RESULT([req_op_flush], [
145 AC_DEFINE(HAVE_REQ_OP_FLUSH, 1, [REQ_OP_FLUSH is defined])
151 AC_DEFUN([ZFS_AC_KERNEL_BIO_BI_OPF], [
152 AC_MSG_CHECKING([whether bio->bi_opf is defined])
153 ZFS_LINUX_TEST_RESULT([bio_bi_opf], [
155 AC_DEFINE(HAVE_BIO_BI_OPF, 1, [bio->bi_opf is defined])
161 AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_OP_ATTRS], [
162 AC_MSG_CHECKING([whether bio_set_op_attrs is available])
163 ZFS_LINUX_TEST_RESULT([bio_set_op_attrs], [
165 AC_DEFINE(HAVE_BIO_SET_OP_ATTRS, 1,
166 [bio_set_op_attrs is available])
173 dnl # Linux 4.14 API,
175 dnl # The bio_set_dev() helper macro was introduced as part of the transition
176 dnl # to have struct gendisk in struct bio.
180 dnl # The bio_set_dev() helper macro was updated to internally depend on
181 dnl # bio_associate_blkg() symbol which is exported GPL-only.
183 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV], [
184 ZFS_LINUX_TEST_SRC([bio_set_dev], [
185 #include <linux/bio.h>
186 #include <linux/fs.h>
188 struct block_device *bdev = NULL;
189 struct bio *bio = NULL;
190 bio_set_dev(bio, bdev);
191 ], [], [ZFS_META_LICENSE])
194 AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
195 AC_MSG_CHECKING([whether bio_set_dev() is available])
196 ZFS_LINUX_TEST_RESULT([bio_set_dev], [
198 AC_DEFINE(HAVE_BIO_SET_DEV, 1, [bio_set_dev() is available])
200 AC_MSG_CHECKING([whether bio_set_dev() is GPL-only])
201 ZFS_LINUX_TEST_RESULT([bio_set_dev_license], [
205 AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1,
206 [bio_set_dev() GPL-only])
215 dnl # Error argument dropped from bio_endio in favor of newly introduced
216 dnl # bio->bi_error. This also replaces bio->bi_flags value BIO_UPTODATE.
217 dnl # Introduced by torvalds/linux@4246a0b63bd8f56a1469b12eafeb875b1041a451
218 dnl # ("block: add a bi_error field to struct bio").
220 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_END_IO_T_ARGS], [
221 ZFS_LINUX_TEST_SRC([bio_end_io_t_args], [
222 #include <linux/bio.h>
223 void wanted_end_io(struct bio *bio) { return; }
224 bio_end_io_t *end_io __attribute__ ((unused)) = wanted_end_io;
228 AC_DEFUN([ZFS_AC_KERNEL_BIO_END_IO_T_ARGS], [
229 AC_MSG_CHECKING([whether bio_end_io_t wants 1 arg])
230 ZFS_LINUX_TEST_RESULT([bio_end_io_t_args], [
232 AC_DEFINE(HAVE_1ARG_BIO_END_IO_T, 1,
233 [bio_end_io_t wants 1 arg])
240 dnl # 4.13 API change
241 dnl # The bio->bi_error field was replaced with bio->bi_status which is an
242 dnl # enum which describes all possible error types.
244 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_BI_STATUS], [
245 ZFS_LINUX_TEST_SRC([bio_bi_status], [
246 #include <linux/bio.h>
248 struct bio bio __attribute__ ((unused));
249 blk_status_t status __attribute__ ((unused)) = BLK_STS_OK;
250 bio.bi_status = status;
254 AC_DEFUN([ZFS_AC_KERNEL_BIO_BI_STATUS], [
255 AC_MSG_CHECKING([whether bio->bi_status exists])
256 ZFS_LINUX_TEST_RESULT([bio_bi_status], [
258 AC_DEFINE(HAVE_BIO_BI_STATUS, 1, [bio->bi_status exists])
265 dnl # 3.14 API change,
266 dnl # Immutable biovecs. A number of fields of struct bio are moved to
267 dnl # struct bvec_iter.
269 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_BVEC_ITER], [
270 ZFS_LINUX_TEST_SRC([bio_bvec_iter], [
271 #include <linux/bio.h>
274 bio.bi_iter.bi_sector = 0;
278 AC_DEFUN([ZFS_AC_KERNEL_BIO_BVEC_ITER], [
279 AC_MSG_CHECKING([whether bio has bi_iter])
280 ZFS_LINUX_TEST_RESULT([bio_bvec_iter], [
282 AC_DEFINE(HAVE_BIO_BVEC_ITER, 1, [bio has bi_iter])
290 dnl # The rw argument has been removed from submit_bio/submit_bio_wait.
291 dnl # Callers are now expected to set bio->bi_rw instead of passing it in.
293 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SUBMIT_BIO], [
294 ZFS_LINUX_TEST_SRC([submit_bio], [
295 #include <linux/bio.h>
297 struct bio *bio = NULL;
298 (void) submit_bio(bio);
302 AC_DEFUN([ZFS_AC_KERNEL_BIO_SUBMIT_BIO], [
303 AC_MSG_CHECKING([whether submit_bio() wants 1 arg])
304 ZFS_LINUX_TEST_RESULT([submit_bio], [
306 AC_DEFINE(HAVE_1ARG_SUBMIT_BIO, 1, [submit_bio() wants 1 arg])
313 dnl # 2.6.34 API change
314 dnl # current->bio_list
316 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST], [
317 ZFS_LINUX_TEST_SRC([current_bio_list], [
318 #include <linux/sched.h>
320 current->bio_list = (struct bio_list *) NULL;
324 AC_DEFUN([ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST], [
325 AC_MSG_CHECKING([whether current->bio_list exists])
326 ZFS_LINUX_TEST_RESULT([current_bio_list], [
329 ZFS_LINUX_TEST_ERROR([bio_list])
336 dnl # The Linux 5.5 kernel updated percpu_ref_tryget() which is inlined by
337 dnl # blkg_tryget() to use rcu_read_lock() instead of rcu_read_lock_sched().
338 dnl # As a side effect the function was converted to GPL-only.
340 AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKG_TRYGET], [
341 ZFS_LINUX_TEST_SRC([blkg_tryget], [
342 #include <linux/blk-cgroup.h>
343 #include <linux/bio.h>
344 #include <linux/fs.h>
346 struct blkcg_gq blkg __attribute__ ((unused)) = {};
347 bool rc __attribute__ ((unused));
348 rc = blkg_tryget(&blkg);
349 ], [], [ZFS_META_LICENSE])
352 AC_DEFUN([ZFS_AC_KERNEL_BLKG_TRYGET], [
353 AC_MSG_CHECKING([whether blkg_tryget() is available])
354 ZFS_LINUX_TEST_RESULT([blkg_tryget], [
356 AC_DEFINE(HAVE_BLKG_TRYGET, 1, [blkg_tryget() is available])
358 AC_MSG_CHECKING([whether blkg_tryget() is GPL-only])
359 ZFS_LINUX_TEST_RESULT([blkg_tryget_license], [
363 AC_DEFINE(HAVE_BLKG_TRYGET_GPL_ONLY, 1,
364 [blkg_tryget() GPL-only])
372 dnl # Linux 5.12 API,
374 dnl # The Linux 5.12 kernel updated struct bio to create a new bi_bdev member
375 dnl # and bio->bi_disk was moved to bio->bi_bdev->bd_disk
377 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK], [
378 ZFS_LINUX_TEST_SRC([bio_bdev_disk], [
379 #include <linux/blk_types.h>
380 #include <linux/blkdev.h>
382 struct bio *b = NULL;
383 struct gendisk *d = b->bi_bdev->bd_disk;
384 blk_register_queue(d);
388 AC_DEFUN([ZFS_AC_KERNEL_BIO_BDEV_DISK], [
389 AC_MSG_CHECKING([whether bio->bi_bdev->bd_disk exists])
390 ZFS_LINUX_TEST_RESULT([bio_bdev_disk], [
392 AC_DEFINE(HAVE_BIO_BDEV_DISK, 1, [bio->bi_bdev->bd_disk exists])
401 dnl # The Linux 5.16 API for submit_bio changed the return type to be
402 dnl # void instead of int
404 AC_DEFUN([ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID], [
405 ZFS_LINUX_TEST_SRC([bio_bdev_submit_bio_void], [
406 #include <linux/blkdev.h>
408 struct block_device_operations *bdev = NULL;
409 __attribute__((unused)) void(*f)(struct bio *) = bdev->submit_bio;
413 AC_DEFUN([ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID], [
415 [whether block_device_operations->submit_bio() returns void])
416 ZFS_LINUX_TEST_RESULT([bio_bdev_submit_bio_void], [
418 AC_DEFINE(HAVE_BDEV_SUBMIT_BIO_RETURNS_VOID, 1,
419 [block_device_operations->submit_bio() returns void])
425 AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [
426 ZFS_AC_KERNEL_SRC_REQ
427 ZFS_AC_KERNEL_SRC_BIO_OPS
428 ZFS_AC_KERNEL_SRC_BIO_SET_DEV
429 ZFS_AC_KERNEL_SRC_BIO_END_IO_T_ARGS
430 ZFS_AC_KERNEL_SRC_BIO_BI_STATUS
431 ZFS_AC_KERNEL_SRC_BIO_BVEC_ITER
432 ZFS_AC_KERNEL_SRC_BIO_SUBMIT_BIO
433 ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST
434 ZFS_AC_KERNEL_SRC_BLKG_TRYGET
435 ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK
436 ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID
439 AC_DEFUN([ZFS_AC_KERNEL_BIO], [
440 ZFS_AC_KERNEL_BIO_REQ_FAILFAST_MASK
441 ZFS_AC_KERNEL_BIO_REQ_DISCARD
442 ZFS_AC_KERNEL_BIO_REQ_FLUSH
443 ZFS_AC_KERNEL_BIO_REQ_PREFLUSH
445 ZFS_AC_KERNEL_BIO_REQ_OP_DISCARD
446 ZFS_AC_KERNEL_BIO_REQ_OP_SECURE_ERASE
447 ZFS_AC_KERNEL_BIO_REQ_OP_FLUSH
448 ZFS_AC_KERNEL_BIO_BI_OPF
449 ZFS_AC_KERNEL_BIO_SET_OP_ATTRS
451 ZFS_AC_KERNEL_BIO_SET_DEV
452 ZFS_AC_KERNEL_BIO_END_IO_T_ARGS
453 ZFS_AC_KERNEL_BIO_BI_STATUS
454 ZFS_AC_KERNEL_BIO_BVEC_ITER
455 ZFS_AC_KERNEL_BIO_SUBMIT_BIO
456 ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST
457 ZFS_AC_KERNEL_BLKG_TRYGET
458 ZFS_AC_KERNEL_BIO_BDEV_DISK
459 ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID