vfs_dentry.o \
        v9fs.o \
        fid.o  \
-       xattr.o \
-       xattr_user.o \
-       xattr_trusted.o
+       xattr.o
 
 9p-$(CONFIG_9P_FSCACHE) += cache.o
 9p-$(CONFIG_9P_FS_POSIX_ACL) += acl.o
-9p-$(CONFIG_9P_FS_SECURITY) += xattr_security.o
 
        return 0;
 }
 
-static int v9fs_remote_get_acl(struct dentry *dentry, const char *name,
-                              void *buffer, size_t size, int type)
-{
-       char *full_name;
-
-       switch (type) {
-       case ACL_TYPE_ACCESS:
-               full_name =  POSIX_ACL_XATTR_ACCESS;
-               break;
-       case ACL_TYPE_DEFAULT:
-               full_name = POSIX_ACL_XATTR_DEFAULT;
-               break;
-       default:
-               BUG();
-       }
-       return v9fs_xattr_get(dentry, full_name, buffer, size);
-}
-
 static int v9fs_xattr_get_acl(const struct xattr_handler *handler,
                              struct dentry *dentry, const char *name,
                              void *buffer, size_t size)
 {
        struct v9fs_session_info *v9ses;
        struct posix_acl *acl;
-       int type = handler->flags;
        int error;
 
        if (strcmp(name, "") != 0)
         * We allow set/get/list of acl when access=client is not specified
         */
        if ((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT)
-               return v9fs_remote_get_acl(dentry, name, buffer, size, type);
+               return v9fs_xattr_get(dentry, handler->prefix, buffer, size);
 
-       acl = v9fs_get_cached_acl(d_inode(dentry), type);
+       acl = v9fs_get_cached_acl(d_inode(dentry), handler->flags);
        if (IS_ERR(acl))
                return PTR_ERR(acl);
        if (acl == NULL)
        return error;
 }
 
-static int v9fs_remote_set_acl(struct dentry *dentry, const char *name,
-                             const void *value, size_t size,
-                             int flags, int type)
-{
-       char *full_name;
-
-       switch (type) {
-       case ACL_TYPE_ACCESS:
-               full_name =  POSIX_ACL_XATTR_ACCESS;
-               break;
-       case ACL_TYPE_DEFAULT:
-               full_name = POSIX_ACL_XATTR_DEFAULT;
-               break;
-       default:
-               BUG();
-       }
-       return v9fs_xattr_set(dentry, full_name, value, size, flags);
-}
-
-
 static int v9fs_xattr_set_acl(const struct xattr_handler *handler,
                              struct dentry *dentry, const char *name,
                              const void *value, size_t size, int flags)
         * xattr value. We leave it to the server to validate
         */
        if ((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT)
-               return v9fs_remote_set_acl(dentry, name,
-                                          value, size, flags, handler->flags);
+               return v9fs_xattr_set(dentry, handler->prefix, value, size,
+                                     flags);
 
        if (S_ISLNK(inode->i_mode))
                return -EOPNOTSUPP;
 
        switch (handler->flags) {
        case ACL_TYPE_ACCESS:
-               name = POSIX_ACL_XATTR_ACCESS;
                if (acl) {
                        umode_t mode = inode->i_mode;
                        retval = posix_acl_equiv_mode(acl, &mode);
                }
                break;
        case ACL_TYPE_DEFAULT:
-               name = POSIX_ACL_XATTR_DEFAULT;
                if (!S_ISDIR(inode->i_mode)) {
                        retval = acl ? -EINVAL : 0;
                        goto err_out;
        default:
                BUG();
        }
-       retval = v9fs_xattr_set(dentry, name, value, size, flags);
+       retval = v9fs_xattr_set(dentry, handler->prefix, value, size, flags);
        if (!retval)
                set_cached_acl(inode, handler->flags, acl);
 err_out:
 
        return v9fs_xattr_get(dentry, NULL, buffer, buffer_size);
 }
 
+static int v9fs_xattr_handler_get(const struct xattr_handler *handler,
+                                 struct dentry *dentry, const char *name,
+                                 void *buffer, size_t size)
+{
+       const char *full_name = xattr_full_name(handler, name);
+
+       if (strcmp(name, "") == 0)
+               return -EINVAL;
+       return v9fs_xattr_get(dentry, full_name, buffer, size);
+}
+
+static int v9fs_xattr_handler_set(const struct xattr_handler *handler,
+                                 struct dentry *dentry, const char *name,
+                                 const void *value, size_t size, int flags)
+{
+       const char *full_name = xattr_full_name(handler, name);
+
+       if (strcmp(name, "") == 0)
+               return -EINVAL;
+       return v9fs_xattr_set(dentry, full_name, value, size, flags);
+}
+
+static struct xattr_handler v9fs_xattr_user_handler = {
+       .prefix = XATTR_USER_PREFIX,
+       .get    = v9fs_xattr_handler_get,
+       .set    = v9fs_xattr_handler_set,
+};
+
+static struct xattr_handler v9fs_xattr_trusted_handler = {
+       .prefix = XATTR_TRUSTED_PREFIX,
+       .get    = v9fs_xattr_handler_get,
+       .set    = v9fs_xattr_handler_set,
+};
+
+#ifdef CONFIG_9P_FS_SECURITY
+static struct xattr_handler v9fs_xattr_security_handler = {
+       .prefix = XATTR_SECURITY_PREFIX,
+       .get    = v9fs_xattr_handler_get,
+       .set    = v9fs_xattr_handler_set,
+};
+#endif
+
 const struct xattr_handler *v9fs_xattr_handlers[] = {
        &v9fs_xattr_user_handler,
        &v9fs_xattr_trusted_handler,
 
 #include <net/9p/client.h>
 
 extern const struct xattr_handler *v9fs_xattr_handlers[];
-extern struct xattr_handler v9fs_xattr_user_handler;
-extern struct xattr_handler v9fs_xattr_trusted_handler;
-extern struct xattr_handler v9fs_xattr_security_handler;
 extern const struct xattr_handler v9fs_xattr_acl_access_handler;
 extern const struct xattr_handler v9fs_xattr_acl_default_handler;
 
 
+++ /dev/null
-/*
- * Copyright IBM Corporation, 2010
- * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2.1 of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/slab.h>
-#include "xattr.h"
-
-static int v9fs_xattr_security_get(const struct xattr_handler *handler,
-                       struct dentry *dentry, const char *name,
-                       void *buffer, size_t size)
-{
-       int retval;
-       char *full_name;
-       size_t name_len;
-       size_t prefix_len = XATTR_SECURITY_PREFIX_LEN;
-
-       if (name == NULL)
-               return -EINVAL;
-
-       if (strcmp(name, "") == 0)
-               return -EINVAL;
-
-       name_len = strlen(name);
-       full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL);
-       if (!full_name)
-               return -ENOMEM;
-       memcpy(full_name, XATTR_SECURITY_PREFIX, prefix_len);
-       memcpy(full_name+prefix_len, name, name_len);
-       full_name[prefix_len + name_len] = '\0';
-
-       retval = v9fs_xattr_get(dentry, full_name, buffer, size);
-       kfree(full_name);
-       return retval;
-}
-
-static int v9fs_xattr_security_set(const struct xattr_handler *handler,
-                       struct dentry *dentry, const char *name,
-                       const void *value, size_t size, int flags)
-{
-       int retval;
-       char *full_name;
-       size_t name_len;
-       size_t prefix_len = XATTR_SECURITY_PREFIX_LEN;
-
-       if (name == NULL)
-               return -EINVAL;
-
-       if (strcmp(name, "") == 0)
-               return -EINVAL;
-
-       name_len = strlen(name);
-       full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL);
-       if (!full_name)
-               return -ENOMEM;
-       memcpy(full_name, XATTR_SECURITY_PREFIX, prefix_len);
-       memcpy(full_name + prefix_len, name, name_len);
-       full_name[prefix_len + name_len] = '\0';
-
-       retval = v9fs_xattr_set(dentry, full_name, value, size, flags);
-       kfree(full_name);
-       return retval;
-}
-
-struct xattr_handler v9fs_xattr_security_handler = {
-       .prefix = XATTR_SECURITY_PREFIX,
-       .get    = v9fs_xattr_security_get,
-       .set    = v9fs_xattr_security_set,
-};
 
+++ /dev/null
-/*
- * Copyright IBM Corporation, 2010
- * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2.1 of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/slab.h>
-#include "xattr.h"
-
-static int v9fs_xattr_trusted_get(const struct xattr_handler *handler,
-                       struct dentry *dentry, const char *name,
-                       void *buffer, size_t size)
-{
-       int retval;
-       char *full_name;
-       size_t name_len;
-       size_t prefix_len = XATTR_TRUSTED_PREFIX_LEN;
-
-       if (name == NULL)
-               return -EINVAL;
-
-       if (strcmp(name, "") == 0)
-               return -EINVAL;
-
-       name_len = strlen(name);
-       full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL);
-       if (!full_name)
-               return -ENOMEM;
-       memcpy(full_name, XATTR_TRUSTED_PREFIX, prefix_len);
-       memcpy(full_name+prefix_len, name, name_len);
-       full_name[prefix_len + name_len] = '\0';
-
-       retval = v9fs_xattr_get(dentry, full_name, buffer, size);
-       kfree(full_name);
-       return retval;
-}
-
-static int v9fs_xattr_trusted_set(const struct xattr_handler *handler,
-                       struct dentry *dentry, const char *name,
-                       const void *value, size_t size, int flags)
-{
-       int retval;
-       char *full_name;
-       size_t name_len;
-       size_t prefix_len = XATTR_TRUSTED_PREFIX_LEN;
-
-       if (name == NULL)
-               return -EINVAL;
-
-       if (strcmp(name, "") == 0)
-               return -EINVAL;
-
-       name_len = strlen(name);
-       full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL);
-       if (!full_name)
-               return -ENOMEM;
-       memcpy(full_name, XATTR_TRUSTED_PREFIX, prefix_len);
-       memcpy(full_name + prefix_len, name, name_len);
-       full_name[prefix_len + name_len] = '\0';
-
-       retval = v9fs_xattr_set(dentry, full_name, value, size, flags);
-       kfree(full_name);
-       return retval;
-}
-
-struct xattr_handler v9fs_xattr_trusted_handler = {
-       .prefix = XATTR_TRUSTED_PREFIX,
-       .get    = v9fs_xattr_trusted_get,
-       .set    = v9fs_xattr_trusted_set,
-};
 
+++ /dev/null
-/*
- * Copyright IBM Corporation, 2010
- * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2.1 of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/slab.h>
-#include "xattr.h"
-
-static int v9fs_xattr_user_get(const struct xattr_handler *handler,
-                       struct dentry *dentry, const char *name,
-                       void *buffer, size_t size)
-{
-       int retval;
-       char *full_name;
-       size_t name_len;
-       size_t prefix_len = XATTR_USER_PREFIX_LEN;
-
-       if (name == NULL)
-               return -EINVAL;
-
-       if (strcmp(name, "") == 0)
-               return -EINVAL;
-
-       name_len = strlen(name);
-       full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL);
-       if (!full_name)
-               return -ENOMEM;
-       memcpy(full_name, XATTR_USER_PREFIX, prefix_len);
-       memcpy(full_name+prefix_len, name, name_len);
-       full_name[prefix_len + name_len] = '\0';
-
-       retval = v9fs_xattr_get(dentry, full_name, buffer, size);
-       kfree(full_name);
-       return retval;
-}
-
-static int v9fs_xattr_user_set(const struct xattr_handler *handler,
-                       struct dentry *dentry, const char *name,
-                       const void *value, size_t size, int flags)
-{
-       int retval;
-       char *full_name;
-       size_t name_len;
-       size_t prefix_len = XATTR_USER_PREFIX_LEN;
-
-       if (name == NULL)
-               return -EINVAL;
-
-       if (strcmp(name, "") == 0)
-               return -EINVAL;
-
-       name_len = strlen(name);
-       full_name = kmalloc(prefix_len + name_len + 1 , GFP_KERNEL);
-       if (!full_name)
-               return -ENOMEM;
-       memcpy(full_name, XATTR_USER_PREFIX, prefix_len);
-       memcpy(full_name + prefix_len, name, name_len);
-       full_name[prefix_len + name_len] = '\0';
-
-       retval = v9fs_xattr_set(dentry, full_name, value, size, flags);
-       kfree(full_name);
-       return retval;
-}
-
-struct xattr_handler v9fs_xattr_user_handler = {
-       .prefix = XATTR_USER_PREFIX,
-       .get    = v9fs_xattr_user_get,
-       .set    = v9fs_xattr_user_set,
-};
 
 EXPORT_SYMBOL(generic_setxattr);
 EXPORT_SYMBOL(generic_removexattr);
 
+/**
+ * xattr_full_name  -  Compute full attribute name from suffix
+ *
+ * @handler:   handler of the xattr_handler operation
+ * @name:      name passed to the xattr_handler operation
+ *
+ * The get and set xattr handler operations are called with the remainder of
+ * the attribute name after skipping the handler's prefix: for example, "foo"
+ * is passed to the get operation of a handler with prefix "user." to get
+ * attribute "user.foo".  The full name is still "there" in the name though.
+ *
+ * Note: the list xattr handler operation when called from the vfs is passed a
+ * NULL name; some file systems use this operation internally, with varying
+ * semantics.
+ */
+const char *xattr_full_name(const struct xattr_handler *handler,
+                           const char *name)
+{
+       size_t prefix_len = strlen(handler->prefix);
+
+       return name - prefix_len;
+}
+EXPORT_SYMBOL(xattr_full_name);
+
 /*
  * Allocate new xattr and copy in the value; but leave the name to callers.
  */
 
 
 struct xattr_handler {
        const char *prefix;
-       int flags;      /* fs private flags passed back to the handlers */
-       size_t (*list)(struct dentry *dentry, char *list, size_t list_size,
-                      const char *name, size_t name_len, int handler_flags);
-       int (*get)(struct dentry *dentry, const char *name, void *buffer,
-                  size_t size, int handler_flags);
-       int (*set)(struct dentry *dentry, const char *name, const void *buffer,
-                  size_t size, int flags, int handler_flags);
+       int flags;      /* fs private flags */
+       size_t (*list)(const struct xattr_handler *, struct dentry *dentry,
+                      char *list, size_t list_size, const char *name,
+                      size_t name_len);
+       int (*get)(const struct xattr_handler *, struct dentry *dentry,
+                  const char *name, void *buffer, size_t size);
+       int (*set)(const struct xattr_handler *, struct dentry *dentry,
+                  const char *name, const void *buffer, size_t size,
+                  int flags);
 };
 
+const char *xattr_full_name(const struct xattr_handler *, const char *);
+
 struct xattr {
        const char *name;
        void *value;