1 /* 2 * linux/fs/ext4/xattr_security.c 3 * Handler for storing security labels as extended attributes. 4 */ 5 6 #include <linux/string.h> 7 #include <linux/fs.h> 8 #include <linux/security.h> 9 #include <linux/slab.h> 10 #include "ext4_jbd2.h" 11 #include "ext4.h" 12 #include "xattr.h" 13 14 static int 15 ext4_xattr_security_get(const struct xattr_handler *handler, 16 struct dentry *dentry, const char *name, 17 void *buffer, size_t size) 18 { 19 return ext4_xattr_get(d_inode(dentry), EXT4_XATTR_INDEX_SECURITY, 20 name, buffer, size); 21 } 22 23 static int 24 ext4_xattr_security_set(const struct xattr_handler *handler, 25 struct dentry *dentry, const char *name, 26 const void *value, size_t size, int flags) 27 { 28 return ext4_xattr_set(d_inode(dentry), EXT4_XATTR_INDEX_SECURITY, 29 name, value, size, flags); 30 } 31 32 static int 33 ext4_initxattrs(struct inode *inode, const struct xattr *xattr_array, 34 void *fs_info) 35 { 36 const struct xattr *xattr; 37 handle_t *handle = fs_info; 38 int err = 0; 39 40 for (xattr = xattr_array; xattr->name != NULL; xattr++) { 41 err = ext4_xattr_set_handle(handle, inode, 42 EXT4_XATTR_INDEX_SECURITY, 43 xattr->name, xattr->value, 44 xattr->value_len, 0); 45 if (err < 0) 46 break; 47 } 48 return err; 49 } 50 51 int 52 ext4_init_security(handle_t *handle, struct inode *inode, struct inode *dir, 53 const struct qstr *qstr) 54 { 55 return security_inode_init_security(inode, dir, qstr, 56 &ext4_initxattrs, handle); 57 } 58 59 const struct xattr_handler ext4_xattr_security_handler = { 60 .prefix = XATTR_SECURITY_PREFIX, 61 .get = ext4_xattr_security_get, 62 .set = ext4_xattr_security_set, 63 }; 64