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_SECURITY_PREFIX "security." 10 11 static int 12 security_get(struct inode *inode, const char *name, void *buffer, size_t size) 13 { 14 if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 15 return -EINVAL; 16 17 if (is_reiserfs_priv_object(inode)) 18 return -EPERM; 19 20 return reiserfs_xattr_get(inode, name, buffer, size); 21 } 22 23 static int 24 security_set(struct inode *inode, const char *name, const void *buffer, 25 size_t size, int flags) 26 { 27 if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 28 return -EINVAL; 29 30 if (is_reiserfs_priv_object(inode)) 31 return -EPERM; 32 33 return reiserfs_xattr_set(inode, name, buffer, size, flags); 34 } 35 36 static int security_del(struct inode *inode, const char *name) 37 { 38 if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) 39 return -EINVAL; 40 41 if (is_reiserfs_priv_object(inode)) 42 return -EPERM; 43 44 return 0; 45 } 46 47 static int 48 security_list(struct inode *inode, const char *name, int namelen, char *out) 49 { 50 int len = namelen; 51 52 if (is_reiserfs_priv_object(inode)) 53 return 0; 54 55 if (out) 56 memcpy(out, name, len); 57 58 return len; 59 } 60 61 struct reiserfs_xattr_handler security_handler = { 62 .prefix = XATTR_SECURITY_PREFIX, 63 .get = security_get, 64 .set = security_set, 65 .del = security_del, 66 .list = security_list, 67 }; 68