xattr_trusted.c revision bd4c625c061c2a38568d0add3478f59172455159
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/reiserfs_fs.h>
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fs.h>
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pagemap.h>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/xattr.h>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/reiserfs_xattr.h>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h>
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define XATTR_TRUSTED_PREFIX "trusted."
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int
12bd4c625c061c2a38568d0add3478f59172455159Linus Torvaldstrusted_get(struct inode *inode, const char *name, void *buffer, size_t size)
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
14bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
15bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EINVAL;
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!reiserfs_xattrs(inode->i_sb))
18bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EOPNOTSUPP;
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
21bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EPERM;
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	return reiserfs_xattr_get(inode, name, buffer, size);
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int
27bd4c625c061c2a38568d0add3478f59172455159Linus Torvaldstrusted_set(struct inode *inode, const char *name, const void *buffer,
28bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	    size_t size, int flags)
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
31bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EINVAL;
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!reiserfs_xattrs(inode->i_sb))
34bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EOPNOTSUPP;
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
37bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EPERM;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	return reiserfs_xattr_set(inode, name, buffer, size, flags);
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42bd4c625c061c2a38568d0add3478f59172455159Linus Torvaldsstatic int trusted_del(struct inode *inode, const char *name)
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
44bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
45bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EINVAL;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!reiserfs_xattrs(inode->i_sb))
48bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EOPNOTSUPP;
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
51bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return -EPERM;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	return 0;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int
57bd4c625c061c2a38568d0add3478f59172455159Linus Torvaldstrusted_list(struct inode *inode, const char *name, int namelen, char *out)
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
59bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	int len = namelen;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!reiserfs_xattrs(inode->i_sb))
62bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return 0;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode)))
65bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		return 0;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	if (out)
68bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds		memcpy(out, name, len);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70bd4c625c061c2a38568d0add3478f59172455159Linus Torvalds	return len;
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct reiserfs_xattr_handler trusted_handler = {
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.prefix = XATTR_TRUSTED_PREFIX,
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.get = trusted_get,
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.set = trusted_set,
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.del = trusted_del,
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.list = trusted_list,
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
80