summaryrefslogtreecommitdiffstats
path: root/config/kernel-vfs-direct_IO.m4
blob: cc50bfbe4e73371e01180f6913d16367b6c6c83a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
dnl #
dnl # Linux 4.6.x API change
dnl #
AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO_ITER], [
	AC_MSG_CHECKING([whether aops->direct_IO() uses iov_iter])
	ZFS_LINUX_TRY_COMPILE([
		#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,
		};
	],[
	],[
		AC_MSG_RESULT([yes])
		AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER, 1,
		    [aops->direct_IO() uses iov_iter without rw])
		zfs_ac_direct_io="yes"
	],[
		AC_MSG_RESULT([no])
	])
])

dnl #
dnl # Linux 4.1.x API change
dnl #
AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO_ITER_OFFSET], [
	AC_MSG_CHECKING(
	    [whether aops->direct_IO() uses iov_iter with offset])
	ZFS_LINUX_TRY_COMPILE([
		#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,
		};
	],[
	],[
		AC_MSG_RESULT([yes])
		AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER_OFFSET, 1,
		    [aops->direct_IO() uses iov_iter with offset])
		zfs_ac_direct_io="yes"
	],[
		AC_MSG_RESULT([no])
	])
])

dnl #
dnl # Linux 3.16.x API change
dnl #
AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO_ITER_RW_OFFSET], [
	AC_MSG_CHECKING(
	    [whether aops->direct_IO() uses iov_iter with rw and offset])
	ZFS_LINUX_TRY_COMPILE([
		#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,
		};
	],[
	],[
		AC_MSG_RESULT([yes])
		AC_DEFINE(HAVE_VFS_DIRECT_IO_ITER_RW_OFFSET, 1,
		    [aops->direct_IO() uses iov_iter with rw and offset])
		zfs_ac_direct_io="yes"
	],[
		AC_MSG_RESULT([no])
	])
])

dnl #
dnl # Ancient Linux API (predates git)
dnl #
AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO_IOVEC], [
	AC_MSG_CHECKING([whether aops->direct_IO() uses iovec])
	ZFS_LINUX_TRY_COMPILE([
		#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_MSG_RESULT([yes])
		AC_DEFINE(HAVE_VFS_DIRECT_IO_IOVEC, 1,
		    [aops->direct_IO() uses iovec])
		zfs_ac_direct_io="yes"
	],[
		AC_MSG_RESULT([no])
	])
])

AC_DEFUN([ZFS_AC_KERNEL_VFS_DIRECT_IO], [
	zfs_ac_direct_io="no"

	if test "$zfs_ac_direct_io" = "no"; then
		ZFS_AC_KERNEL_VFS_DIRECT_IO_ITER
	fi

	if test "$zfs_ac_direct_io" = "no"; then
		ZFS_AC_KERNEL_VFS_DIRECT_IO_ITER_OFFSET
	fi

	if test "$zfs_ac_direct_io" = "no"; then
		ZFS_AC_KERNEL_VFS_DIRECT_IO_ITER_RW_OFFSET
	fi

	if test "$zfs_ac_direct_io" = "no"; then
		ZFS_AC_KERNEL_VFS_DIRECT_IO_IOVEC
	fi

	if test "$zfs_ac_direct_io" = "no"; then
		AC_MSG_ERROR([no; unknown direct IO interface])
	fi
])