xref: /freebsd/sys/contrib/openzfs/config/kernel-xattr-handler.m4 (revision dd21556857e8d40f66bf5ad54754d9d52669ebf7)
1eda14cbcSMatt Macydnl #
2eda14cbcSMatt Macydnl # 2.6.35 API change,
3eda14cbcSMatt Macydnl # The 'struct xattr_handler' was constified in the generic
4eda14cbcSMatt Macydnl # super_block structure.
5eda14cbcSMatt Macydnl #
6eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_CONST_XATTR_HANDLER], [
7eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([const_xattr_handler], [
8eda14cbcSMatt Macy		#include <linux/fs.h>
9eda14cbcSMatt Macy		#include <linux/xattr.h>
10eda14cbcSMatt Macy
11eda14cbcSMatt Macy		const struct xattr_handler xattr_test_handler = {
12eda14cbcSMatt Macy			.prefix	= "test",
13eda14cbcSMatt Macy			.get	= NULL,
14eda14cbcSMatt Macy			.set	= NULL,
15eda14cbcSMatt Macy		};
16eda14cbcSMatt Macy
17eda14cbcSMatt Macy		const struct xattr_handler *xattr_handlers[] = {
18eda14cbcSMatt Macy			&xattr_test_handler,
19eda14cbcSMatt Macy		};
20eda14cbcSMatt Macy
21eda14cbcSMatt Macy		const struct super_block sb __attribute__ ((unused)) = {
22eda14cbcSMatt Macy			.s_xattr = xattr_handlers,
23eda14cbcSMatt Macy		};
24eda14cbcSMatt Macy	],[])
25eda14cbcSMatt Macy])
26eda14cbcSMatt Macy
27eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_CONST_XATTR_HANDLER], [
28eda14cbcSMatt Macy	AC_MSG_CHECKING([whether super_block uses const struct xattr_handler])
29eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([const_xattr_handler], [
30eda14cbcSMatt Macy		AC_MSG_RESULT([yes])
31eda14cbcSMatt Macy	],[
32eda14cbcSMatt Macy		ZFS_LINUX_TEST_ERROR([const xattr_handler])
33eda14cbcSMatt Macy	])
34eda14cbcSMatt Macy])
35eda14cbcSMatt Macy
36eda14cbcSMatt Macydnl #
37*7a7741afSMartin Matuskadnl # Android API change,
38*7a7741afSMartin Matuskadnl # The xattr_handler->get() callback was
39*7a7741afSMartin Matuskadnl # changed to take dentry, inode and flags.
40eda14cbcSMatt Macydnl #
41*7a7741afSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS], [
42c7046f76SMartin Matuska	ZFS_LINUX_TEST_SRC([xattr_handler_get_dentry_inode_flags], [
43c7046f76SMartin Matuska		#include <linux/xattr.h>
44c7046f76SMartin Matuska
45fd45b686SMartin Matuska		static int get(const struct xattr_handler *handler,
46c7046f76SMartin Matuska		    struct dentry *dentry, struct inode *inode,
47c7046f76SMartin Matuska		    const char *name, void *buffer,
48c7046f76SMartin Matuska		    size_t size, int flags) { return 0; }
49c7046f76SMartin Matuska		static const struct xattr_handler
50c7046f76SMartin Matuska		    xops __attribute__ ((unused)) = {
51c7046f76SMartin Matuska			.get = get,
52c7046f76SMartin Matuska		};
53c7046f76SMartin Matuska	],[])
54eda14cbcSMatt Macy])
55eda14cbcSMatt Macy
56*7a7741afSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS], [
57c7046f76SMartin Matuska	AC_MSG_CHECKING(
58c7046f76SMartin Matuska	    [whether xattr_handler->get() wants dentry and inode and flags])
59c7046f76SMartin Matuska	ZFS_LINUX_TEST_RESULT([xattr_handler_get_dentry_inode_flags], [
60c7046f76SMartin Matuska		AC_MSG_RESULT(yes)
61c7046f76SMartin Matuska		AC_DEFINE(HAVE_XATTR_GET_DENTRY_INODE_FLAGS, 1,
62c7046f76SMartin Matuska		    [xattr_handler->get() wants dentry and inode and flags])
63c7046f76SMartin Matuska	],[
64*7a7741afSMartin Matuska		AC_MSG_RESULT(no)
65eda14cbcSMatt Macy	])
66c7046f76SMartin Matuska])
67eda14cbcSMatt Macy
68eda14cbcSMatt Macydnl #
69eda14cbcSMatt Macydnl # Supported xattr handler set() interfaces checked newest to oldest.
70eda14cbcSMatt Macydnl #
71eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR_HANDLER_SET], [
72d411c1d6SMartin Matuska	ZFS_LINUX_TEST_SRC([xattr_handler_set_mnt_idmap], [
73d411c1d6SMartin Matuska		#include <linux/xattr.h>
74d411c1d6SMartin Matuska
75fd45b686SMartin Matuska		static int set(const struct xattr_handler *handler,
76d411c1d6SMartin Matuska			struct mnt_idmap *idmap,
77d411c1d6SMartin Matuska			struct dentry *dentry, struct inode *inode,
78d411c1d6SMartin Matuska			const char *name, const void *buffer,
79d411c1d6SMartin Matuska			size_t size, int flags)
80d411c1d6SMartin Matuska			{ return 0; }
81d411c1d6SMartin Matuska		static const struct xattr_handler
82d411c1d6SMartin Matuska			xops __attribute__ ((unused)) = {
83d411c1d6SMartin Matuska			.set = set,
84d411c1d6SMartin Matuska		};
85d411c1d6SMartin Matuska	],[])
86d411c1d6SMartin Matuska
87f9693befSMartin Matuska	ZFS_LINUX_TEST_SRC([xattr_handler_set_userns], [
88f9693befSMartin Matuska		#include <linux/xattr.h>
89f9693befSMartin Matuska
90fd45b686SMartin Matuska		static int set(const struct xattr_handler *handler,
91f9693befSMartin Matuska			struct user_namespace *mnt_userns,
92f9693befSMartin Matuska			struct dentry *dentry, struct inode *inode,
93f9693befSMartin Matuska			const char *name, const void *buffer,
94f9693befSMartin Matuska			size_t size, int flags)
95f9693befSMartin Matuska			{ return 0; }
96f9693befSMartin Matuska		static const struct xattr_handler
97f9693befSMartin Matuska			xops __attribute__ ((unused)) = {
98f9693befSMartin Matuska			.set = set,
99f9693befSMartin Matuska		};
100f9693befSMartin Matuska	],[])
101f9693befSMartin Matuska
102eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([xattr_handler_set_dentry_inode], [
103eda14cbcSMatt Macy		#include <linux/xattr.h>
104eda14cbcSMatt Macy
105fd45b686SMartin Matuska		static int set(const struct xattr_handler *handler,
106eda14cbcSMatt Macy		    struct dentry *dentry, struct inode *inode,
107eda14cbcSMatt Macy		    const char *name, const void *buffer,
108eda14cbcSMatt Macy		    size_t size, int flags)
109eda14cbcSMatt Macy		    { return 0; }
110eda14cbcSMatt Macy		static const struct xattr_handler
111eda14cbcSMatt Macy		    xops __attribute__ ((unused)) = {
112eda14cbcSMatt Macy			.set = set,
113eda14cbcSMatt Macy		};
114eda14cbcSMatt Macy	],[])
115eda14cbcSMatt Macy])
116eda14cbcSMatt Macy
117eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_SET], [
118eda14cbcSMatt Macy	dnl #
119f9693befSMartin Matuska	dnl # 5.12 API change,
120f9693befSMartin Matuska	dnl # The xattr_handler->set() callback was changed to 8 arguments, and
121f9693befSMartin Matuska	dnl # struct user_namespace* was inserted as arg #2
122f9693befSMartin Matuska	dnl #
123d411c1d6SMartin Matuska	dnl # 6.3 API change,
124d411c1d6SMartin Matuska	dnl # The xattr_handler->set() callback 2nd arg is now struct mnt_idmap *
125d411c1d6SMartin Matuska	dnl #
126d411c1d6SMartin Matuska	AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and mnt_idmap])
127d411c1d6SMartin Matuska	ZFS_LINUX_TEST_RESULT([xattr_handler_set_mnt_idmap], [
128d411c1d6SMartin Matuska		AC_MSG_RESULT(yes)
129d411c1d6SMartin Matuska		AC_DEFINE(HAVE_XATTR_SET_IDMAP, 1,
130d411c1d6SMartin Matuska		    [xattr_handler->set() takes mnt_idmap])
131d411c1d6SMartin Matuska	], [
132*7a7741afSMartin Matuska		AC_MSG_RESULT(no)
133f9693befSMartin Matuska		AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and user_namespace])
134f9693befSMartin Matuska		ZFS_LINUX_TEST_RESULT([xattr_handler_set_userns], [
135f9693befSMartin Matuska			AC_MSG_RESULT(yes)
136f9693befSMartin Matuska			AC_DEFINE(HAVE_XATTR_SET_USERNS, 1,
137f9693befSMartin Matuska			    [xattr_handler->set() takes user_namespace])
138f9693befSMartin Matuska		],[
139f9693befSMartin Matuska			dnl #
140eda14cbcSMatt Macy			dnl # 4.7 API change,
141eda14cbcSMatt Macy			dnl # The xattr_handler->set() callback was changed to take both
142eda14cbcSMatt Macy			dnl # dentry and inode.
143eda14cbcSMatt Macy			dnl #
144f9693befSMartin Matuska			AC_MSG_RESULT(no)
145eda14cbcSMatt Macy			AC_MSG_CHECKING([whether xattr_handler->set() wants dentry and inode])
146eda14cbcSMatt Macy			ZFS_LINUX_TEST_RESULT([xattr_handler_set_dentry_inode], [
147eda14cbcSMatt Macy				AC_MSG_RESULT(yes)
148eda14cbcSMatt Macy				AC_DEFINE(HAVE_XATTR_SET_DENTRY_INODE, 1,
149eda14cbcSMatt Macy				    [xattr_handler->set() wants both dentry and inode])
150eda14cbcSMatt Macy			],[
151eda14cbcSMatt Macy				ZFS_LINUX_TEST_ERROR([xattr set()])
152eda14cbcSMatt Macy			])
153eda14cbcSMatt Macy		])
154eda14cbcSMatt Macy	])
155eda14cbcSMatt Macy])
156eda14cbcSMatt Macy
157eda14cbcSMatt Macydnl #
158eda14cbcSMatt Macydnl # 4.9 API change,
159eda14cbcSMatt Macydnl # iops->{set,get,remove}xattr and generic_{set,get,remove}xattr are
160eda14cbcSMatt Macydnl # removed. xattr operations will directly go through sb->s_xattr.
161eda14cbcSMatt Macydnl #
162eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_SETXATTR], [
163eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([have_generic_setxattr], [
164eda14cbcSMatt Macy		#include <linux/fs.h>
165eda14cbcSMatt Macy		#include <linux/xattr.h>
166eda14cbcSMatt Macy
167eda14cbcSMatt Macy		static const struct inode_operations
168eda14cbcSMatt Macy		    iops __attribute__ ((unused)) = {
169eda14cbcSMatt Macy			.setxattr = generic_setxattr
170eda14cbcSMatt Macy		};
171eda14cbcSMatt Macy	],[])
172eda14cbcSMatt Macy])
173eda14cbcSMatt Macy
174eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR], [
175eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_CONST_XATTR_HANDLER
176*7a7741afSMartin Matuska	ZFS_AC_KERNEL_SRC_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS
177eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_XATTR_HANDLER_SET
178eda14cbcSMatt Macy])
179eda14cbcSMatt Macy
180eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_XATTR], [
181eda14cbcSMatt Macy	ZFS_AC_KERNEL_CONST_XATTR_HANDLER
182*7a7741afSMartin Matuska	ZFS_AC_KERNEL_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS
183eda14cbcSMatt Macy	ZFS_AC_KERNEL_XATTR_HANDLER_SET
184eda14cbcSMatt Macy])
185