1ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp/*
2617ba13b31fbf505cc21799826639ef24ed94af0Mingming Cao * linux/fs/ext4/xattr_user.c
3ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp * Handler for extended user attributes.
4ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp *
5ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org>
6ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp */
7ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
8ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp#include <linux/string.h>
9ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp#include <linux/fs.h>
103dcf54515aa4981a647ad74859199032965193a5Christoph Hellwig#include "ext4_jbd2.h"
113dcf54515aa4981a647ad74859199032965193a5Christoph Hellwig#include "ext4.h"
12ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp#include "xattr.h"
13ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
14ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikampstatic size_t
15431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwigext4_xattr_user_list(struct dentry *dentry, char *list, size_t list_size,
16431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig		     const char *name, size_t name_len, int type)
17ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp{
183537576a707c6df98e883b77b854c6083f844602Shen Feng	const size_t prefix_len = XATTR_USER_PREFIX_LEN;
19ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	const size_t total_len = prefix_len + name_len + 1;
20ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
21431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig	if (!test_opt(dentry->d_sb, XATTR_USER))
22ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		return 0;
23ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
24ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	if (list && total_len <= list_size) {
25ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		memcpy(list, XATTR_USER_PREFIX, prefix_len);
26ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		memcpy(list+prefix_len, name, name_len);
27ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		list[prefix_len + name_len] = '\0';
28ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	}
29ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	return total_len;
30ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp}
31ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
32ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikampstatic int
33431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwigext4_xattr_user_get(struct dentry *dentry, const char *name,
34431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig		    void *buffer, size_t size, int type)
35ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp{
36ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	if (strcmp(name, "") == 0)
37ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		return -EINVAL;
38431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig	if (!test_opt(dentry->d_sb, XATTR_USER))
39ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		return -EOPNOTSUPP;
40431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig	return ext4_xattr_get(dentry->d_inode, EXT4_XATTR_INDEX_USER,
41431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig			      name, buffer, size);
42ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp}
43ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
44ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikampstatic int
45431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwigext4_xattr_user_set(struct dentry *dentry, const char *name,
46431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig		    const void *value, size_t size, int flags, int type)
47ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp{
48ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	if (strcmp(name, "") == 0)
49ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		return -EINVAL;
50431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig	if (!test_opt(dentry->d_sb, XATTR_USER))
51ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp		return -EOPNOTSUPP;
52431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig	return ext4_xattr_set(dentry->d_inode, EXT4_XATTR_INDEX_USER,
53431547b3c4533b8c7fd150ab36980b9a3147797bChristoph Hellwig			      name, value, size, flags);
54ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp}
55ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp
5611e27528076e7dee63f1db78bffbef6310f076f4Stephen Hemmingerconst struct xattr_handler ext4_xattr_user_handler = {
57ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp	.prefix	= XATTR_USER_PREFIX,
58617ba13b31fbf505cc21799826639ef24ed94af0Mingming Cao	.list	= ext4_xattr_user_list,
59617ba13b31fbf505cc21799826639ef24ed94af0Mingming Cao	.get	= ext4_xattr_user_get,
60617ba13b31fbf505cc21799826639ef24ed94af0Mingming Cao	.set	= ext4_xattr_user_set,
61ac27a0ec112a089f1a5102bc8dffc79c8c815571Dave Kleikamp};
62