]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 4.7 compat: handler->get() takes both dentry and inode
authorChunwei Chen <david.chen@osnexus.com>
Wed, 18 May 2016 20:44:13 +0000 (13:44 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 20 May 2016 18:08:21 +0000 (11:08 -0700)
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #4665

config/kernel-xattr-handler.m4
include/linux/xattr_compat.h

index f6142871d16b345c2b1584c0d9f3cf53d6cb46f4..638557e32e4030a2b1cf26b027ecef634912877d 100644 (file)
@@ -62,18 +62,17 @@ dnl # Supported xattr handler get() interfaces checked newest to oldest.
 dnl #
 AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
        dnl #
-       dnl # 4.4 API change,
-       dnl # The xattr_handler->get() callback was changed to take a
-       dnl # attr_handler, and handler_flags argument was removed and
-       dnl # should be accessed by handler->flags.
+       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 xattr_handler])
+       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, const char *name,
-                   void *buffer, size_t size) { return 0; }
+                   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,
@@ -81,23 +80,22 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
        ],[
        ],[
                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])
        ],[
                dnl #
-               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 # 4.4 API change,
+               dnl # The xattr_handler->get() callback was changed to take a
+               dnl # attr_handler, and handler_flags argument was removed and
+               dnl # should be accessed by handler->flags.
                dnl #
-               AC_MSG_RESULT(no)
-               AC_MSG_CHECKING([whether xattr_handler->get() wants dentry])
+               AC_MSG_CHECKING([whether xattr_handler->get() wants xattr_handler])
                ZFS_LINUX_TRY_COMPILE([
                        #include <linux/xattr.h>
 
-                       int get(struct dentry *dentry, const char *name,
-                           void *buffer, size_t size, int handler_flags)
-                           { return 0; }
+                       int get(const struct xattr_handler *handler,
+                           struct dentry *dentry, const char *name,
+                           void *buffer, size_t size) { return 0; }
                        static const struct xattr_handler
                            xops __attribute__ ((unused)) = {
                                .get = get,
@@ -105,20 +103,23 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
                ],[
                ],[
                        AC_MSG_RESULT(yes)
-                       AC_DEFINE(HAVE_XATTR_GET_DENTRY, 1,
-                           [xattr_handler->get() wants dentry])
+                       AC_DEFINE(HAVE_XATTR_GET_HANDLER, 1,
+                           [xattr_handler->get() wants xattr_handler])
                ],[
                        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 #
                        AC_MSG_RESULT(no)
-                       AC_MSG_CHECKING(
-                           [whether xattr_handler->get() wants inode])
+                       AC_MSG_CHECKING([whether xattr_handler->get() wants dentry])
                        ZFS_LINUX_TRY_COMPILE([
                                #include <linux/xattr.h>
 
-                               int get(struct inode *ip, const char *name,
-                                   void *buffer, size_t size) { return 0; }
+                               int get(struct dentry *dentry, const char *name,
+                                   void *buffer, size_t size, int handler_flags)
+                                   { return 0; }
                                static const struct xattr_handler
                                    xops __attribute__ ((unused)) = {
                                        .get = get,
@@ -126,10 +127,32 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
                        ],[
                        ],[
                                AC_MSG_RESULT(yes)
-                               AC_DEFINE(HAVE_XATTR_GET_INODE, 1,
-                                   [xattr_handler->get() wants inode])
+                               AC_DEFINE(HAVE_XATTR_GET_DENTRY, 1,
+                                   [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])
+                               ])
                        ])
                ])
        ])
index 5e19ea1e5cc95384f707bbf468ec8e544bcb3a66..451b6545eb1f3e911c7dc16543fb28a436c42a7f 100644 (file)
@@ -101,13 +101,26 @@ fn(struct inode *ip, char *list, size_t list_size,                        \
 }
 #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,
  * The xattr_handler->get() callback was changed to take a xattr_handler,
  * and handler_flags argument was removed and should be accessed by
  * handler->flags.
  */
-#if defined(HAVE_XATTR_GET_HANDLER)
+#elif defined(HAVE_XATTR_GET_HANDLER)
 #define        ZPL_XATTR_GET_WRAPPER(fn)                                       \
 static int                                                             \
 fn(const struct xattr_handler *handler, struct dentry *dentry,         \