xref: /openbmc/linux/fs/reiserfs/xattr_trusted.c (revision 87c2ce3b)
1 #include <linux/reiserfs_fs.h>
2 #include <linux/errno.h>
3 #include <linux/fs.h>
4 #include <linux/pagemap.h>
5 #include <linux/xattr.h>
6 #include <linux/reiserfs_xattr.h>
7 #include <asm/uaccess.h>
8 
9 #define XATTR_TRUSTED_PREFIX "trusted."
10 
11 static int
12 trusted_get(struct inode *inode, const char *name, void *buffer, size_t size)
13 {
14 	if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
15 		return -EINVAL;
16 
17 	if (!reiserfs_xattrs(inode->i_sb))
18 		return -EOPNOTSUPP;
19 
20 	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
21 		return -EPERM;
22 
23 	return reiserfs_xattr_get(inode, name, buffer, size);
24 }
25 
26 static int
27 trusted_set(struct inode *inode, const char *name, const void *buffer,
28 	    size_t size, int flags)
29 {
30 	if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
31 		return -EINVAL;
32 
33 	if (!reiserfs_xattrs(inode->i_sb))
34 		return -EOPNOTSUPP;
35 
36 	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
37 		return -EPERM;
38 
39 	return reiserfs_xattr_set(inode, name, buffer, size, flags);
40 }
41 
42 static int trusted_del(struct inode *inode, const char *name)
43 {
44 	if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
45 		return -EINVAL;
46 
47 	if (!reiserfs_xattrs(inode->i_sb))
48 		return -EOPNOTSUPP;
49 
50 	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
51 		return -EPERM;
52 
53 	return 0;
54 }
55 
56 static int
57 trusted_list(struct inode *inode, const char *name, int namelen, char *out)
58 {
59 	int len = namelen;
60 
61 	if (!reiserfs_xattrs(inode->i_sb))
62 		return 0;
63 
64 	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
65 		return 0;
66 
67 	if (out)
68 		memcpy(out, name, len);
69 
70 	return len;
71 }
72 
73 struct reiserfs_xattr_handler trusted_handler = {
74 	.prefix = XATTR_TRUSTED_PREFIX,
75 	.get = trusted_get,
76 	.set = trusted_set,
77 	.del = trusted_del,
78 	.list = trusted_list,
79 };
80