diff options
Diffstat (limited to 'config/kernel-vfs-direct_IO.m4')
-rw-r--r-- | config/kernel-vfs-direct_IO.m4 | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/config/kernel-vfs-direct_IO.m4 b/config/kernel-vfs-direct_IO.m4 new file mode 100644 index 000000000000..82583d52fcbc --- /dev/null +++ b/config/kernel-vfs-direct_IO.m4 @@ -0,0 +1,109 @@ +dnl # +dnl # Check for direct IO interfaces. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_DIRECT_IO], [ + ZFS_LINUX_TEST_SRC([direct_io_iter], [ + #include <linux/fs.h> + + ssize_t test_direct_IO(struct kiocb *kiocb, + struct iov_iter *iter) { return 0; } + + static const struct address_space_operations + aops __attribute__ ((unused)) = { + .direct_IO = test_direct_IO, + }; + ],[]) + + ZFS_LINUX_TEST_SRC([direct_io_iter_offset], [ + #include <linux/fs.h> + + ssize_t test_direct_IO(struct kiocb *kiocb, + struct iov_iter *iter, loff_t offset) { return 0; } + + static const struct address_space_operations + aops __attribute__ ((unused)) = { + .direct_IO = test_direct_IO, + }; + ],[]) + + ZFS_LINUX_TEST_SRC([direct_io_iter_rw_offset], [ + #include <linux/fs.h> + + ssize_t test_direct_IO(int rw, struct kiocb *kiocb, + struct iov_iter *iter, loff_t offset) { return 0; } + + static const struct address_space_operations + aops __attribute__ ((unused)) = { + .direct_IO = test_direct_IO, + }; + ],[]) + + ZFS_LINUX_TEST_SRC([direct_io_iovec], [ + #include <linux/fs.h> + + ssize_t test_direct_IO(int rw, struct kiocb *kiocb, + const struct iovec *iov, loff_t offset, + unsigned long nr_segs) { return 0; } + + static const struct address_space_operations + aops __attribute__ ((unused)) = { + .direct_IO = test_direct_IO, + }; + ],[]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO], [ + dnl # + dnl # Linux 4.6.x API change + dnl # + AC_MSG_CHECKING([whether aops->direct_IO() uses iov_iter]) + ZFS_LINUX_TEST_RESULT([direct_io_iter], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER, 1, + [aops->direct_IO() uses iov_iter without rw]) + ],[ + AC_MSG_RESULT([no]) + + dnl # + dnl # Linux 4.1.x API change + dnl # + AC_MSG_CHECKING( + [whether aops->direct_IO() uses offset]) + ZFS_LINUX_TEST_RESULT([direct_io_iter_offset], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER_OFFSET, 1, + [aops->direct_IO() uses iov_iter with offset]) + + ],[ + AC_MSG_RESULT([no]) + + dnl # + dnl # Linux 3.16.x API change + dnl # + AC_MSG_CHECKING( + [whether aops->direct_IO() uses rw and offset]) + ZFS_LINUX_TEST_RESULT([direct_io_iter_rw_offset], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER_RW_OFFSET, 1, + [aops->direct_IO() uses iov_iter with ] + [rw and offset]) + ],[ + AC_MSG_RESULT([no]) + + dnl # + dnl # Ancient Linux API (predates git) + dnl # + AC_MSG_CHECKING( + [whether aops->direct_IO() uses iovec]) + ZFS_LINUX_TEST_RESULT([direct_io_iovec], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_VFS_DIRECT_IO_IOVEC, 1, + [aops->direct_IO() uses iovec]) + ],[ + ZFS_LINUX_TEST_ERROR([direct IO]) + AC_MSG_RESULT([no]) + ]) + ]) + ]) + ]) +]) |