These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / fs / f2fs / xattr.c
index 9757f65..862368a 100644 (file)
 #include "f2fs.h"
 #include "xattr.h"
 
-static size_t f2fs_xattr_generic_list(struct dentry *dentry, char *list,
-               size_t list_size, const char *name, size_t len, int type)
+static size_t f2fs_xattr_generic_list(const struct xattr_handler *handler,
+               struct dentry *dentry, char *list, size_t list_size,
+               const char *name, size_t len)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
-       int total_len, prefix_len = 0;
-       const char *prefix = NULL;
+       int total_len, prefix_len;
 
-       switch (type) {
+       switch (handler->flags) {
        case F2FS_XATTR_INDEX_USER:
                if (!test_opt(sbi, XATTR_USER))
                        return -EOPNOTSUPP;
-               prefix = XATTR_USER_PREFIX;
-               prefix_len = XATTR_USER_PREFIX_LEN;
                break;
        case F2FS_XATTR_INDEX_TRUSTED:
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
-               prefix = XATTR_TRUSTED_PREFIX;
-               prefix_len = XATTR_TRUSTED_PREFIX_LEN;
                break;
        case F2FS_XATTR_INDEX_SECURITY:
-               prefix = XATTR_SECURITY_PREFIX;
-               prefix_len = XATTR_SECURITY_PREFIX_LEN;
                break;
        default:
                return -EINVAL;
        }
 
+       prefix_len = strlen(handler->prefix);
        total_len = prefix_len + len + 1;
        if (list && total_len <= list_size) {
-               memcpy(list, prefix, prefix_len);
+               memcpy(list, handler->prefix, prefix_len);
                memcpy(list + prefix_len, name, len);
                list[prefix_len + len] = '\0';
        }
        return total_len;
 }
 
-static int f2fs_xattr_generic_get(struct dentry *dentry, const char *name,
-               void *buffer, size_t size, int type)
+static int f2fs_xattr_generic_get(const struct xattr_handler *handler,
+               struct dentry *dentry, const char *name, void *buffer,
+               size_t size)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
 
-       switch (type) {
+       switch (handler->flags) {
        case F2FS_XATTR_INDEX_USER:
                if (!test_opt(sbi, XATTR_USER))
                        return -EOPNOTSUPP;
@@ -83,15 +79,17 @@ static int f2fs_xattr_generic_get(struct dentry *dentry, const char *name,
        }
        if (strcmp(name, "") == 0)
                return -EINVAL;
-       return f2fs_getxattr(d_inode(dentry), type, name, buffer, size, NULL);
+       return f2fs_getxattr(d_inode(dentry), handler->flags, name,
+                            buffer, size, NULL);
 }
 
-static int f2fs_xattr_generic_set(struct dentry *dentry, const char *name,
-               const void *value, size_t size, int flags, int type)
+static int f2fs_xattr_generic_set(const struct xattr_handler *handler,
+               struct dentry *dentry, const char *name, const void *value,
+               size_t size, int flags)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
 
-       switch (type) {
+       switch (handler->flags) {
        case F2FS_XATTR_INDEX_USER:
                if (!test_opt(sbi, XATTR_USER))
                        return -EOPNOTSUPP;
@@ -108,27 +106,26 @@ static int f2fs_xattr_generic_set(struct dentry *dentry, const char *name,
        if (strcmp(name, "") == 0)
                return -EINVAL;
 
-       return f2fs_setxattr(d_inode(dentry), type, name,
+       return f2fs_setxattr(d_inode(dentry), handler->flags, name,
                                        value, size, NULL, flags);
 }
 
-static size_t f2fs_xattr_advise_list(struct dentry *dentry, char *list,
-               size_t list_size, const char *name, size_t len, int type)
+static size_t f2fs_xattr_advise_list(const struct xattr_handler *handler,
+               struct dentry *dentry, char *list, size_t list_size,
+               const char *name, size_t len)
 {
        const char *xname = F2FS_SYSTEM_ADVISE_PREFIX;
        size_t size;
 
-       if (type != F2FS_XATTR_INDEX_ADVISE)
-               return 0;
-
        size = strlen(xname) + 1;
        if (list && size <= list_size)
                memcpy(list, xname, size);
        return size;
 }
 
-static int f2fs_xattr_advise_get(struct dentry *dentry, const char *name,
-               void *buffer, size_t size, int type)
+static int f2fs_xattr_advise_get(const struct xattr_handler *handler,
+               struct dentry *dentry, const char *name, void *buffer,
+               size_t size)
 {
        struct inode *inode = d_inode(dentry);
 
@@ -140,8 +137,9 @@ static int f2fs_xattr_advise_get(struct dentry *dentry, const char *name,
        return sizeof(char);
 }
 
-static int f2fs_xattr_advise_set(struct dentry *dentry, const char *name,
-               const void *value, size_t size, int flags, int type)
+static int f2fs_xattr_advise_set(const struct xattr_handler *handler,
+               struct dentry *dentry, const char *name, const void *value,
+               size_t size, int flags)
 {
        struct inode *inode = d_inode(dentry);
 
@@ -462,8 +460,8 @@ ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
                if (!handler)
                        continue;
 
-               size = handler->list(dentry, buffer, rest, entry->e_name,
-                               entry->e_name_len, handler->flags);
+               size = handler->list(handler, dentry, buffer, rest,
+                                    entry->e_name, entry->e_name_len);
                if (buffer && size > rest) {
                        error = -ERANGE;
                        goto cleanup;
@@ -499,9 +497,12 @@ static int __f2fs_setxattr(struct inode *inode, int index,
 
        len = strlen(name);
 
-       if (len > F2FS_NAME_LEN || size > MAX_VALUE_LEN(inode))
+       if (len > F2FS_NAME_LEN)
                return -ERANGE;
 
+       if (size > MAX_VALUE_LEN(inode))
+               return -E2BIG;
+
        base_addr = read_all_xattrs(inode, ipage);
        if (!base_addr)
                goto exit;
@@ -584,6 +585,9 @@ static int __f2fs_setxattr(struct inode *inode, int index,
                inode->i_ctime = CURRENT_TIME;
                clear_inode_flag(fi, FI_ACL_MODE);
        }
+       if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
+                       !strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
+               f2fs_set_encrypted_inode(inode);
 
        if (ipage)
                update_inode(inode, ipage);