vserver 1.9.3
[linux-2.6.git] / fs / reiserfs / xattr_trusted.c
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 };