1ac27a0ecSDave Kleikamp /* 2617ba13bSMingming Cao File: fs/ext4/xattr.h 3ac27a0ecSDave Kleikamp 4617ba13bSMingming Cao On-disk format of extended attributes for the ext4 filesystem. 5ac27a0ecSDave Kleikamp 6ac27a0ecSDave Kleikamp (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> 7ac27a0ecSDave Kleikamp */ 8ac27a0ecSDave Kleikamp 9ac27a0ecSDave Kleikamp #include <linux/xattr.h> 10ac27a0ecSDave Kleikamp 11ac27a0ecSDave Kleikamp /* Magic value in attribute blocks */ 12617ba13bSMingming Cao #define EXT4_XATTR_MAGIC 0xEA020000 13ac27a0ecSDave Kleikamp 14ac27a0ecSDave Kleikamp /* Maximum number of references to one attribute block */ 15617ba13bSMingming Cao #define EXT4_XATTR_REFCOUNT_MAX 1024 16ac27a0ecSDave Kleikamp 17ac27a0ecSDave Kleikamp /* Name indexes */ 18617ba13bSMingming Cao #define EXT4_XATTR_INDEX_USER 1 19617ba13bSMingming Cao #define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS 2 20617ba13bSMingming Cao #define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT 3 21617ba13bSMingming Cao #define EXT4_XATTR_INDEX_TRUSTED 4 22617ba13bSMingming Cao #define EXT4_XATTR_INDEX_LUSTRE 5 23617ba13bSMingming Cao #define EXT4_XATTR_INDEX_SECURITY 6 2467cf5b09STao Ma #define EXT4_XATTR_INDEX_SYSTEM 7 25fd03d8daSTheodore Ts'o #define EXT4_XATTR_INDEX_RICHACL 8 26ac27a0ecSDave Kleikamp 27617ba13bSMingming Cao struct ext4_xattr_header { 28ac27a0ecSDave Kleikamp __le32 h_magic; /* magic number for identification */ 29ac27a0ecSDave Kleikamp __le32 h_refcount; /* reference count */ 30ac27a0ecSDave Kleikamp __le32 h_blocks; /* number of disk blocks used */ 31ac27a0ecSDave Kleikamp __le32 h_hash; /* hash value of all attributes */ 32e6153918SDarrick J. Wong __le32 h_checksum; /* crc32c(uuid+id+xattrblock) */ 33e6153918SDarrick J. Wong /* id = inum if refcount=1, blknum otherwise */ 34e6153918SDarrick J. Wong __u32 h_reserved[3]; /* zero right now */ 35ac27a0ecSDave Kleikamp }; 36ac27a0ecSDave Kleikamp 37617ba13bSMingming Cao struct ext4_xattr_ibody_header { 38ac27a0ecSDave Kleikamp __le32 h_magic; /* magic number for identification */ 39ac27a0ecSDave Kleikamp }; 40ac27a0ecSDave Kleikamp 41617ba13bSMingming Cao struct ext4_xattr_entry { 42ac27a0ecSDave Kleikamp __u8 e_name_len; /* length of name */ 43ac27a0ecSDave Kleikamp __u8 e_name_index; /* attribute name index */ 44ac27a0ecSDave Kleikamp __le16 e_value_offs; /* offset in disk block of value */ 45ac27a0ecSDave Kleikamp __le32 e_value_block; /* disk block attribute is stored on (n/i) */ 46ac27a0ecSDave Kleikamp __le32 e_value_size; /* size of attribute value */ 47ac27a0ecSDave Kleikamp __le32 e_hash; /* hash value of name and value */ 48ac27a0ecSDave Kleikamp char e_name[0]; /* attribute name */ 49ac27a0ecSDave Kleikamp }; 50ac27a0ecSDave Kleikamp 51617ba13bSMingming Cao #define EXT4_XATTR_PAD_BITS 2 52617ba13bSMingming Cao #define EXT4_XATTR_PAD (1<<EXT4_XATTR_PAD_BITS) 53617ba13bSMingming Cao #define EXT4_XATTR_ROUND (EXT4_XATTR_PAD-1) 54617ba13bSMingming Cao #define EXT4_XATTR_LEN(name_len) \ 55617ba13bSMingming Cao (((name_len) + EXT4_XATTR_ROUND + \ 56617ba13bSMingming Cao sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND) 57617ba13bSMingming Cao #define EXT4_XATTR_NEXT(entry) \ 58617ba13bSMingming Cao ((struct ext4_xattr_entry *)( \ 59617ba13bSMingming Cao (char *)(entry) + EXT4_XATTR_LEN((entry)->e_name_len))) 60617ba13bSMingming Cao #define EXT4_XATTR_SIZE(size) \ 61617ba13bSMingming Cao (((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND) 62ac27a0ecSDave Kleikamp 636dd4ee7cSKalpak Shah #define IHDR(inode, raw_inode) \ 646dd4ee7cSKalpak Shah ((struct ext4_xattr_ibody_header *) \ 656dd4ee7cSKalpak Shah ((void *)raw_inode + \ 666dd4ee7cSKalpak Shah EXT4_GOOD_OLD_INODE_SIZE + \ 676dd4ee7cSKalpak Shah EXT4_I(inode)->i_extra_isize)) 686dd4ee7cSKalpak Shah #define IFIRST(hdr) ((struct ext4_xattr_entry *)((hdr)+1)) 696dd4ee7cSKalpak Shah 70879b3825STao Ma #define BHDR(bh) ((struct ext4_xattr_header *)((bh)->b_data)) 71879b3825STao Ma #define ENTRY(ptr) ((struct ext4_xattr_entry *)(ptr)) 72879b3825STao Ma #define BFIRST(bh) ENTRY(BHDR(bh)+1) 73879b3825STao Ma #define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) 74879b3825STao Ma 75bd9926e8STheodore Ts'o #define EXT4_ZERO_XATTR_VALUE ((void *)-1) 76879b3825STao Ma 77879b3825STao Ma struct ext4_xattr_info { 78879b3825STao Ma int name_index; 79879b3825STao Ma const char *name; 80879b3825STao Ma const void *value; 81879b3825STao Ma size_t value_len; 82879b3825STao Ma }; 83879b3825STao Ma 84879b3825STao Ma struct ext4_xattr_search { 85879b3825STao Ma struct ext4_xattr_entry *first; 86879b3825STao Ma void *base; 87879b3825STao Ma void *end; 88879b3825STao Ma struct ext4_xattr_entry *here; 89879b3825STao Ma int not_found; 90879b3825STao Ma }; 91879b3825STao Ma 92879b3825STao Ma struct ext4_xattr_ibody_find { 93879b3825STao Ma struct ext4_xattr_search s; 94879b3825STao Ma struct ext4_iloc iloc; 95879b3825STao Ma }; 96879b3825STao Ma 9711e27528SStephen Hemminger extern const struct xattr_handler ext4_xattr_user_handler; 9811e27528SStephen Hemminger extern const struct xattr_handler ext4_xattr_trusted_handler; 9911e27528SStephen Hemminger extern const struct xattr_handler ext4_xattr_acl_access_handler; 10011e27528SStephen Hemminger extern const struct xattr_handler ext4_xattr_acl_default_handler; 10111e27528SStephen Hemminger extern const struct xattr_handler ext4_xattr_security_handler; 102ac27a0ecSDave Kleikamp 103617ba13bSMingming Cao extern ssize_t ext4_listxattr(struct dentry *, char *, size_t); 104ac27a0ecSDave Kleikamp 105617ba13bSMingming Cao extern int ext4_xattr_get(struct inode *, int, const char *, void *, size_t); 106617ba13bSMingming Cao extern int ext4_xattr_set(struct inode *, int, const char *, const void *, size_t, int); 107617ba13bSMingming Cao extern int ext4_xattr_set_handle(handle_t *, struct inode *, int, const char *, const void *, size_t, int); 108ac27a0ecSDave Kleikamp 109617ba13bSMingming Cao extern void ext4_xattr_delete_inode(handle_t *, struct inode *); 110617ba13bSMingming Cao extern void ext4_xattr_put_super(struct super_block *); 111ac27a0ecSDave Kleikamp 1126dd4ee7cSKalpak Shah extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, 1136dd4ee7cSKalpak Shah struct ext4_inode *raw_inode, handle_t *handle); 1146dd4ee7cSKalpak Shah 1155dabfc78STheodore Ts'o extern int __init ext4_init_xattr(void); 1165dabfc78STheodore Ts'o extern void ext4_exit_xattr(void); 117ac27a0ecSDave Kleikamp 11811e27528SStephen Hemminger extern const struct xattr_handler *ext4_xattr_handlers[]; 119ac27a0ecSDave Kleikamp 120879b3825STao Ma extern int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i, 121879b3825STao Ma struct ext4_xattr_ibody_find *is); 122879b3825STao Ma extern int ext4_xattr_ibody_get(struct inode *inode, int name_index, 123879b3825STao Ma const char *name, 124879b3825STao Ma void *buffer, size_t buffer_size); 1250d812f77STao Ma extern int ext4_xattr_ibody_inline_set(handle_t *handle, struct inode *inode, 126879b3825STao Ma struct ext4_xattr_info *i, 127879b3825STao Ma struct ext4_xattr_ibody_find *is); 128879b3825STao Ma 12903010a33STheodore Ts'o #ifdef CONFIG_EXT4_FS_SECURITY 130617ba13bSMingming Cao extern int ext4_init_security(handle_t *handle, struct inode *inode, 1312a7dba39SEric Paris struct inode *dir, const struct qstr *qstr); 132ac27a0ecSDave Kleikamp #else 133617ba13bSMingming Cao static inline int ext4_init_security(handle_t *handle, struct inode *inode, 1342a7dba39SEric Paris struct inode *dir, const struct qstr *qstr) 135ac27a0ecSDave Kleikamp { 136ac27a0ecSDave Kleikamp return 0; 137ac27a0ecSDave Kleikamp } 138ac27a0ecSDave Kleikamp #endif 139