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 Brian Behlendorf
parent 278f223668
commit fd4c7b7a73
2 changed files with 64 additions and 28 deletions

View File

@ -62,18 +62,17 @@ 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 #
dnl # 4.4 API change, dnl # 4.7 API change,
dnl # The xattr_handler->get() callback was changed to take a dnl # The xattr_handler->get() callback was changed to take both
dnl # attr_handler, and handler_flags argument was removed and dnl # dentry and inode.
dnl # should be accessed by handler->flags.
dnl # dnl #
AC_MSG_CHECKING([whether xattr_handler->get() wants xattr_handler]) AC_MSG_CHECKING([whether xattr_handler->get() wants both dentry and inode])
ZFS_LINUX_TRY_COMPILE([ ZFS_LINUX_TRY_COMPILE([
#include <linux/xattr.h> #include <linux/xattr.h>
int get(const struct xattr_handler *handler, int get(const struct xattr_handler *handler,
struct dentry *dentry, const char *name, struct dentry *dentry, struct inode *inode,
void *buffer, size_t size) { return 0; } const char *name, void *buffer, size_t size) { return 0; }
static const struct xattr_handler static const struct xattr_handler
xops __attribute__ ((unused)) = { xops __attribute__ ((unused)) = {
.get = get, .get = get,
@ -81,23 +80,22 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
],[ ],[
],[ ],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_XATTR_GET_HANDLER, 1, AC_DEFINE(HAVE_XATTR_GET_DENTRY_INODE, 1,
[xattr_handler->get() wants xattr_handler]) [xattr_handler->get() wants xattr_handler])
],[ ],[
dnl # dnl #
dnl # 2.6.33 API change, dnl # 4.4 API change,
dnl # The xattr_handler->get() callback was changed to take dnl # The xattr_handler->get() callback was changed to take a
dnl # a dentry instead of an inode, and a handler_flags dnl # attr_handler, and handler_flags argument was removed and
dnl # argument was added. dnl # should be accessed by handler->flags.
dnl # dnl #
AC_MSG_RESULT(no) AC_MSG_CHECKING([whether xattr_handler->get() wants xattr_handler])
AC_MSG_CHECKING([whether xattr_handler->get() wants dentry])
ZFS_LINUX_TRY_COMPILE([ ZFS_LINUX_TRY_COMPILE([
#include <linux/xattr.h> #include <linux/xattr.h>
int get(struct dentry *dentry, const char *name, int get(const struct xattr_handler *handler,
void *buffer, size_t size, int handler_flags) struct dentry *dentry, const char *name,
{ return 0; } void *buffer, size_t size) { return 0; }
static const struct xattr_handler static const struct xattr_handler
xops __attribute__ ((unused)) = { xops __attribute__ ((unused)) = {
.get = get, .get = get,
@ -105,20 +103,23 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
],[ ],[
],[ ],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_XATTR_GET_DENTRY, 1, AC_DEFINE(HAVE_XATTR_GET_HANDLER, 1,
[xattr_handler->get() wants dentry]) [xattr_handler->get() wants xattr_handler])
],[ ],[
dnl # dnl #
dnl # 2.6.32 API dnl # 2.6.33 API change,
dnl # The xattr_handler->get() callback was changed to take
dnl # a dentry instead of an inode, and a handler_flags
dnl # argument was added.
dnl # dnl #
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING( AC_MSG_CHECKING([whether xattr_handler->get() wants dentry])
[whether xattr_handler->get() wants inode])
ZFS_LINUX_TRY_COMPILE([ ZFS_LINUX_TRY_COMPILE([
#include <linux/xattr.h> #include <linux/xattr.h>
int get(struct inode *ip, const char *name, int get(struct dentry *dentry, const char *name,
void *buffer, size_t size) { return 0; } void *buffer, size_t size, int handler_flags)
{ return 0; }
static const struct xattr_handler static const struct xattr_handler
xops __attribute__ ((unused)) = { xops __attribute__ ((unused)) = {
.get = get, .get = get,
@ -126,10 +127,32 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
],[ ],[
],[ ],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_XATTR_GET_INODE, 1, AC_DEFINE(HAVE_XATTR_GET_DENTRY, 1,
[xattr_handler->get() wants inode]) [xattr_handler->get() wants dentry])
],[ ],[
AC_MSG_ERROR([no; please file a bug report]) dnl #
dnl # 2.6.32 API
dnl #
AC_MSG_RESULT(no)
AC_MSG_CHECKING(
[whether xattr_handler->get() wants inode])
ZFS_LINUX_TRY_COMPILE([
#include <linux/xattr.h>
int get(struct inode *ip, 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_INODE, 1,
[xattr_handler->get() wants inode])
],[
AC_MSG_ERROR([no; please file a bug report])
])
]) ])
]) ])
]) ])

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, \