#ifndef _FS_EXT2FS_EXT2_EXTARTTR_H_
#define _FS_EXT2FS_EXT2_EXTARTTR_H_
#define EXT4_XATTR_INDEX_USER 1
#define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS 2
#define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT 3
#define EXT4_XATTR_INDEX_TRUSTED 4
#define EXT4_XATTR_INDEX_LUSTRE 5
#define EXT4_XATTR_INDEX_SECURITY 6
#define EXT4_XATTR_INDEX_SYSTEM 7
#define EXT4_XATTR_INDEX_RICHACL 8
#define EXT4_XATTR_INDEX_ENCRYPTION 9
#define EXTATTR_MAGIC 0xEA020000
#define EXT2_EXTATTR_NAMELEN_MAX 255
#define EXT2_EXTATTR_NAME_HASH_SHIFT 5
#define EXT2_EXTATTR_VALUE_HASH_SHIFT 16
#define EXT2_EXTATTR_BLOCK_HASH_SHIFT 16
struct ext2fs_extattr_header {
int32_t h_magic;
int32_t h_refcount;
int32_t h_blocks;
int32_t h_hash;
int32_t h_checksum;
uint32_t h_reserved[3];
};
struct ext2fs_extattr_dinode_header {
int32_t h_magic;
};
struct ext2fs_extattr_entry {
uint8_t e_name_len;
uint8_t e_name_index;
uint16_t e_value_offs;
uint32_t e_value_block;
uint32_t e_value_size;
uint32_t e_hash;
char e_name[0];
};
#define EXT2_IFIRST(hdr) ((struct ext2fs_extattr_entry *)((hdr)+1))
#define EXT2_HDR(bh) ((struct ext2fs_extattr_header *)((bh)->b_data))
#define EXT2_ENTRY(ptr) ((struct ext2fs_extattr_entry *)(ptr))
#define EXT2_FIRST_ENTRY(bh) EXT2_ENTRY(EXT2_HDR(bh)+1)
#define EXT2_IS_LAST_ENTRY(entry) (*(uint32_t *)(entry) == 0)
#define EXT2_EXTATTR_PAD_BITS 2
#define EXT2_EXTATTR_PAD (1<<EXT2_EXTATTR_PAD_BITS)
#define EXT2_EXTATTR_ROUND (EXT2_EXTATTR_PAD-1)
#define EXT2_EXTATTR_LEN(name_len) \
(((name_len) + EXT2_EXTATTR_ROUND + \
sizeof(struct ext2fs_extattr_entry)) & ~EXT2_EXTATTR_ROUND)
#define EXT2_EXTATTR_SIZE(size) \
(((size) + EXT2_EXTATTR_ROUND) & ~EXT2_EXTATTR_ROUND)
#define EXT2_EXTATTR_NEXT(entry) \
( (struct ext2fs_extattr_entry *)( \
(char *)(entry) + EXT2_EXTATTR_LEN((entry)->e_name_len)) )
int ext2_extattr_inode_delete(struct inode *ip, int attrnamespace,
const char *name);
int ext2_extattr_block_delete(struct inode *ip, int attrnamespace,
const char *name);
int ext2_extattr_free(struct inode *ip);
int ext2_extattr_inode_list(struct inode *ip, int attrnamespace,
struct uio *uio, size_t *size);
int ext2_extattr_block_list(struct inode *ip, int attrnamespace,
struct uio *uio, size_t *size);
int ext2_extattr_inode_get(struct inode *ip, int attrnamespace,
const char *name, struct uio *uio, size_t *size);
int ext2_extattr_block_get(struct inode *ip, int attrnamespace,
const char *name, struct uio *uio, size_t *size);
int ext2_extattr_inode_set(struct inode *ip, int attrnamespace,
const char *name, struct uio *uio);
int ext2_extattr_block_set(struct inode *ip, int attrnamespace,
const char *name, struct uio *uio);
int ext2_extattr_valid_attrname(int attrnamespace, const char *attrname);
#endif