1f9693befSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_RENAME], [ 2eda14cbcSMatt Macy dnl # 3*dbd5678dSMartin Matuska dnl # 3.9 (to 4.9) API change, 4*dbd5678dSMartin Matuska dnl # 5*dbd5678dSMartin Matuska dnl # A new version of iops->rename() was added (rename2) that takes a flag 6*dbd5678dSMartin Matuska dnl # argument (to support renameat2). However this separate function was 7*dbd5678dSMartin Matuska dnl # merged back into iops->rename() in Linux 4.9. 8*dbd5678dSMartin Matuska dnl # 9*dbd5678dSMartin Matuska ZFS_LINUX_TEST_SRC([inode_operations_rename2], [ 10*dbd5678dSMartin Matuska #include <linux/fs.h> 11*dbd5678dSMartin Matuska int rename2_fn(struct inode *sip, struct dentry *sdp, 12*dbd5678dSMartin Matuska struct inode *tip, struct dentry *tdp, 13*dbd5678dSMartin Matuska unsigned int flags) { return 0; } 14*dbd5678dSMartin Matuska 15*dbd5678dSMartin Matuska static const struct inode_operations 16*dbd5678dSMartin Matuska iops __attribute__ ((unused)) = { 17*dbd5678dSMartin Matuska .rename2 = rename2_fn, 18*dbd5678dSMartin Matuska }; 19*dbd5678dSMartin Matuska ],[]) 20*dbd5678dSMartin Matuska 21*dbd5678dSMartin Matuska dnl # 22eda14cbcSMatt Macy dnl # 4.9 API change, 23*dbd5678dSMartin Matuska dnl # 24*dbd5678dSMartin Matuska dnl # iops->rename2() merged into iops->rename(), and iops->rename() now 25*dbd5678dSMartin 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 # 40*dbd5678dSMartin Matuska dnl # EL7 compatibility 41*dbd5678dSMartin Matuska dnl # 42*dbd5678dSMartin Matuska dnl # EL7 has backported renameat2 support, but it's done by defining a 43*dbd5678dSMartin Matuska dnl # separate iops wrapper structure that takes the .renameat2 function. 44*dbd5678dSMartin Matuska dnl # 45*dbd5678dSMartin Matuska ZFS_LINUX_TEST_SRC([dir_inode_operations_wrapper_rename2], [ 46*dbd5678dSMartin Matuska #include <linux/fs.h> 47*dbd5678dSMartin Matuska int rename2_fn(struct inode *sip, struct dentry *sdp, 48*dbd5678dSMartin Matuska struct inode *tip, struct dentry *tdp, 49*dbd5678dSMartin Matuska unsigned int flags) { return 0; } 50*dbd5678dSMartin Matuska 51*dbd5678dSMartin Matuska static const struct inode_operations_wrapper 52*dbd5678dSMartin Matuska iops __attribute__ ((unused)) = { 53*dbd5678dSMartin Matuska .rename2 = rename2_fn, 54*dbd5678dSMartin Matuska }; 55*dbd5678dSMartin Matuska ],[]) 56*dbd5678dSMartin Matuska 57*dbd5678dSMartin Matuska dnl # 58f9693befSMartin Matuska dnl # 5.12 API change, 59f9693befSMartin Matuska dnl # 60*dbd5678dSMartin Matuska dnl # Linux 5.12 introduced passing struct user_namespace* as the first 61*dbd5678dSMartin 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 ],[]) 74eda14cbcSMatt Macy]) 75eda14cbcSMatt Macy 76f9693befSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_RENAME], [ 77f9693befSMartin Matuska AC_MSG_CHECKING([whether iops->rename() takes struct user_namespace*]) 78f9693befSMartin Matuska ZFS_LINUX_TEST_RESULT([inode_operations_rename_userns], [ 79f9693befSMartin Matuska AC_MSG_RESULT(yes) 80f9693befSMartin Matuska AC_DEFINE(HAVE_IOPS_RENAME_USERNS, 1, 81f9693befSMartin Matuska [iops->rename() takes struct user_namespace*]) 82f9693befSMartin Matuska ],[ 83f9693befSMartin Matuska AC_MSG_RESULT(no) 84f9693befSMartin Matuska 85*dbd5678dSMartin Matuska AC_MSG_CHECKING([whether iops->rename2() exists]) 86*dbd5678dSMartin Matuska ZFS_LINUX_TEST_RESULT([inode_operations_rename2], [ 87*dbd5678dSMartin Matuska AC_MSG_RESULT(yes) 88*dbd5678dSMartin Matuska AC_DEFINE(HAVE_RENAME2, 1, [iops->rename2() exists]) 89*dbd5678dSMartin Matuska ],[ 90*dbd5678dSMartin Matuska AC_MSG_RESULT(no) 91*dbd5678dSMartin Matuska 92*dbd5678dSMartin Matuska AC_MSG_CHECKING([whether iops->rename() wants flags]) 93f9693befSMartin Matuska ZFS_LINUX_TEST_RESULT([inode_operations_rename_flags], [ 94eda14cbcSMatt Macy AC_MSG_RESULT(yes) 95eda14cbcSMatt Macy AC_DEFINE(HAVE_RENAME_WANTS_FLAGS, 1, 96eda14cbcSMatt Macy [iops->rename() wants flags]) 97eda14cbcSMatt Macy ],[ 98eda14cbcSMatt Macy AC_MSG_RESULT(no) 99*dbd5678dSMartin Matuska 100*dbd5678dSMartin Matuska AC_MSG_CHECKING([whether struct inode_operations_wrapper takes .rename2()]) 101*dbd5678dSMartin Matuska ZFS_LINUX_TEST_RESULT([dir_inode_operations_wrapper_rename2], [ 102*dbd5678dSMartin Matuska AC_MSG_RESULT(yes) 103*dbd5678dSMartin Matuska AC_DEFINE(HAVE_RENAME2_OPERATIONS_WRAPPER, 1, 104*dbd5678dSMartin Matuska [struct inode_operations_wrapper takes .rename2()]) 105*dbd5678dSMartin Matuska ],[ 106*dbd5678dSMartin Matuska AC_MSG_RESULT(no) 107*dbd5678dSMartin Matuska ]) 108*dbd5678dSMartin Matuska ]) 109eda14cbcSMatt Macy ]) 110eda14cbcSMatt Macy ]) 111f9693befSMartin Matuska]) 112