xref: /linux/fs/hfsplus/xattr_user.c (revision 3932b9ca55b0be314a36d3e84faff3e823c081f5)
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 <linux/nls.h>
10 
11 #include "hfsplus_fs.h"
12 #include "xattr.h"
13 
14 static int hfsplus_user_getxattr(struct dentry *dentry, const char *name,
15 					void *buffer, size_t size, int type)
16 {
17 	char *xattr_name;
18 	int res;
19 
20 	if (!strcmp(name, ""))
21 		return -EINVAL;
22 
23 	xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
24 		GFP_KERNEL);
25 	if (!xattr_name)
26 		return -ENOMEM;
27 	strcpy(xattr_name, XATTR_USER_PREFIX);
28 	strcpy(xattr_name + XATTR_USER_PREFIX_LEN, name);
29 
30 	res = hfsplus_getxattr(dentry, xattr_name, buffer, size);
31 	kfree(xattr_name);
32 	return res;
33 }
34 
35 static int hfsplus_user_setxattr(struct dentry *dentry, const char *name,
36 		const void *buffer, size_t size, int flags, int type)
37 {
38 	char *xattr_name;
39 	int res;
40 
41 	if (!strcmp(name, ""))
42 		return -EINVAL;
43 
44 	xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
45 		GFP_KERNEL);
46 	if (!xattr_name)
47 		return -ENOMEM;
48 	strcpy(xattr_name, XATTR_USER_PREFIX);
49 	strcpy(xattr_name + XATTR_USER_PREFIX_LEN, name);
50 
51 	res = hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
52 	kfree(xattr_name);
53 	return res;
54 }
55 
56 static size_t hfsplus_user_listxattr(struct dentry *dentry, char *list,
57 		size_t list_size, const char *name, size_t name_len, int type)
58 {
59 	/*
60 	 * This method is not used.
61 	 * It is used hfsplus_listxattr() instead of generic_listxattr().
62 	 */
63 	return -EOPNOTSUPP;
64 }
65 
66 const struct xattr_handler hfsplus_xattr_user_handler = {
67 	.prefix	= XATTR_USER_PREFIX,
68 	.list	= hfsplus_user_listxattr,
69 	.get	= hfsplus_user_getxattr,
70 	.set	= hfsplus_user_setxattr,
71 };
72