aboutsummaryrefslogtreecommitdiffstats
path: root/config/kernel-get-link.m4
blob: 1f8f5b0c8b723ea43fe267cfd0b8131d795d1795 (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
dnl #
dnl # Supported get_link() interfaces checked newest to oldest.
dnl # Note this interface used to be named follow_link.
dnl #
AC_DEFUN([ZFS_AC_KERNEL_SRC_GET_LINK], [
	ZFS_LINUX_TEST_SRC([inode_operations_get_link], [
		#include <linux/fs.h>
		static const char *get_link(struct dentry *de, struct inode *ip,
		    struct delayed_call *done) { return "symlink"; }
		static struct inode_operations
		     iops __attribute__ ((unused)) = {
			.get_link = get_link,
		};
	],[])

	ZFS_LINUX_TEST_SRC([inode_operations_get_link_cookie], [
		#include <linux/fs.h>
		static const char *get_link(struct dentry *de, struct
		    inode *ip, void **cookie) { return "symlink"; }
		static struct inode_operations
		     iops __attribute__ ((unused)) = {
			.get_link = get_link,
		};
	],[])

	ZFS_LINUX_TEST_SRC([inode_operations_follow_link], [
		#include <linux/fs.h>
		static const char *follow_link(struct dentry *de,
		    void **cookie) { return "symlink"; }
		static struct inode_operations
		    iops __attribute__ ((unused)) = {
			.follow_link = follow_link,
		};
	],[])

	ZFS_LINUX_TEST_SRC([inode_operations_follow_link_nameidata], [
		#include <linux/fs.h>
		static void *follow_link(struct dentry *de, struct
		    nameidata *nd) { return (void *)NULL; }
		static struct inode_operations
		    iops __attribute__ ((unused)) = {
			.follow_link = follow_link,
		};
	],[])
])

AC_DEFUN([ZFS_AC_KERNEL_GET_LINK], [
	dnl #
	dnl # 4.5 API change
	dnl # The get_link interface has added a delayed done call and
	dnl # used it to retire the put_link() interface.
	dnl #
	AC_MSG_CHECKING([whether iops->get_link() passes delayed])
	ZFS_LINUX_TEST_RESULT([inode_operations_get_link], [
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_GET_LINK_DELAYED, 1, [iops->get_link() delayed])
	],[
		AC_MSG_RESULT(no)

		dnl #
		dnl # 4.5 API change
		dnl # The follow_link() interface has been replaced by
		dnl # get_link() which behaves the same as before except:
		dnl # - An inode is passed as a separate argument
		dnl # - When called in RCU mode a NULL dentry is passed.
		dnl #
		AC_MSG_CHECKING([whether iops->get_link() passes cookie])
		ZFS_LINUX_TEST_RESULT([inode_operations_get_link_cookie], [
			AC_MSG_RESULT(yes)
			AC_DEFINE(HAVE_GET_LINK_COOKIE, 1,
			    [iops->get_link() cookie])
		],[
			AC_MSG_RESULT(no)

			dnl #
			dnl # 4.2 API change
			dnl # This kernel retired the nameidata structure.
			dnl #
			AC_MSG_CHECKING(
			    [whether iops->follow_link() passes cookie])
			ZFS_LINUX_TEST_RESULT([inode_operations_follow_link], [
				AC_MSG_RESULT(yes)
				AC_DEFINE(HAVE_FOLLOW_LINK_COOKIE, 1,
				    [iops->follow_link() cookie])
			],[
				AC_MSG_RESULT(no)

				dnl #
				dnl # 2.6.32 API
				dnl #
				AC_MSG_CHECKING(
				[whether iops->follow_link() passes nameidata])
				ZFS_LINUX_TEST_RESULT(
				    [inode_operations_follow_link_nameidata],[
					AC_MSG_RESULT(yes)
					AC_DEFINE(HAVE_FOLLOW_LINK_NAMEIDATA, 1,
					    [iops->follow_link() nameidata])
				],[
					ZFS_LINUX_TEST_ERROR([get_link])
				])
			])
		])
	])
])