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