1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2ac27a0ecSDave Kleikamp /*
3617ba13bSMingming Cao * linux/fs/ext4/xattr_security.c
4ac27a0ecSDave Kleikamp * Handler for storing security labels as extended attributes.
5ac27a0ecSDave Kleikamp */
6ac27a0ecSDave Kleikamp
7ac27a0ecSDave Kleikamp #include <linux/string.h>
8ac27a0ecSDave Kleikamp #include <linux/fs.h>
9ac27a0ecSDave Kleikamp #include <linux/security.h>
105a0e3ad6STejun Heo #include <linux/slab.h>
113dcf5451SChristoph Hellwig #include "ext4_jbd2.h"
123dcf5451SChristoph Hellwig #include "ext4.h"
13ac27a0ecSDave Kleikamp #include "xattr.h"
14ac27a0ecSDave Kleikamp
15ac27a0ecSDave Kleikamp static int
ext4_xattr_security_get(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * name,void * buffer,size_t size)16d9a82a04SAndreas Gruenbacher ext4_xattr_security_get(const struct xattr_handler *handler,
17b296821aSAl Viro struct dentry *unused, struct inode *inode,
18b296821aSAl Viro const char *name, void *buffer, size_t size)
19ac27a0ecSDave Kleikamp {
20b296821aSAl Viro return ext4_xattr_get(inode, EXT4_XATTR_INDEX_SECURITY,
21431547b3SChristoph Hellwig name, buffer, size);
22ac27a0ecSDave Kleikamp }
23ac27a0ecSDave Kleikamp
24ac27a0ecSDave Kleikamp static int
ext4_xattr_security_set(const struct xattr_handler * handler,struct mnt_idmap * idmap,struct dentry * unused,struct inode * inode,const char * name,const void * value,size_t size,int flags)25d9a82a04SAndreas Gruenbacher ext4_xattr_security_set(const struct xattr_handler *handler,
26*39f60c1cSChristian Brauner struct mnt_idmap *idmap,
2759301226SAl Viro struct dentry *unused, struct inode *inode,
2859301226SAl Viro const char *name, const void *value,
2959301226SAl Viro size_t size, int flags)
30ac27a0ecSDave Kleikamp {
3159301226SAl Viro return ext4_xattr_set(inode, EXT4_XATTR_INDEX_SECURITY,
32431547b3SChristoph Hellwig name, value, size, flags);
33ac27a0ecSDave Kleikamp }
34ac27a0ecSDave Kleikamp
35176576dbSDjalal Harouni static int
ext4_initxattrs(struct inode * inode,const struct xattr * xattr_array,void * fs_info)36176576dbSDjalal Harouni ext4_initxattrs(struct inode *inode, const struct xattr *xattr_array,
379d8f13baSMimi Zohar void *fs_info)
389d8f13baSMimi Zohar {
399d8f13baSMimi Zohar const struct xattr *xattr;
409d8f13baSMimi Zohar handle_t *handle = fs_info;
419d8f13baSMimi Zohar int err = 0;
429d8f13baSMimi Zohar
439d8f13baSMimi Zohar for (xattr = xattr_array; xattr->name != NULL; xattr++) {
449d8f13baSMimi Zohar err = ext4_xattr_set_handle(handle, inode,
459d8f13baSMimi Zohar EXT4_XATTR_INDEX_SECURITY,
469d8f13baSMimi Zohar xattr->name, xattr->value,
473f706c8cSEryu Guan xattr->value_len, XATTR_CREATE);
489d8f13baSMimi Zohar if (err < 0)
499d8f13baSMimi Zohar break;
509d8f13baSMimi Zohar }
519d8f13baSMimi Zohar return err;
529d8f13baSMimi Zohar }
539d8f13baSMimi Zohar
54ac27a0ecSDave Kleikamp int
ext4_init_security(handle_t * handle,struct inode * inode,struct inode * dir,const struct qstr * qstr)552a7dba39SEric Paris ext4_init_security(handle_t *handle, struct inode *inode, struct inode *dir,
562a7dba39SEric Paris const struct qstr *qstr)
57ac27a0ecSDave Kleikamp {
589d8f13baSMimi Zohar return security_inode_init_security(inode, dir, qstr,
599d8f13baSMimi Zohar &ext4_initxattrs, handle);
60ac27a0ecSDave Kleikamp }
61ac27a0ecSDave Kleikamp
6211e27528SStephen Hemminger const struct xattr_handler ext4_xattr_security_handler = {
63ac27a0ecSDave Kleikamp .prefix = XATTR_SECURITY_PREFIX,
64617ba13bSMingming Cao .get = ext4_xattr_security_get,
65617ba13bSMingming Cao .set = ext4_xattr_security_set,
66ac27a0ecSDave Kleikamp };
67