Linux 4.7 compat: handler->get() takes both dentry and inode

Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #4665
This commit is contained in:
Chunwei Chen 2016-05-18 13:44:13 -07:00 committed by Ned Bass
parent 703c9f5893
commit 55b8857346
2 changed files with 64 additions and 28 deletions

View File

@ -61,6 +61,28 @@ dnl #
dnl # Supported xattr handler get() interfaces checked newest to oldest. dnl # Supported xattr handler get() interfaces checked newest to oldest.
dnl # dnl #
AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
dnl #
dnl # 4.7 API change,
dnl # The xattr_handler->get() callback was changed to take both
dnl # dentry and inode.
dnl #
AC_MSG_CHECKING([whether xattr_handler->get() wants both dentry and inode])
ZFS_LINUX_TRY_COMPILE([
#include <linux/xattr.h>
int get(const struct xattr_handler *handler,
struct dentry *dentry, struct inode *inode,
const char *name, void *buffer, size_t size) { return 0; }
static const struct xattr_handler
xops __attribute__ ((unused)) = {
.get = get,
};
],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_XATTR_GET_DENTRY_INODE, 1,
[xattr_handler->get() wants xattr_handler])
],[
dnl # dnl #
dnl # 4.4 API change, dnl # 4.4 API change,
dnl # The xattr_handler->get() callback was changed to take a dnl # The xattr_handler->get() callback was changed to take a
@ -133,6 +155,7 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
]) ])
]) ])
]) ])
])
]) ])
dnl # dnl #

View File

@ -101,13 +101,26 @@ fn(struct inode *ip, char *list, size_t list_size, \
} }
#endif #endif
/*
* 4.7 API change,
* The xattr_handler->get() callback was changed to take a both dentry and
* inode, because the dentry might not be attached to an inode yet.
*/
#if defined(HAVE_XATTR_GET_DENTRY_INODE)
#define ZPL_XATTR_GET_WRAPPER(fn) \
static int \
fn(const struct xattr_handler *handler, struct dentry *dentry, \
struct inode *inode, const char *name, void *buffer, size_t size) \
{ \
return (__ ## fn(inode, name, buffer, size)); \
}
/* /*
* 4.4 API change, * 4.4 API change,
* The xattr_handler->get() callback was changed to take a xattr_handler, * The xattr_handler->get() callback was changed to take a xattr_handler,
* and handler_flags argument was removed and should be accessed by * and handler_flags argument was removed and should be accessed by
* handler->flags. * handler->flags.
*/ */
#if defined(HAVE_XATTR_GET_HANDLER) #elif defined(HAVE_XATTR_GET_HANDLER)
#define ZPL_XATTR_GET_WRAPPER(fn) \ #define ZPL_XATTR_GET_WRAPPER(fn) \
static int \ static int \
fn(const struct xattr_handler *handler, struct dentry *dentry, \ fn(const struct xattr_handler *handler, struct dentry *dentry, \