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