Fix O_APPEND for Linux 3.15 and older kernels
[zfs.git] / config / kernel-vfs-direct_IO.m4
blob82583d52fcbcbdd7b4ee16545a701b39eb615099
1 dnl #
2 dnl # Check for direct IO interfaces.
3 dnl #
4 AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_DIRECT_IO], [
5         ZFS_LINUX_TEST_SRC([direct_io_iter], [
6                 #include <linux/fs.h>
8                 ssize_t test_direct_IO(struct kiocb *kiocb,
9                     struct iov_iter *iter) { return 0; }
11                 static const struct address_space_operations
12                     aops __attribute__ ((unused)) = {
13                         .direct_IO = test_direct_IO,
14                 };
15         ],[])
17         ZFS_LINUX_TEST_SRC([direct_io_iter_offset], [
18                 #include <linux/fs.h>
20                 ssize_t test_direct_IO(struct kiocb *kiocb,
21                     struct iov_iter *iter, loff_t offset) { return 0; }
23                 static const struct address_space_operations
24                     aops __attribute__ ((unused)) = {
25                         .direct_IO = test_direct_IO,
26                 };
27         ],[])
29         ZFS_LINUX_TEST_SRC([direct_io_iter_rw_offset], [
30                 #include <linux/fs.h>
32                 ssize_t test_direct_IO(int rw, struct kiocb *kiocb,
33                     struct iov_iter *iter, loff_t offset) { return 0; }
35                 static const struct address_space_operations
36                     aops __attribute__ ((unused)) = {
37                     .direct_IO = test_direct_IO,
38                 };
39         ],[])
41         ZFS_LINUX_TEST_SRC([direct_io_iovec], [
42                 #include <linux/fs.h>
44                 ssize_t test_direct_IO(int rw, struct kiocb *kiocb,
45                     const struct iovec *iov, loff_t offset,
46                     unsigned long nr_segs) { return 0; }
48                 static const struct address_space_operations
49                     aops __attribute__ ((unused)) = {
50                     .direct_IO = test_direct_IO,
51                 };
52         ],[])
55 AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO], [
56         dnl #
57         dnl # Linux 4.6.x API change
58         dnl #
59         AC_MSG_CHECKING([whether aops->direct_IO() uses iov_iter])
60         ZFS_LINUX_TEST_RESULT([direct_io_iter], [
61                 AC_MSG_RESULT([yes])
62                 AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER, 1,
63                     [aops->direct_IO() uses iov_iter without rw])
64         ],[
65                 AC_MSG_RESULT([no])
67                 dnl #
68                 dnl # Linux 4.1.x API change
69                 dnl #
70                 AC_MSG_CHECKING(
71                     [whether aops->direct_IO() uses offset])
72                 ZFS_LINUX_TEST_RESULT([direct_io_iter_offset], [
73                         AC_MSG_RESULT([yes])
74                         AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER_OFFSET, 1,
75                             [aops->direct_IO() uses iov_iter with offset])
77                 ],[
78                         AC_MSG_RESULT([no])
80                         dnl #
81                         dnl # Linux 3.16.x API change
82                         dnl #
83                         AC_MSG_CHECKING(
84                             [whether aops->direct_IO() uses rw and offset])
85                         ZFS_LINUX_TEST_RESULT([direct_io_iter_rw_offset], [
86                                 AC_MSG_RESULT([yes])
87                                 AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER_RW_OFFSET, 1,
88                                     [aops->direct_IO() uses iov_iter with ]
89                                     [rw and offset])
90                         ],[
91                                 AC_MSG_RESULT([no])
93                                 dnl #
94                                 dnl # Ancient Linux API (predates git)
95                                 dnl #
96                                 AC_MSG_CHECKING(
97                                     [whether aops->direct_IO() uses iovec])
98                                 ZFS_LINUX_TEST_RESULT([direct_io_iovec], [
99                                         AC_MSG_RESULT([yes])
100                                         AC_DEFINE(HAVE_VFS_DIRECT_IO_IOVEC, 1,
101                                             [aops->direct_IO() uses iovec])
102                                 ],[
103                                         ZFS_LINUX_TEST_ERROR([direct IO])
104                                         AC_MSG_RESULT([no])
105                                 ])
106                         ])
107                 ])
108         ])