summaryrefslogtreecommitdiffstats
path: root/config/kernel-get-link.m4
blob: 022c49c54de7d371e1993d0f92310c004bc2aa69 (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
dnl #
dnl # Supported get_link() interfaces checked newest to oldest.
dnl #
AC_DEFUN([ZFS_AC_KERNEL_FOLLOW_LINK], [
	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_TRY_COMPILE([
		#include <linux/fs.h>
		const char *follow_link(struct dentry *de,
		    void **cookie) { return "symlink"; }
		static struct inode_operations
		    iops __attribute__ ((unused)) = {
			.follow_link = follow_link,
		};
	],[
	],[
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_FOLLOW_LINK_COOKIE, 1,
		    [iops->follow_link() cookie])
	],[
		dnl #
		dnl # 2.6.32 API
		dnl #
		AC_MSG_RESULT(no)
		AC_MSG_CHECKING(
		   [whether iops->follow_link() passes nameidata])
		ZFS_LINUX_TRY_COMPILE([
		#include <linux/fs.h>
			void *follow_link(struct dentry *de, struct
			    nameidata *nd) { return (void *)NULL; }
			static struct inode_operations
			    iops __attribute__ ((unused)) = {
				.follow_link = follow_link,
			};
		],[
		],[
			AC_MSG_RESULT(yes)
			AC_DEFINE(HAVE_FOLLOW_LINK_NAMEIDATA, 1,
			          [iops->follow_link() nameidata])
		],[
                        AC_MSG_ERROR(no; please file a bug report)
		])
	])
])

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_TRY_COMPILE([
		#include <linux/fs.h>
		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,
		};
	],[
	],[
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_GET_LINK_DELAYED, 1,
		    [iops->get_link() delayed])
	],[
		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_RESULT(no)
		AC_MSG_CHECKING([whether iops->get_link() passes cookie])
		ZFS_LINUX_TRY_COMPILE([
			#include <linux/fs.h>
			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,
			};
		],[
		],[
			AC_MSG_RESULT(yes)
			AC_DEFINE(HAVE_GET_LINK_COOKIE, 1,
			    [iops->get_link() cookie])
		],[
			dnl #
			dnl # Check for the follow_link APIs.
			dnl #
			AC_MSG_RESULT(no)
			ZFS_AC_KERNEL_FOLLOW_LINK
		])
	])
])