1eda14cbcSMatt Macydnl # 2eda14cbcSMatt Macydnl # 2.6.35 API change, 3eda14cbcSMatt Macydnl # The 'struct xattr_handler' was constified in the generic 4eda14cbcSMatt Macydnl # super_block structure. 5eda14cbcSMatt Macydnl # 6eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_CONST_XATTR_HANDLER], [ 7eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([const_xattr_handler], [ 8eda14cbcSMatt Macy #include <linux/fs.h> 9eda14cbcSMatt Macy #include <linux/xattr.h> 10eda14cbcSMatt Macy 11eda14cbcSMatt Macy const struct xattr_handler xattr_test_handler = { 12eda14cbcSMatt Macy .prefix = "test", 13eda14cbcSMatt Macy .get = NULL, 14eda14cbcSMatt Macy .set = NULL, 15eda14cbcSMatt Macy }; 16eda14cbcSMatt Macy 17eda14cbcSMatt Macy const struct xattr_handler *xattr_handlers[] = { 18eda14cbcSMatt Macy &xattr_test_handler, 19eda14cbcSMatt Macy }; 20eda14cbcSMatt Macy 21eda14cbcSMatt Macy const struct super_block sb __attribute__ ((unused)) = { 22eda14cbcSMatt Macy .s_xattr = xattr_handlers, 23eda14cbcSMatt Macy }; 24eda14cbcSMatt Macy ],[]) 25eda14cbcSMatt Macy]) 26eda14cbcSMatt Macy 27eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_CONST_XATTR_HANDLER], [ 28eda14cbcSMatt Macy AC_MSG_CHECKING([whether super_block uses const struct xattr_handler]) 29eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([const_xattr_handler], [ 30eda14cbcSMatt Macy AC_MSG_RESULT([yes]) 31eda14cbcSMatt Macy ],[ 32eda14cbcSMatt Macy ZFS_LINUX_TEST_ERROR([const xattr_handler]) 33eda14cbcSMatt Macy ]) 34eda14cbcSMatt Macy]) 35eda14cbcSMatt Macy 36eda14cbcSMatt Macydnl # 37*7a7741afSMartin Matuskadnl # Android API change, 38*7a7741afSMartin Matuskadnl # The xattr_handler->get() callback was 39*7a7741afSMartin Matuskadnl # changed to take dentry, inode and flags. 40eda14cbcSMatt Macydnl # 41*7a7741afSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS], [ 42c7046f76SMartin Matuska ZFS_LINUX_TEST_SRC([xattr_handler_get_dentry_inode_flags], [ 43c7046f76SMartin Matuska #include <linux/xattr.h> 44c7046f76SMartin Matuska 45fd45b686SMartin Matuska static int get(const struct xattr_handler *handler, 46c7046f76SMartin Matuska struct dentry *dentry, struct inode *inode, 47c7046f76SMartin Matuska const char *name, void *buffer, 48c7046f76SMartin Matuska size_t size, int flags) { return 0; } 49c7046f76SMartin Matuska static const struct xattr_handler 50c7046f76SMartin Matuska xops __attribute__ ((unused)) = { 51c7046f76SMartin Matuska .get = get, 52c7046f76SMartin Matuska }; 53c7046f76SMartin Matuska ],[]) 54eda14cbcSMatt Macy]) 55eda14cbcSMatt Macy 56*7a7741afSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS], [ 57c7046f76SMartin Matuska AC_MSG_CHECKING( 58c7046f76SMartin Matuska [whether xattr_handler->get() wants dentry and inode and flags]) 59c7046f76SMartin Matuska ZFS_LINUX_TEST_RESULT([xattr_handler_get_dentry_inode_flags], [ 60c7046f76SMartin Matuska AC_MSG_RESULT(yes) 61c7046f76SMartin Matuska AC_DEFINE(HAVE_XATTR_GET_DENTRY_INODE_FLAGS, 1, 62c7046f76SMartin Matuska [xattr_handler->get() wants dentry and inode and flags]) 63c7046f76SMartin Matuska ],[ 64*7a7741afSMartin Matuska AC_MSG_RESULT(no) 65eda14cbcSMatt Macy ]) 66c7046f76SMartin Matuska]) 67eda14cbcSMatt Macy 68eda14cbcSMatt Macydnl # 69eda14cbcSMatt Macydnl # Supported xattr handler set() interfaces checked newest to oldest. 70eda14cbcSMatt Macydnl # 71eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR_HANDLER_SET], [ 72d411c1d6SMartin Matuska ZFS_LINUX_TEST_SRC([xattr_handler_set_mnt_idmap], [ 73d411c1d6SMartin Matuska #include <linux/xattr.h> 74d411c1d6SMartin Matuska 75fd45b686SMartin Matuska static int set(const struct xattr_handler *handler, 76d411c1d6SMartin Matuska struct mnt_idmap *idmap, 77d411c1d6SMartin Matuska struct dentry *dentry, struct inode *inode, 78d411c1d6SMartin Matuska const char *name, const void *buffer, 79d411c1d6SMartin Matuska size_t size, int flags) 80d411c1d6SMartin Matuska { return 0; } 81d411c1d6SMartin Matuska static const struct xattr_handler 82d411c1d6SMartin Matuska xops __attribute__ ((unused)) = { 83d411c1d6SMartin Matuska .set = set, 84d411c1d6SMartin Matuska }; 85d411c1d6SMartin Matuska ],[]) 86d411c1d6SMartin Matuska 87f9693befSMartin Matuska ZFS_LINUX_TEST_SRC([xattr_handler_set_userns], [ 88f9693befSMartin Matuska #include <linux/xattr.h> 89f9693befSMartin Matuska 90fd45b686SMartin Matuska static int set(const struct xattr_handler *handler, 91f9693befSMartin Matuska struct user_namespace *mnt_userns, 92f9693befSMartin Matuska struct dentry *dentry, struct inode *inode, 93f9693befSMartin Matuska const char *name, const void *buffer, 94f9693befSMartin Matuska size_t size, int flags) 95f9693befSMartin Matuska { return 0; } 96f9693befSMartin Matuska static const struct xattr_handler 97f9693befSMartin Matuska xops __attribute__ ((unused)) = { 98f9693befSMartin Matuska .set = set, 99f9693befSMartin Matuska }; 100f9693befSMartin Matuska ],[]) 101f9693befSMartin Matuska 102eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([xattr_handler_set_dentry_inode], [ 103eda14cbcSMatt Macy #include <linux/xattr.h> 104eda14cbcSMatt Macy 105fd45b686SMartin Matuska static int set(const struct xattr_handler *handler, 106eda14cbcSMatt Macy struct dentry *dentry, struct inode *inode, 107eda14cbcSMatt Macy const char *name, const void *buffer, 108eda14cbcSMatt Macy size_t size, int flags) 109eda14cbcSMatt Macy { return 0; } 110eda14cbcSMatt Macy static const struct xattr_handler 111eda14cbcSMatt Macy xops __attribute__ ((unused)) = { 112eda14cbcSMatt Macy .set = set, 113eda14cbcSMatt Macy }; 114eda14cbcSMatt Macy ],[]) 115eda14cbcSMatt Macy]) 116eda14cbcSMatt Macy 117eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_SET], [ 118eda14cbcSMatt Macy dnl # 119f9693befSMartin Matuska dnl # 5.12 API change, 120f9693befSMartin Matuska dnl # The xattr_handler->set() callback was changed to 8 arguments, and 121f9693befSMartin Matuska dnl # struct user_namespace* was inserted as arg #2 122f9693befSMartin Matuska dnl # 123d411c1d6SMartin Matuska dnl # 6.3 API change, 124d411c1d6SMartin Matuska dnl # The xattr_handler->set() callback 2nd arg is now struct mnt_idmap * 125d411c1d6SMartin Matuska dnl # 126d411c1d6SMartin Matuska AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and mnt_idmap]) 127d411c1d6SMartin Matuska ZFS_LINUX_TEST_RESULT([xattr_handler_set_mnt_idmap], [ 128d411c1d6SMartin Matuska AC_MSG_RESULT(yes) 129d411c1d6SMartin Matuska AC_DEFINE(HAVE_XATTR_SET_IDMAP, 1, 130d411c1d6SMartin Matuska [xattr_handler->set() takes mnt_idmap]) 131d411c1d6SMartin Matuska ], [ 132*7a7741afSMartin Matuska AC_MSG_RESULT(no) 133f9693befSMartin Matuska AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and user_namespace]) 134f9693befSMartin Matuska ZFS_LINUX_TEST_RESULT([xattr_handler_set_userns], [ 135f9693befSMartin Matuska AC_MSG_RESULT(yes) 136f9693befSMartin Matuska AC_DEFINE(HAVE_XATTR_SET_USERNS, 1, 137f9693befSMartin Matuska [xattr_handler->set() takes user_namespace]) 138f9693befSMartin Matuska ],[ 139f9693befSMartin Matuska dnl # 140eda14cbcSMatt Macy dnl # 4.7 API change, 141eda14cbcSMatt Macy dnl # The xattr_handler->set() callback was changed to take both 142eda14cbcSMatt Macy dnl # dentry and inode. 143eda14cbcSMatt Macy dnl # 144f9693befSMartin Matuska AC_MSG_RESULT(no) 145eda14cbcSMatt Macy AC_MSG_CHECKING([whether xattr_handler->set() wants dentry and inode]) 146eda14cbcSMatt Macy ZFS_LINUX_TEST_RESULT([xattr_handler_set_dentry_inode], [ 147eda14cbcSMatt Macy AC_MSG_RESULT(yes) 148eda14cbcSMatt Macy AC_DEFINE(HAVE_XATTR_SET_DENTRY_INODE, 1, 149eda14cbcSMatt Macy [xattr_handler->set() wants both dentry and inode]) 150eda14cbcSMatt Macy ],[ 151eda14cbcSMatt Macy ZFS_LINUX_TEST_ERROR([xattr set()]) 152eda14cbcSMatt Macy ]) 153eda14cbcSMatt Macy ]) 154eda14cbcSMatt Macy ]) 155eda14cbcSMatt Macy]) 156eda14cbcSMatt Macy 157eda14cbcSMatt Macydnl # 158eda14cbcSMatt Macydnl # 4.9 API change, 159eda14cbcSMatt Macydnl # iops->{set,get,remove}xattr and generic_{set,get,remove}xattr are 160eda14cbcSMatt Macydnl # removed. xattr operations will directly go through sb->s_xattr. 161eda14cbcSMatt Macydnl # 162eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_SETXATTR], [ 163eda14cbcSMatt Macy ZFS_LINUX_TEST_SRC([have_generic_setxattr], [ 164eda14cbcSMatt Macy #include <linux/fs.h> 165eda14cbcSMatt Macy #include <linux/xattr.h> 166eda14cbcSMatt Macy 167eda14cbcSMatt Macy static const struct inode_operations 168eda14cbcSMatt Macy iops __attribute__ ((unused)) = { 169eda14cbcSMatt Macy .setxattr = generic_setxattr 170eda14cbcSMatt Macy }; 171eda14cbcSMatt Macy ],[]) 172eda14cbcSMatt Macy]) 173eda14cbcSMatt Macy 174eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR], [ 175eda14cbcSMatt Macy ZFS_AC_KERNEL_SRC_CONST_XATTR_HANDLER 176*7a7741afSMartin Matuska ZFS_AC_KERNEL_SRC_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS 177eda14cbcSMatt Macy ZFS_AC_KERNEL_SRC_XATTR_HANDLER_SET 178eda14cbcSMatt Macy]) 179eda14cbcSMatt Macy 180eda14cbcSMatt MacyAC_DEFUN([ZFS_AC_KERNEL_XATTR], [ 181eda14cbcSMatt Macy ZFS_AC_KERNEL_CONST_XATTR_HANDLER 182*7a7741afSMartin Matuska ZFS_AC_KERNEL_XATTR_HANDLER_GET_DENTRY_INODE_FLAGS 183eda14cbcSMatt Macy ZFS_AC_KERNEL_XATTR_HANDLER_SET 184eda14cbcSMatt Macy]) 185