Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : /* 3 : : File: fs/ext4/xattr.h 4 : : 5 : : On-disk format of extended attributes for the ext4 filesystem. 6 : : 7 : : (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> 8 : : */ 9 : : 10 : : #include <linux/xattr.h> 11 : : 12 : : /* Magic value in attribute blocks */ 13 : : #define EXT4_XATTR_MAGIC 0xEA020000 14 : : 15 : : /* Maximum number of references to one attribute block */ 16 : : #define EXT4_XATTR_REFCOUNT_MAX 1024 17 : : 18 : : /* Name indexes */ 19 : : #define EXT4_XATTR_INDEX_USER 1 20 : : #define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS 2 21 : : #define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT 3 22 : : #define EXT4_XATTR_INDEX_TRUSTED 4 23 : : #define EXT4_XATTR_INDEX_LUSTRE 5 24 : : #define EXT4_XATTR_INDEX_SECURITY 6 25 : : #define EXT4_XATTR_INDEX_SYSTEM 7 26 : : #define EXT4_XATTR_INDEX_RICHACL 8 27 : : #define EXT4_XATTR_INDEX_ENCRYPTION 9 28 : : #define EXT4_XATTR_INDEX_HURD 10 /* Reserved for Hurd */ 29 : : 30 : : struct ext4_xattr_header { 31 : : __le32 h_magic; /* magic number for identification */ 32 : : __le32 h_refcount; /* reference count */ 33 : : __le32 h_blocks; /* number of disk blocks used */ 34 : : __le32 h_hash; /* hash value of all attributes */ 35 : : __le32 h_checksum; /* crc32c(uuid+id+xattrblock) */ 36 : : /* id = inum if refcount=1, blknum otherwise */ 37 : : __u32 h_reserved[3]; /* zero right now */ 38 : : }; 39 : : 40 : : struct ext4_xattr_ibody_header { 41 : : __le32 h_magic; /* magic number for identification */ 42 : : }; 43 : : 44 : : struct ext4_xattr_entry { 45 : : __u8 e_name_len; /* length of name */ 46 : : __u8 e_name_index; /* attribute name index */ 47 : : __le16 e_value_offs; /* offset in disk block of value */ 48 : : __le32 e_value_inum; /* inode in which the value is stored */ 49 : : __le32 e_value_size; /* size of attribute value */ 50 : : __le32 e_hash; /* hash value of name and value */ 51 : : char e_name[0]; /* attribute name */ 52 : : }; 53 : : 54 : : #define EXT4_XATTR_PAD_BITS 2 55 : : #define EXT4_XATTR_PAD (1<<EXT4_XATTR_PAD_BITS) 56 : : #define EXT4_XATTR_ROUND (EXT4_XATTR_PAD-1) 57 : : #define EXT4_XATTR_LEN(name_len) \ 58 : : (((name_len) + EXT4_XATTR_ROUND + \ 59 : : sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND) 60 : : #define EXT4_XATTR_NEXT(entry) \ 61 : : ((struct ext4_xattr_entry *)( \ 62 : : (char *)(entry) + EXT4_XATTR_LEN((entry)->e_name_len))) 63 : : #define EXT4_XATTR_SIZE(size) \ 64 : : (((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND) 65 : : 66 : : #define IHDR(inode, raw_inode) \ 67 : : ((struct ext4_xattr_ibody_header *) \ 68 : : ((void *)raw_inode + \ 69 : : EXT4_GOOD_OLD_INODE_SIZE + \ 70 : : EXT4_I(inode)->i_extra_isize)) 71 : : #define IFIRST(hdr) ((struct ext4_xattr_entry *)((hdr)+1)) 72 : : 73 : : /* 74 : : * XATTR_SIZE_MAX is currently 64k, but for the purposes of checking 75 : : * for file system consistency errors, we use a somewhat bigger value. 76 : : * This allows XATTR_SIZE_MAX to grow in the future, but by using this 77 : : * instead of INT_MAX for certain consistency checks, we don't need to 78 : : * worry about arithmetic overflows. (Actually XATTR_SIZE_MAX is 79 : : * defined in include/uapi/linux/limits.h, so changing it is going 80 : : * not going to be trivial....) 81 : : */ 82 : : #define EXT4_XATTR_SIZE_MAX (1 << 24) 83 : : 84 : : /* 85 : : * The minimum size of EA value when you start storing it in an external inode 86 : : * size of block - size of header - size of 1 entry - 4 null bytes 87 : : */ 88 : : #define EXT4_XATTR_MIN_LARGE_EA_SIZE(b) \ 89 : : ((b) - EXT4_XATTR_LEN(3) - sizeof(struct ext4_xattr_header) - 4) 90 : : 91 : : #define BHDR(bh) ((struct ext4_xattr_header *)((bh)->b_data)) 92 : : #define ENTRY(ptr) ((struct ext4_xattr_entry *)(ptr)) 93 : : #define BFIRST(bh) ENTRY(BHDR(bh)+1) 94 : : #define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) 95 : : 96 : : #define EXT4_ZERO_XATTR_VALUE ((void *)-1) 97 : : 98 : : struct ext4_xattr_info { 99 : : const char *name; 100 : : const void *value; 101 : : size_t value_len; 102 : : int name_index; 103 : : int in_inode; 104 : : }; 105 : : 106 : : struct ext4_xattr_search { 107 : : struct ext4_xattr_entry *first; 108 : : void *base; 109 : : void *end; 110 : : struct ext4_xattr_entry *here; 111 : : int not_found; 112 : : }; 113 : : 114 : : struct ext4_xattr_ibody_find { 115 : : struct ext4_xattr_search s; 116 : : struct ext4_iloc iloc; 117 : : }; 118 : : 119 : : struct ext4_xattr_inode_array { 120 : : unsigned int count; /* # of used items in the array */ 121 : : struct inode *inodes[0]; 122 : : }; 123 : : 124 : : extern const struct xattr_handler ext4_xattr_user_handler; 125 : : extern const struct xattr_handler ext4_xattr_trusted_handler; 126 : : extern const struct xattr_handler ext4_xattr_security_handler; 127 : : 128 : : #define EXT4_XATTR_NAME_ENCRYPTION_CONTEXT "c" 129 : : 130 : : /* 131 : : * The EXT4_STATE_NO_EXPAND is overloaded and used for two purposes. 132 : : * The first is to signal that there the inline xattrs and data are 133 : : * taking up so much space that we might as well not keep trying to 134 : : * expand it. The second is that xattr_sem is taken for writing, so 135 : : * we shouldn't try to recurse into the inode expansion. For this 136 : : * second case, we need to make sure that we take save and restore the 137 : : * NO_EXPAND state flag appropriately. 138 : : */ 139 : 3 : static inline void ext4_write_lock_xattr(struct inode *inode, int *save) 140 : : { 141 : 3 : down_write(&EXT4_I(inode)->xattr_sem); 142 : 3 : *save = ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND); 143 : : ext4_set_inode_state(inode, EXT4_STATE_NO_EXPAND); 144 : 3 : } 145 : : 146 : 0 : static inline int ext4_write_trylock_xattr(struct inode *inode, int *save) 147 : : { 148 : 0 : if (down_write_trylock(&EXT4_I(inode)->xattr_sem) == 0) 149 : : return 0; 150 : 0 : *save = ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND); 151 : : ext4_set_inode_state(inode, EXT4_STATE_NO_EXPAND); 152 : 0 : return 1; 153 : : } 154 : : 155 : 3 : static inline void ext4_write_unlock_xattr(struct inode *inode, int *save) 156 : : { 157 : 3 : if (*save == 0) 158 : : ext4_clear_inode_state(inode, EXT4_STATE_NO_EXPAND); 159 : 3 : up_write(&EXT4_I(inode)->xattr_sem); 160 : 3 : } 161 : : 162 : : extern ssize_t ext4_listxattr(struct dentry *, char *, size_t); 163 : : 164 : : extern int ext4_xattr_get(struct inode *, int, const char *, void *, size_t); 165 : : extern int ext4_xattr_set(struct inode *, int, const char *, const void *, size_t, int); 166 : : extern int ext4_xattr_set_handle(handle_t *, struct inode *, int, const char *, const void *, size_t, int); 167 : : extern int ext4_xattr_set_credits(struct inode *inode, size_t value_len, 168 : : bool is_create, int *credits); 169 : : extern int __ext4_xattr_set_credits(struct super_block *sb, struct inode *inode, 170 : : struct buffer_head *block_bh, size_t value_len, 171 : : bool is_create); 172 : : 173 : : extern int ext4_xattr_delete_inode(handle_t *handle, struct inode *inode, 174 : : struct ext4_xattr_inode_array **array, 175 : : int extra_credits); 176 : : extern void ext4_xattr_inode_array_free(struct ext4_xattr_inode_array *array); 177 : : 178 : : extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, 179 : : struct ext4_inode *raw_inode, handle_t *handle); 180 : : 181 : : extern const struct xattr_handler *ext4_xattr_handlers[]; 182 : : 183 : : extern int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i, 184 : : struct ext4_xattr_ibody_find *is); 185 : : extern int ext4_xattr_ibody_get(struct inode *inode, int name_index, 186 : : const char *name, 187 : : void *buffer, size_t buffer_size); 188 : : extern int ext4_xattr_ibody_inline_set(handle_t *handle, struct inode *inode, 189 : : struct ext4_xattr_info *i, 190 : : struct ext4_xattr_ibody_find *is); 191 : : 192 : : extern struct mb_cache *ext4_xattr_create_cache(void); 193 : : extern void ext4_xattr_destroy_cache(struct mb_cache *); 194 : : 195 : : #ifdef CONFIG_EXT4_FS_SECURITY 196 : : extern int ext4_init_security(handle_t *handle, struct inode *inode, 197 : : struct inode *dir, const struct qstr *qstr); 198 : : #else 199 : : static inline int ext4_init_security(handle_t *handle, struct inode *inode, 200 : : struct inode *dir, const struct qstr *qstr) 201 : : { 202 : : return 0; 203 : : } 204 : : #endif 205 : : 206 : : #ifdef CONFIG_LOCKDEP 207 : : extern void ext4_xattr_inode_set_class(struct inode *ea_inode); 208 : : #else 209 : : static inline void ext4_xattr_inode_set_class(struct inode *ea_inode) { } 210 : : #endif 211 : : 212 : : extern int ext4_get_inode_usage(struct inode *inode, qsize_t *usage);