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