diff options
Diffstat (limited to 'fs/reiserfs/xattr_trusted.c')
-rw-r--r-- | fs/reiserfs/xattr_trusted.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/fs/reiserfs/xattr_trusted.c b/fs/reiserfs/xattr_trusted.c new file mode 100644 index 000000000000..43762197fb0a --- /dev/null +++ b/fs/reiserfs/xattr_trusted.c | |||
@@ -0,0 +1,81 @@ | |||
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 | ||
43 | trusted_del (struct inode *inode, const char *name) | ||
44 | { | ||
45 | if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) | ||
46 | return -EINVAL; | ||
47 | |||
48 | if (!reiserfs_xattrs (inode->i_sb)) | ||
49 | return -EOPNOTSUPP; | ||
50 | |||
51 | if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode))) | ||
52 | return -EPERM; | ||
53 | |||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | static int | ||
58 | trusted_list (struct inode *inode, const char *name, int namelen, char *out) | ||
59 | { | ||
60 | int len = namelen; | ||
61 | |||
62 | if (!reiserfs_xattrs (inode->i_sb)) | ||
63 | return 0; | ||
64 | |||
65 | if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode))) | ||
66 | return 0; | ||
67 | |||
68 | if (out) | ||
69 | memcpy (out, name, len); | ||
70 | |||
71 | return len; | ||
72 | } | ||
73 | |||
74 | |||
75 | struct reiserfs_xattr_handler trusted_handler = { | ||
76 | .prefix = XATTR_TRUSTED_PREFIX, | ||
77 | .get = trusted_get, | ||
78 | .set = trusted_set, | ||
79 | .del = trusted_del, | ||
80 | .list = trusted_list, | ||
81 | }; | ||