xref: /freebsd/sys/contrib/openzfs/config/kernel-rename.m4 (revision d411c1d696ef35d60f8c3564e5eef7aeafa2fece)
1f9693befSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_RENAME], [
2eda14cbcSMatt Macy	dnl #
3dbd5678dSMartin Matuska	dnl # 3.9 (to 4.9) API change,
4dbd5678dSMartin Matuska	dnl #
5dbd5678dSMartin Matuska	dnl # A new version of iops->rename() was added (rename2) that takes a flag
6dbd5678dSMartin Matuska	dnl # argument (to support renameat2). However this separate function was
7dbd5678dSMartin Matuska	dnl # merged back into iops->rename() in Linux 4.9.
8dbd5678dSMartin Matuska	dnl #
9dbd5678dSMartin Matuska	ZFS_LINUX_TEST_SRC([inode_operations_rename2], [
10dbd5678dSMartin Matuska		#include <linux/fs.h>
11dbd5678dSMartin Matuska		int rename2_fn(struct inode *sip, struct dentry *sdp,
12dbd5678dSMartin Matuska			struct inode *tip, struct dentry *tdp,
13dbd5678dSMartin Matuska			unsigned int flags) { return 0; }
14dbd5678dSMartin Matuska
15dbd5678dSMartin Matuska		static const struct inode_operations
16dbd5678dSMartin Matuska		    iops __attribute__ ((unused)) = {
17dbd5678dSMartin Matuska			.rename2 = rename2_fn,
18dbd5678dSMartin Matuska		};
19dbd5678dSMartin Matuska	],[])
20dbd5678dSMartin Matuska
21dbd5678dSMartin Matuska	dnl #
22eda14cbcSMatt Macy	dnl # 4.9 API change,
23dbd5678dSMartin Matuska	dnl #
24dbd5678dSMartin Matuska	dnl # iops->rename2() merged into iops->rename(), and iops->rename() now
25dbd5678dSMartin Matuska	dnl # wants flags.
26eda14cbcSMatt Macy	dnl #
27f9693befSMartin Matuska	ZFS_LINUX_TEST_SRC([inode_operations_rename_flags], [
28eda14cbcSMatt Macy		#include <linux/fs.h>
29eda14cbcSMatt Macy		int rename_fn(struct inode *sip, struct dentry *sdp,
30eda14cbcSMatt Macy			struct inode *tip, struct dentry *tdp,
31eda14cbcSMatt Macy			unsigned int flags) { return 0; }
32eda14cbcSMatt Macy
33eda14cbcSMatt Macy		static const struct inode_operations
34eda14cbcSMatt Macy		    iops __attribute__ ((unused)) = {
35eda14cbcSMatt Macy			.rename = rename_fn,
36eda14cbcSMatt Macy		};
37eda14cbcSMatt Macy	],[])
38f9693befSMartin Matuska
39f9693befSMartin Matuska	dnl #
40dbd5678dSMartin Matuska	dnl # EL7 compatibility
41dbd5678dSMartin Matuska	dnl #
42dbd5678dSMartin Matuska	dnl # EL7 has backported renameat2 support, but it's done by defining a
43dbd5678dSMartin Matuska	dnl # separate iops wrapper structure that takes the .renameat2 function.
44dbd5678dSMartin Matuska	dnl #
45dbd5678dSMartin Matuska	ZFS_LINUX_TEST_SRC([dir_inode_operations_wrapper_rename2], [
46dbd5678dSMartin Matuska		#include <linux/fs.h>
47dbd5678dSMartin Matuska		int rename2_fn(struct inode *sip, struct dentry *sdp,
48dbd5678dSMartin Matuska			struct inode *tip, struct dentry *tdp,
49dbd5678dSMartin Matuska			unsigned int flags) { return 0; }
50dbd5678dSMartin Matuska
51dbd5678dSMartin Matuska		static const struct inode_operations_wrapper
52dbd5678dSMartin Matuska		    iops __attribute__ ((unused)) = {
53dbd5678dSMartin Matuska			.rename2 = rename2_fn,
54dbd5678dSMartin Matuska		};
55dbd5678dSMartin Matuska	],[])
56dbd5678dSMartin Matuska
57dbd5678dSMartin Matuska	dnl #
58f9693befSMartin Matuska	dnl # 5.12 API change,
59f9693befSMartin Matuska	dnl #
60dbd5678dSMartin Matuska	dnl # Linux 5.12 introduced passing struct user_namespace* as the first
61dbd5678dSMartin Matuska	dnl # argument of the rename() and other inode_operations members.
62f9693befSMartin Matuska	dnl #
63f9693befSMartin Matuska	ZFS_LINUX_TEST_SRC([inode_operations_rename_userns], [
64f9693befSMartin Matuska		#include <linux/fs.h>
65f9693befSMartin Matuska		int rename_fn(struct user_namespace *user_ns, struct inode *sip,
66f9693befSMartin Matuska			struct dentry *sdp, struct inode *tip, struct dentry *tdp,
67f9693befSMartin Matuska			unsigned int flags) { return 0; }
68f9693befSMartin Matuska
69f9693befSMartin Matuska		static const struct inode_operations
70f9693befSMartin Matuska		    iops __attribute__ ((unused)) = {
71f9693befSMartin Matuska			.rename = rename_fn,
72f9693befSMartin Matuska		};
73f9693befSMartin Matuska	],[])
74*d411c1d6SMartin Matuska
75*d411c1d6SMartin Matuska	dnl #
76*d411c1d6SMartin Matuska	dnl # 6.3 API change - the first arg is now struct mnt_idmap*
77*d411c1d6SMartin Matuska	dnl #
78*d411c1d6SMartin Matuska	ZFS_LINUX_TEST_SRC([inode_operations_rename_mnt_idmap], [
79*d411c1d6SMartin Matuska		#include <linux/fs.h>
80*d411c1d6SMartin Matuska		int rename_fn(struct mnt_idmap *idmap, struct inode *sip,
81*d411c1d6SMartin Matuska			struct dentry *sdp, struct inode *tip, struct dentry *tdp,
82*d411c1d6SMartin Matuska			unsigned int flags) { return 0; }
83*d411c1d6SMartin Matuska
84*d411c1d6SMartin Matuska		static const struct inode_operations
85*d411c1d6SMartin Matuska		    iops __attribute__ ((unused)) = {
86*d411c1d6SMartin Matuska			.rename = rename_fn,
87*d411c1d6SMartin Matuska		};
88*d411c1d6SMartin Matuska	],[])
89eda14cbcSMatt Macy])
90eda14cbcSMatt Macy
91f9693befSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_RENAME], [
92*d411c1d6SMartin Matuska	AC_MSG_CHECKING([whether iops->rename() takes struct mnt_idmap*])
93*d411c1d6SMartin Matuska	ZFS_LINUX_TEST_RESULT([inode_operations_rename_mnt_idmap], [
94*d411c1d6SMartin Matuska		AC_MSG_RESULT(yes)
95*d411c1d6SMartin Matuska		AC_DEFINE(HAVE_IOPS_RENAME_IDMAP, 1,
96*d411c1d6SMartin Matuska		    [iops->rename() takes struct mnt_idmap*])
97*d411c1d6SMartin Matuska	],[
98f9693befSMartin Matuska		AC_MSG_CHECKING([whether iops->rename() takes struct user_namespace*])
99f9693befSMartin Matuska		ZFS_LINUX_TEST_RESULT([inode_operations_rename_userns], [
100f9693befSMartin Matuska			AC_MSG_RESULT(yes)
101f9693befSMartin Matuska			AC_DEFINE(HAVE_IOPS_RENAME_USERNS, 1,
102f9693befSMartin Matuska			    [iops->rename() takes struct user_namespace*])
103f9693befSMartin Matuska		],[
104f9693befSMartin Matuska			AC_MSG_RESULT(no)
105f9693befSMartin Matuska
106dbd5678dSMartin Matuska			AC_MSG_CHECKING([whether iops->rename2() exists])
107dbd5678dSMartin Matuska			ZFS_LINUX_TEST_RESULT([inode_operations_rename2], [
108dbd5678dSMartin Matuska				AC_MSG_RESULT(yes)
109dbd5678dSMartin Matuska				AC_DEFINE(HAVE_RENAME2, 1, [iops->rename2() exists])
110dbd5678dSMartin Matuska			],[
111dbd5678dSMartin Matuska				AC_MSG_RESULT(no)
112dbd5678dSMartin Matuska
113dbd5678dSMartin Matuska				AC_MSG_CHECKING([whether iops->rename() wants flags])
114f9693befSMartin Matuska				ZFS_LINUX_TEST_RESULT([inode_operations_rename_flags], [
115eda14cbcSMatt Macy					AC_MSG_RESULT(yes)
116eda14cbcSMatt Macy					AC_DEFINE(HAVE_RENAME_WANTS_FLAGS, 1,
117eda14cbcSMatt Macy						[iops->rename() wants flags])
118eda14cbcSMatt Macy				],[
119eda14cbcSMatt Macy					AC_MSG_RESULT(no)
120dbd5678dSMartin Matuska
121dbd5678dSMartin Matuska					AC_MSG_CHECKING([whether struct inode_operations_wrapper takes .rename2()])
122dbd5678dSMartin Matuska					ZFS_LINUX_TEST_RESULT([dir_inode_operations_wrapper_rename2], [
123dbd5678dSMartin Matuska						AC_MSG_RESULT(yes)
124dbd5678dSMartin Matuska						AC_DEFINE(HAVE_RENAME2_OPERATIONS_WRAPPER, 1,
125dbd5678dSMartin Matuska							[struct inode_operations_wrapper takes .rename2()])
126dbd5678dSMartin Matuska					],[
127dbd5678dSMartin Matuska						AC_MSG_RESULT(no)
128dbd5678dSMartin Matuska					])
129dbd5678dSMartin Matuska				])
130eda14cbcSMatt Macy			])
131eda14cbcSMatt Macy		])
132f9693befSMartin Matuska	])
133*d411c1d6SMartin Matuska])
134