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