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 trusted_del(struct inode *inode, const char *name) 43 { 44 if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) 45 return -EINVAL; 46 47 if (!reiserfs_xattrs(inode->i_sb)) 48 return -EOPNOTSUPP; 49 50 if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode))) 51 return -EPERM; 52 53 return 0; 54 } 55 56 static int 57 trusted_list(struct inode *inode, const char *name, int namelen, char *out) 58 { 59 int len = namelen; 60 61 if (!reiserfs_xattrs(inode->i_sb)) 62 return 0; 63 64 if (!(capable(CAP_SYS_ADMIN) || is_reiserfs_priv_object(inode))) 65 return 0; 66 67 if (out) 68 memcpy(out, name, len); 69 70 return len; 71 } 72 73 struct reiserfs_xattr_handler trusted_handler = { 74 .prefix = XATTR_TRUSTED_PREFIX, 75 .get = trusted_get, 76 .set = trusted_set, 77 .del = trusted_del, 78 .list = trusted_list, 79 }; 80