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 }; 82