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