diff options
Diffstat (limited to 'fs/hfsplus/xattr_user.c')
-rw-r--r-- | fs/hfsplus/xattr_user.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/fs/hfsplus/xattr_user.c b/fs/hfsplus/xattr_user.c new file mode 100644 index 000000000000..e34016561ae0 --- /dev/null +++ b/fs/hfsplus/xattr_user.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * linux/fs/hfsplus/xattr_user.c | ||
3 | * | ||
4 | * Vyacheslav Dubeyko <slava@dubeyko.com> | ||
5 | * | ||
6 | * Handler for user extended attributes. | ||
7 | */ | ||
8 | |||
9 | #include "hfsplus_fs.h" | ||
10 | #include "xattr.h" | ||
11 | |||
12 | static int hfsplus_user_getxattr(struct dentry *dentry, const char *name, | ||
13 | void *buffer, size_t size, int type) | ||
14 | { | ||
15 | char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0}; | ||
16 | size_t len = strlen(name); | ||
17 | |||
18 | if (!strcmp(name, "")) | ||
19 | return -EINVAL; | ||
20 | |||
21 | if (len + XATTR_USER_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN) | ||
22 | return -EOPNOTSUPP; | ||
23 | |||
24 | strcpy(xattr_name, XATTR_USER_PREFIX); | ||
25 | strcpy(xattr_name + XATTR_USER_PREFIX_LEN, name); | ||
26 | |||
27 | return hfsplus_getxattr(dentry, xattr_name, buffer, size); | ||
28 | } | ||
29 | |||
30 | static int hfsplus_user_setxattr(struct dentry *dentry, const char *name, | ||
31 | const void *buffer, size_t size, int flags, int type) | ||
32 | { | ||
33 | char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0}; | ||
34 | size_t len = strlen(name); | ||
35 | |||
36 | if (!strcmp(name, "")) | ||
37 | return -EINVAL; | ||
38 | |||
39 | if (len + XATTR_USER_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN) | ||
40 | return -EOPNOTSUPP; | ||
41 | |||
42 | strcpy(xattr_name, XATTR_USER_PREFIX); | ||
43 | strcpy(xattr_name + XATTR_USER_PREFIX_LEN, name); | ||
44 | |||
45 | return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags); | ||
46 | } | ||
47 | |||
48 | static size_t hfsplus_user_listxattr(struct dentry *dentry, char *list, | ||
49 | size_t list_size, const char *name, size_t name_len, int type) | ||
50 | { | ||
51 | /* | ||
52 | * This method is not used. | ||
53 | * It is used hfsplus_listxattr() instead of generic_listxattr(). | ||
54 | */ | ||
55 | return -EOPNOTSUPP; | ||
56 | } | ||
57 | |||
58 | const struct xattr_handler hfsplus_xattr_user_handler = { | ||
59 | .prefix = XATTR_USER_PREFIX, | ||
60 | .list = hfsplus_user_listxattr, | ||
61 | .get = hfsplus_user_getxattr, | ||
62 | .set = hfsplus_user_setxattr, | ||
63 | }; | ||