Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
[cascardo/linux.git] / fs / fuse / xattr.c
index e22980f..3caac46 100644 (file)
@@ -9,9 +9,10 @@
 #include "fuse_i.h"
 
 #include <linux/xattr.h>
+#include <linux/posix_acl_xattr.h>
 
-static int fuse_setxattr(struct inode *inode, const char *name,
-                        const void *value, size_t size, int flags)
+int fuse_setxattr(struct inode *inode, const char *name, const void *value,
+                 size_t size, int flags)
 {
        struct fuse_conn *fc = get_fuse_conn(inode);
        FUSE_ARGS(args);
@@ -45,8 +46,8 @@ static int fuse_setxattr(struct inode *inode, const char *name,
        return err;
 }
 
-static ssize_t fuse_getxattr(struct inode *inode, const char *name,
-                            void *value, size_t size)
+ssize_t fuse_getxattr(struct inode *inode, const char *name, void *value,
+                     size_t size)
 {
        struct fuse_conn *fc = get_fuse_conn(inode);
        FUSE_ARGS(args);
@@ -78,7 +79,7 @@ static ssize_t fuse_getxattr(struct inode *inode, const char *name,
        }
        ret = fuse_simple_request(fc, &args);
        if (!ret && !size)
-               ret = outarg.size;
+               ret = min_t(ssize_t, outarg.size, XATTR_SIZE_MAX);
        if (ret == -ENOSYS) {
                fc->no_getxattr = 1;
                ret = -EOPNOTSUPP;
@@ -137,7 +138,7 @@ ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
        }
        ret = fuse_simple_request(fc, &args);
        if (!ret && !size)
-               ret = outarg.size;
+               ret = min_t(ssize_t, outarg.size, XATTR_LIST_MAX);
        if (ret > 0 && size)
                ret = fuse_verify_xattr_list(list, ret);
        if (ret == -ENOSYS) {
@@ -147,7 +148,7 @@ ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
        return ret;
 }
 
-static int fuse_removexattr(struct inode *inode, const char *name)
+int fuse_removexattr(struct inode *inode, const char *name)
 {
        struct fuse_conn *fc = get_fuse_conn(inode);
        FUSE_ARGS(args);
@@ -201,3 +202,10 @@ const struct xattr_handler *fuse_xattr_handlers[] = {
        &fuse_xattr_handler,
        NULL
 };
+
+const struct xattr_handler *fuse_acl_xattr_handlers[] = {
+       &posix_acl_access_xattr_handler,
+       &posix_acl_default_xattr_handler,
+       &fuse_xattr_handler,
+       NULL
+};