xref: /freebsd/sys/contrib/openzfs/config/kernel-acl.m4 (revision eda14cbc264d6969b02f2b1994cef11148e914f1)
1*eda14cbcSMatt Macydnl #
2*eda14cbcSMatt Macydnl # Check if posix_acl_release can be used from a ZFS_META_LICENSED
3*eda14cbcSMatt Macydnl # module.  The is_owner_or_cap macro was replaced by
4*eda14cbcSMatt Macydnl # inode_owner_or_capable
5*eda14cbcSMatt Macydnl #
6*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_POSIX_ACL_RELEASE], [
7*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([posix_acl_release], [
8*eda14cbcSMatt Macy		#include <linux/cred.h>
9*eda14cbcSMatt Macy		#include <linux/fs.h>
10*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
11*eda14cbcSMatt Macy	], [
12*eda14cbcSMatt Macy		struct posix_acl *tmp = posix_acl_alloc(1, 0);
13*eda14cbcSMatt Macy		posix_acl_release(tmp);
14*eda14cbcSMatt Macy	], [], [$ZFS_META_LICENSE])
15*eda14cbcSMatt Macy])
16*eda14cbcSMatt Macy
17*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_RELEASE], [
18*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether posix_acl_release() is available])
19*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([posix_acl_release], [
20*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
21*eda14cbcSMatt Macy		AC_DEFINE(HAVE_POSIX_ACL_RELEASE, 1,
22*eda14cbcSMatt Macy		    [posix_acl_release() is available])
23*eda14cbcSMatt Macy
24*eda14cbcSMatt Macy		AC_MSG_CHECKING([whether posix_acl_release() is GPL-only])
25*eda14cbcSMatt Macy		ZFS_LINUX_TEST_RESULT([posix_acl_release_license], [
26*eda14cbcSMatt Macy			AC_MSG_RESULT(no)
27*eda14cbcSMatt Macy		],[
28*eda14cbcSMatt Macy			AC_MSG_RESULT(yes)
29*eda14cbcSMatt Macy			AC_DEFINE(HAVE_POSIX_ACL_RELEASE_GPL_ONLY, 1,
30*eda14cbcSMatt Macy			    [posix_acl_release() is GPL-only])
31*eda14cbcSMatt Macy		])
32*eda14cbcSMatt Macy	],[
33*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
34*eda14cbcSMatt Macy	])
35*eda14cbcSMatt Macy])
36*eda14cbcSMatt Macy
37*eda14cbcSMatt Macydnl #
38*eda14cbcSMatt Macydnl # 3.14 API change,
39*eda14cbcSMatt Macydnl # set_cached_acl() and forget_cached_acl() changed from inline to
40*eda14cbcSMatt Macydnl # EXPORT_SYMBOL. In the former case, they may not be usable because of
41*eda14cbcSMatt Macydnl # posix_acl_release. In the latter case, we can always use them.
42*eda14cbcSMatt Macydnl #
43*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_SET_CACHED_ACL_USABLE], [
44*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([set_cached_acl], [
45*eda14cbcSMatt Macy		#include <linux/cred.h>
46*eda14cbcSMatt Macy		#include <linux/fs.h>
47*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
48*eda14cbcSMatt Macy	], [
49*eda14cbcSMatt Macy		struct inode *ip = NULL;
50*eda14cbcSMatt Macy		struct posix_acl *acl = posix_acl_alloc(1, 0);
51*eda14cbcSMatt Macy		set_cached_acl(ip, ACL_TYPE_ACCESS, acl);
52*eda14cbcSMatt Macy		forget_cached_acl(ip, ACL_TYPE_ACCESS);
53*eda14cbcSMatt Macy	], [], [$ZFS_META_LICENSE])
54*eda14cbcSMatt Macy])
55*eda14cbcSMatt Macy
56*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SET_CACHED_ACL_USABLE], [
57*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether set_cached_acl() is usable])
58*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([set_cached_acl_license], [
59*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
60*eda14cbcSMatt Macy		AC_DEFINE(HAVE_SET_CACHED_ACL_USABLE, 1,
61*eda14cbcSMatt Macy		    [set_cached_acl() is usable])
62*eda14cbcSMatt Macy	],[
63*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
64*eda14cbcSMatt Macy	])
65*eda14cbcSMatt Macy])
66*eda14cbcSMatt Macy
67*eda14cbcSMatt Macydnl #
68*eda14cbcSMatt Macydnl # 3.1 API change,
69*eda14cbcSMatt Macydnl # posix_acl_chmod() was added as the preferred interface.
70*eda14cbcSMatt Macydnl #
71*eda14cbcSMatt Macydnl # 3.14 API change,
72*eda14cbcSMatt Macydnl # posix_acl_chmod() was changed to __posix_acl_chmod()
73*eda14cbcSMatt Macydnl #
74*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_POSIX_ACL_CHMOD], [
75*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([posix_acl_chmod], [
76*eda14cbcSMatt Macy		#include <linux/fs.h>
77*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
78*eda14cbcSMatt Macy	],[
79*eda14cbcSMatt Macy		posix_acl_chmod(NULL, 0, 0)
80*eda14cbcSMatt Macy	])
81*eda14cbcSMatt Macy
82*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([__posix_acl_chmod], [
83*eda14cbcSMatt Macy		#include <linux/fs.h>
84*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
85*eda14cbcSMatt Macy	],[
86*eda14cbcSMatt Macy		__posix_acl_chmod(NULL, 0, 0)
87*eda14cbcSMatt Macy	])
88*eda14cbcSMatt Macy])
89*eda14cbcSMatt Macy
90*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_CHMOD], [
91*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether __posix_acl_chmod exists])
92*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([__posix_acl_chmod], [
93*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
94*eda14cbcSMatt Macy		AC_DEFINE(HAVE___POSIX_ACL_CHMOD, 1,
95*eda14cbcSMatt Macy		    [__posix_acl_chmod() exists])
96*eda14cbcSMatt Macy	],[
97*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
98*eda14cbcSMatt Macy
99*eda14cbcSMatt Macy		AC_MSG_CHECKING([whether posix_acl_chmod exists])
100*eda14cbcSMatt Macy		ZFS_LINUX_TEST_RESULT([posix_acl_chmod], [
101*eda14cbcSMatt Macy			AC_MSG_RESULT(yes)
102*eda14cbcSMatt Macy			AC_DEFINE(HAVE_POSIX_ACL_CHMOD, 1,
103*eda14cbcSMatt Macy			    [posix_acl_chmod() exists])
104*eda14cbcSMatt Macy		],[
105*eda14cbcSMatt Macy			ZFS_LINUX_TEST_ERROR([posix_acl_chmod()])
106*eda14cbcSMatt Macy		])
107*eda14cbcSMatt Macy	])
108*eda14cbcSMatt Macy])
109*eda14cbcSMatt Macy
110*eda14cbcSMatt Macydnl #
111*eda14cbcSMatt Macydnl # 3.1 API change,
112*eda14cbcSMatt Macydnl # posix_acl_equiv_mode now wants an umode_t instead of a mode_t
113*eda14cbcSMatt Macydnl #
114*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_POSIX_ACL_EQUIV_MODE_WANTS_UMODE_T], [
115*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([posix_acl_equiv_mode], [
116*eda14cbcSMatt Macy		#include <linux/fs.h>
117*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
118*eda14cbcSMatt Macy	],[
119*eda14cbcSMatt Macy		umode_t tmp;
120*eda14cbcSMatt Macy		posix_acl_equiv_mode(NULL, &tmp);
121*eda14cbcSMatt Macy	])
122*eda14cbcSMatt Macy])
123*eda14cbcSMatt Macy
124*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_EQUIV_MODE_WANTS_UMODE_T], [
125*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether posix_acl_equiv_mode() wants umode_t])
126*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([posix_acl_equiv_mode], [
127*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
128*eda14cbcSMatt Macy	],[
129*eda14cbcSMatt Macy		ZFS_LINUX_TEST_ERROR([posix_acl_equiv_mode()])
130*eda14cbcSMatt Macy	])
131*eda14cbcSMatt Macy])
132*eda14cbcSMatt Macy
133*eda14cbcSMatt Macydnl #
134*eda14cbcSMatt Macydnl # 4.8 API change,
135*eda14cbcSMatt Macydnl # The function posix_acl_valid now must be passed a namespace.
136*eda14cbcSMatt Macydnl #
137*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_POSIX_ACL_VALID_WITH_NS], [
138*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([posix_acl_valid_with_ns], [
139*eda14cbcSMatt Macy		#include <linux/fs.h>
140*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
141*eda14cbcSMatt Macy	],[
142*eda14cbcSMatt Macy		struct user_namespace *user_ns = NULL;
143*eda14cbcSMatt Macy		const struct posix_acl *acl = NULL;
144*eda14cbcSMatt Macy		int error;
145*eda14cbcSMatt Macy
146*eda14cbcSMatt Macy		error = posix_acl_valid(user_ns, acl);
147*eda14cbcSMatt Macy	])
148*eda14cbcSMatt Macy])
149*eda14cbcSMatt Macy
150*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_VALID_WITH_NS], [
151*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether posix_acl_valid() wants user namespace])
152*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([posix_acl_valid_with_ns], [
153*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
154*eda14cbcSMatt Macy		AC_DEFINE(HAVE_POSIX_ACL_VALID_WITH_NS, 1,
155*eda14cbcSMatt Macy		    [posix_acl_valid() wants user namespace])
156*eda14cbcSMatt Macy	],[
157*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
158*eda14cbcSMatt Macy	])
159*eda14cbcSMatt Macy])
160*eda14cbcSMatt Macy
161*eda14cbcSMatt Macydnl #
162*eda14cbcSMatt Macydnl # 3.1 API change,
163*eda14cbcSMatt Macydnl # Check if inode_operations contains the function get_acl
164*eda14cbcSMatt Macydnl #
165*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_GET_ACL], [
166*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([inode_operations_get_acl], [
167*eda14cbcSMatt Macy		#include <linux/fs.h>
168*eda14cbcSMatt Macy
169*eda14cbcSMatt Macy		struct posix_acl *get_acl_fn(struct inode *inode, int type)
170*eda14cbcSMatt Macy		    { return NULL; }
171*eda14cbcSMatt Macy
172*eda14cbcSMatt Macy		static const struct inode_operations
173*eda14cbcSMatt Macy		    iops __attribute__ ((unused)) = {
174*eda14cbcSMatt Macy			.get_acl = get_acl_fn,
175*eda14cbcSMatt Macy		};
176*eda14cbcSMatt Macy	],[])
177*eda14cbcSMatt Macy])
178*eda14cbcSMatt Macy
179*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL], [
180*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether iops->get_acl() exists])
181*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([inode_operations_get_acl], [
182*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
183*eda14cbcSMatt Macy	],[
184*eda14cbcSMatt Macy		ZFS_LINUX_TEST_ERROR([iops->get_acl()])
185*eda14cbcSMatt Macy	])
186*eda14cbcSMatt Macy])
187*eda14cbcSMatt Macy
188*eda14cbcSMatt Macydnl #
189*eda14cbcSMatt Macydnl # 3.14 API change,
190*eda14cbcSMatt Macydnl # Check if inode_operations contains the function set_acl
191*eda14cbcSMatt Macydnl #
192*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_SET_ACL], [
193*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([inode_operations_set_acl], [
194*eda14cbcSMatt Macy		#include <linux/fs.h>
195*eda14cbcSMatt Macy
196*eda14cbcSMatt Macy		int set_acl_fn(struct inode *inode, struct posix_acl *acl,
197*eda14cbcSMatt Macy		    int type) { return 0; }
198*eda14cbcSMatt Macy
199*eda14cbcSMatt Macy		static const struct inode_operations
200*eda14cbcSMatt Macy		    iops __attribute__ ((unused)) = {
201*eda14cbcSMatt Macy			.set_acl = set_acl_fn,
202*eda14cbcSMatt Macy		};
203*eda14cbcSMatt Macy	],[])
204*eda14cbcSMatt Macy])
205*eda14cbcSMatt Macy
206*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL], [
207*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether iops->set_acl() exists])
208*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([inode_operations_set_acl], [
209*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
210*eda14cbcSMatt Macy		AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists])
211*eda14cbcSMatt Macy	],[
212*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
213*eda14cbcSMatt Macy	])
214*eda14cbcSMatt Macy])
215*eda14cbcSMatt Macy
216*eda14cbcSMatt Macydnl #
217*eda14cbcSMatt Macydnl # 4.7 API change,
218*eda14cbcSMatt Macydnl # The kernel get_acl will now check cache before calling i_op->get_acl and
219*eda14cbcSMatt Macydnl # do set_cached_acl after that, so i_op->get_acl don't need to do that
220*eda14cbcSMatt Macydnl # anymore.
221*eda14cbcSMatt Macydnl #
222*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_GET_ACL_HANDLE_CACHE], [
223*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([get_acl_handle_cache], [
224*eda14cbcSMatt Macy		#include <linux/fs.h>
225*eda14cbcSMatt Macy	],[
226*eda14cbcSMatt Macy		void *sentinel __attribute__ ((unused)) =
227*eda14cbcSMatt Macy		    uncached_acl_sentinel(NULL);
228*eda14cbcSMatt Macy	])
229*eda14cbcSMatt Macy])
230*eda14cbcSMatt Macy
231*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE], [
232*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether uncached_acl_sentinel() exists])
233*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([get_acl_handle_cache], [
234*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
235*eda14cbcSMatt Macy		AC_DEFINE(HAVE_KERNEL_GET_ACL_HANDLE_CACHE, 1,
236*eda14cbcSMatt Macy		    [uncached_acl_sentinel() exists])
237*eda14cbcSMatt Macy	],[
238*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
239*eda14cbcSMatt Macy	])
240*eda14cbcSMatt Macy])
241*eda14cbcSMatt Macy
242*eda14cbcSMatt Macydnl #
243*eda14cbcSMatt Macydnl # 4.16 kernel: check if struct posix_acl acl.a_refcount is a refcount_t.
244*eda14cbcSMatt Macydnl # It's an atomic_t on older kernels.
245*eda14cbcSMatt Macydnl #
246*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_ACL_HAS_REFCOUNT], [
247*eda14cbcSMatt Macy	ZFS_LINUX_TEST_SRC([acl_refcount], [
248*eda14cbcSMatt Macy		#include <linux/backing-dev.h>
249*eda14cbcSMatt Macy		#include <linux/refcount.h>
250*eda14cbcSMatt Macy		#include <linux/posix_acl.h>
251*eda14cbcSMatt Macy	],[
252*eda14cbcSMatt Macy		struct posix_acl acl;
253*eda14cbcSMatt Macy		refcount_t *r __attribute__ ((unused)) = &acl.a_refcount;
254*eda14cbcSMatt Macy	])
255*eda14cbcSMatt Macy])
256*eda14cbcSMatt Macy
257*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_ACL_HAS_REFCOUNT], [
258*eda14cbcSMatt Macy	AC_MSG_CHECKING([whether posix_acl has refcount_t])
259*eda14cbcSMatt Macy	ZFS_LINUX_TEST_RESULT([acl_refcount], [
260*eda14cbcSMatt Macy		AC_MSG_RESULT(yes)
261*eda14cbcSMatt Macy		AC_DEFINE(HAVE_ACL_REFCOUNT, 1, [posix_acl has refcount_t])
262*eda14cbcSMatt Macy	],[
263*eda14cbcSMatt Macy		AC_MSG_RESULT(no)
264*eda14cbcSMatt Macy	])
265*eda14cbcSMatt Macy])
266*eda14cbcSMatt Macy
267*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_ACL], [
268*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_POSIX_ACL_RELEASE
269*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_SET_CACHED_ACL_USABLE
270*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_POSIX_ACL_CHMOD
271*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_POSIX_ACL_EQUIV_MODE_WANTS_UMODE_T
272*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_POSIX_ACL_VALID_WITH_NS
273*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_GET_ACL
274*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_SET_ACL
275*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_GET_ACL_HANDLE_CACHE
276*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SRC_ACL_HAS_REFCOUNT
277*eda14cbcSMatt Macy])
278*eda14cbcSMatt Macy
279*eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_ACL], [
280*eda14cbcSMatt Macy	ZFS_AC_KERNEL_POSIX_ACL_RELEASE
281*eda14cbcSMatt Macy	ZFS_AC_KERNEL_SET_CACHED_ACL_USABLE
282*eda14cbcSMatt Macy	ZFS_AC_KERNEL_POSIX_ACL_CHMOD
283*eda14cbcSMatt Macy	ZFS_AC_KERNEL_POSIX_ACL_EQUIV_MODE_WANTS_UMODE_T
284*eda14cbcSMatt Macy	ZFS_AC_KERNEL_POSIX_ACL_VALID_WITH_NS
285*eda14cbcSMatt Macy	ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL
286*eda14cbcSMatt Macy	ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
287*eda14cbcSMatt Macy	ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
288*eda14cbcSMatt Macy	ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
289*eda14cbcSMatt Macy])
290