]> granicus.if.org Git - zfs/commitdiff
Linux 2.6.33 compat, get/set xattr callbacks
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 11 Feb 2011 18:33:01 +0000 (10:33 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 11 Feb 2011 18:41:00 +0000 (10:41 -0800)
The xattr handler prototypes were sanitized with the idea being that
the same handlers could be used for multiple methods.  The result of
this was the inode type was changes to a dentry, and both the get()
and set() hooks had a handler_flags argument added.  The list()
callback was similiarly effected but no autoconf check was added
because we do not use the list() callback.

config/kernel-xattr-handler.m4
config/kernel.m4
configure
include/linux/xattr_compat.h
module/zfs/zpl_xattr.c
zfs_config.h.in

index fa7294597e5f3dbe526dde2c25fc90b3245dd111..1ebe1f0d966270c6164eee83ce66594c18327f9b 100644 (file)
@@ -30,3 +30,52 @@ AC_DEFUN([ZFS_AC_KERNEL_CONST_XATTR_HANDLER],
                AC_MSG_RESULT([no])
        ])
 ])
+
+dnl #
+dnl # 2.6.33 API change,
+dnl # The xattr_hander->get() callback was changed to take a dentry
+dnl # instead of an inode, and a handler_flags argument was added.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_GET], [
+       AC_MSG_CHECKING([whether xattr_handler->get() wants dentry])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/xattr.h>
+       ],[
+               int (*get)(struct dentry *dentry, const char *name,
+                   void *buffer, size_t size, int handler_flags) = NULL;
+               struct xattr_handler xops;
+
+               xops.get = get;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_DENTRY_XATTR_GET, 1,
+                   [xattr_handler->get() wants dentry])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
+dnl #
+dnl # 2.6.33 API change,
+dnl # The xattr_hander->set() callback was changed to take a dentry
+dnl # instead of an inode, and a handler_flags argument was added.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_SET], [
+       AC_MSG_CHECKING([whether xattr_handler->set() wants dentry])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/xattr.h>
+       ],[
+               int (*set)(struct dentry *dentry, const char *name,
+                   const void *buffer, size_t size, int flags,
+                   int handler_flags) = NULL;
+               struct xattr_handler xops;
+
+               xops.set = set;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_DENTRY_XATTR_SET, 1,
+                   [xattr_handler->set() wants dentry])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index c411c8f492831a153f7b68a002cc573cdcea4cb0..1f271d178d9dc5d0cef5e8262de08666f56998da 100644 (file)
@@ -29,6 +29,8 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_RQ_IS_SYNC
        ZFS_AC_KERNEL_RQ_FOR_EACH_SEGMENT
        ZFS_AC_KERNEL_CONST_XATTR_HANDLER
+       ZFS_AC_KERNEL_XATTR_HANDLER_GET
+       ZFS_AC_KERNEL_XATTR_HANDLER_SET
        ZFS_AC_KERNEL_FSYNC_2ARGS
 
        if test "$LINUX_OBJ" != "$LINUX"; then
index fa721d43f495250a1e5af8483e06c49870dfa3c4..55cf1576f5e1f822d5d3c90f4174691b04a5ef39 100755 (executable)
--- a/configure
+++ b/configure
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether xattr_handler->get() wants dentry" >&5
+$as_echo_n "checking whether xattr_handler->get() wants dentry... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/xattr.h>
+
+int
+main (void)
+{
+
+               int (*get)(struct dentry *dentry, const char *name,
+                   void *buffer, size_t size, int handler_flags) = NULL;
+               struct xattr_handler xops;
+
+               xops.get = get;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DENTRY_XATTR_GET 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
+       { $as_echo "$as_me:$LINENO: checking whether xattr_handler->set() wants dentry" >&5
+$as_echo_n "checking whether xattr_handler->set() wants dentry... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/xattr.h>
+
+int
+main (void)
+{
+
+               int (*set)(struct dentry *dentry, const char *name,
+                   const void *buffer, size_t size, int flags,
+                   int handler_flags) = NULL;
+               struct xattr_handler xops;
+
+               xops.set = set;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DENTRY_XATTR_SET 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
        { $as_echo "$as_me:$LINENO: checking whether fops->fsync() wants 2 args" >&5
 $as_echo_n "checking whether fops->fsync() wants 2 args... " >&6; }
 
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether xattr_handler->get() wants dentry" >&5
+$as_echo_n "checking whether xattr_handler->get() wants dentry... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/xattr.h>
+
+int
+main (void)
+{
+
+               int (*get)(struct dentry *dentry, const char *name,
+                   void *buffer, size_t size, int handler_flags) = NULL;
+               struct xattr_handler xops;
+
+               xops.get = get;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DENTRY_XATTR_GET 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
+       { $as_echo "$as_me:$LINENO: checking whether xattr_handler->set() wants dentry" >&5
+$as_echo_n "checking whether xattr_handler->set() wants dentry... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/xattr.h>
+
+int
+main (void)
+{
+
+               int (*set)(struct dentry *dentry, const char *name,
+                   const void *buffer, size_t size, int flags,
+                   int handler_flags) = NULL;
+               struct xattr_handler xops;
+
+               xops.set = set;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DENTRY_XATTR_SET 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
        { $as_echo "$as_me:$LINENO: checking whether fops->fsync() wants 2 args" >&5
 $as_echo_n "checking whether fops->fsync() wants 2 args... " >&6; }
 
index dfa92acab7073808962f6589f88404f4f657dc65..9878aab72536061ed84760bd9a05be6835253d49 100644 (file)
@@ -39,4 +39,49 @@ typedef const struct xattr_handler   xattr_handler_t;
 typedef struct xattr_handler           xattr_handler_t;
 #endif
 
+/*
+ * 2.6.33 API change,
+ * The xattr_hander->get() callback was changed to take a dentry
+ * instead of an inode, and a handler_flags argument was added.
+ */
+#ifdef HAVE_DENTRY_XATTR_GET
+#define ZPL_XATTR_GET_WRAPPER(fn)                                      \
+static int                                                             \
+fn(struct dentry *dentry, const char *name, void *buffer, size_t size, \
+    int unused_handler_flags)                                          \
+{                                                                      \
+       return __ ## fn(dentry->d_inode, name, buffer, size);           \
+}
+#else
+#define ZPL_XATTR_GET_WRAPPER(fn)                                      \
+static int                                                             \
+fn(struct inode *ip, const char *name, void *buffer, size_t size)      \
+{                                                                      \
+       return __ ## fn(ip, name, buffer, size);                        \
+}
+#endif /* HAVE_DENTRY_XATTR_GET */
+
+/*
+ * 2.6.33 API change,
+ * The xattr_hander->set() callback was changed to take a dentry
+ * instead of an inode, and a handler_flags argument was added.
+ */
+#ifdef HAVE_DENTRY_XATTR_SET
+#define ZPL_XATTR_SET_WRAPPER(fn)                                      \
+static int                                                             \
+fn(struct dentry *dentry, const char *name, const void *buffer,                \
+    size_t size, int flags, int unused_handler_flags)                  \
+{                                                                      \
+       return __ ## fn(dentry->d_inode, name, buffer, size, flags);    \
+}
+#else
+#define ZPL_XATTR_SET_WRAPPER(fn)                                      \
+static int                                                             \
+fn(struct inode *ip, const char *name, const void *buffer,             \
+    size_t size, int flags)                                            \
+{                                                                      \
+       return __ ## fn(ip, name, buffer, size, flags);                 \
+}
+#endif /* HAVE_DENTRY_XATTR_SET */
+
 #endif /* _ZFS_XATTR_H */
index 86e52f791ec762ef4a5049c43f58a3de545e8cfc..7a1ecec8f14bb442cad2f2c7c1a9e3d307bc7aef 100644 (file)
@@ -266,7 +266,7 @@ out:
 }
 
 static int
-zpl_xattr_user_get(struct inode *ip, const char *name,
+__zpl_xattr_user_get(struct inode *ip, const char *name,
     void *buffer, size_t size)
 {
        char *xattr_name;
@@ -284,9 +284,10 @@ zpl_xattr_user_get(struct inode *ip, const char *name,
 
        return (error);
 }
+ZPL_XATTR_GET_WRAPPER(zpl_xattr_user_get);
 
 static int
-zpl_xattr_user_set(struct inode *ip, const char *name,
+__zpl_xattr_user_set(struct inode *ip, const char *name,
     const void *value, size_t size, int flags)
 {
        char *xattr_name;
@@ -304,6 +305,7 @@ zpl_xattr_user_set(struct inode *ip, const char *name,
 
        return (error);
 }
+ZPL_XATTR_SET_WRAPPER(zpl_xattr_user_set);
 
 xattr_handler_t zpl_xattr_user_handler = {
        .prefix = XATTR_USER_PREFIX,
@@ -312,7 +314,7 @@ xattr_handler_t zpl_xattr_user_handler = {
 };
 
 static int
-zpl_xattr_trusted_get(struct inode *ip, const char *name,
+__zpl_xattr_trusted_get(struct inode *ip, const char *name,
     void *buffer, size_t size)
 {
        char *xattr_name;
@@ -330,9 +332,10 @@ zpl_xattr_trusted_get(struct inode *ip, const char *name,
 
        return (error);
 }
+ZPL_XATTR_GET_WRAPPER(zpl_xattr_trusted_get);
 
 static int
-zpl_xattr_trusted_set(struct inode *ip, const char *name,
+__zpl_xattr_trusted_set(struct inode *ip, const char *name,
     const void *value, size_t size, int flags)
 {
        char *xattr_name;
@@ -350,6 +353,7 @@ zpl_xattr_trusted_set(struct inode *ip, const char *name,
 
        return (error);
 }
+ZPL_XATTR_SET_WRAPPER(zpl_xattr_trusted_set);
 
 xattr_handler_t zpl_xattr_trusted_handler = {
        .prefix = XATTR_TRUSTED_PREFIX,
@@ -358,7 +362,7 @@ xattr_handler_t zpl_xattr_trusted_handler = {
 };
 
 static int
-zpl_xattr_security_get(struct inode *ip, const char *name,
+__zpl_xattr_security_get(struct inode *ip, const char *name,
     void *buffer, size_t size)
 {
        char *xattr_name;
@@ -373,9 +377,10 @@ zpl_xattr_security_get(struct inode *ip, const char *name,
 
        return (error);
 }
+ZPL_XATTR_GET_WRAPPER(zpl_xattr_security_get);
 
 static int
-zpl_xattr_security_set(struct inode *ip, const char *name,
+__zpl_xattr_security_set(struct inode *ip, const char *name,
     const void *value, size_t size, int flags)
 {
        char *xattr_name;
@@ -390,6 +395,7 @@ zpl_xattr_security_set(struct inode *ip, const char *name,
 
        return (error);
 }
+ZPL_XATTR_SET_WRAPPER(zpl_xattr_security_set);
 
 int
 zpl_xattr_security_init(struct inode *ip, struct inode *dip)
@@ -407,7 +413,7 @@ zpl_xattr_security_init(struct inode *ip, struct inode *dip)
                 return (error);
         }
 
-       error = zpl_xattr_security_set(ip, name, value, len, 0);
+       error = __zpl_xattr_security_set(ip, name, value, len, 0);
 
         kfree(name);
         kfree(value);
index fd7bd668cd0bfed5d943292b653358d7e44a308d..d6999bbda7b5e3b11839f2e13fd484103476ac69 100644 (file)
 /* super_block uses const struct xattr_hander */
 #undef HAVE_CONST_XATTR_HANDLER
 
+/* xattr_handler->get() wants dentry */
+#undef HAVE_DENTRY_XATTR_GET
+
+/* xattr_handler->set() wants dentry */
+#undef HAVE_DENTRY_XATTR_SET
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H