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 }; 64