1dnl #
2dnl # 2.6.39 API change,
3dnl # The is_owner_or_cap() macro was renamed to inode_owner_or_capable(),
4dnl # This is used for permission checks in the xattr and file attribute call
5dnl # paths.
6dnl #
7dnl # 5.12 API change,
8dnl # inode_owner_or_capable() now takes struct user_namespace *
9dnl # to support idmapped mounts
10dnl #
11AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE], [
12	ZFS_LINUX_TEST_SRC([inode_owner_or_capable], [
13		#include <linux/fs.h>
14	],[
15		struct inode *ip = NULL;
16		(void) inode_owner_or_capable(ip);
17	])
18
19	ZFS_LINUX_TEST_SRC([inode_owner_or_capable_userns], [
20		#include <linux/fs.h>
21	],[
22		struct inode *ip = NULL;
23		(void) inode_owner_or_capable(&init_user_ns, ip);
24	])
25
26	ZFS_LINUX_TEST_SRC([inode_owner_or_capable_mnt_idmap], [
27		#include <linux/fs.h>
28		#include <linux/mnt_idmapping.h>
29	],[
30		struct inode *ip = NULL;
31		(void) inode_owner_or_capable(&nop_mnt_idmap, ip);
32	])
33])
34
35AC_DEFUN([ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE], [
36	AC_MSG_CHECKING([whether inode_owner_or_capable() exists])
37	ZFS_LINUX_TEST_RESULT([inode_owner_or_capable], [
38		AC_MSG_RESULT(yes)
39		AC_DEFINE(HAVE_INODE_OWNER_OR_CAPABLE, 1,
40		    [inode_owner_or_capable() exists])
41	], [
42		AC_MSG_RESULT(no)
43
44		AC_MSG_CHECKING(
45		    [whether inode_owner_or_capable() takes user_ns])
46		ZFS_LINUX_TEST_RESULT([inode_owner_or_capable_userns], [
47			AC_MSG_RESULT(yes)
48			AC_DEFINE(HAVE_INODE_OWNER_OR_CAPABLE_USERNS, 1,
49			    [inode_owner_or_capable() takes user_ns])
50		],[
51			AC_MSG_RESULT(no)
52			AC_MSG_CHECKING(
53			    [whether inode_owner_or_capable() takes mnt_idmap])
54			ZFS_LINUX_TEST_RESULT([inode_owner_or_capable_mnt_idmap], [
55				AC_MSG_RESULT(yes)
56				AC_DEFINE(HAVE_INODE_OWNER_OR_CAPABLE_IDMAP, 1,
57				    [inode_owner_or_capable() takes mnt_idmap])
58			], [
59				ZFS_LINUX_TEST_ERROR([capability])
60			])
61		])
62	])
63])
64