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