diff options
| author | Kaho Ng <ngkaho1234@gmail.com> | 2016-06-09 22:27:04 +0800 |
|---|---|---|
| committer | Kaho Ng <ngkaho1234@gmail.com> | 2016-06-20 18:06:00 +0800 |
| commit | 278e8d43d2bd28063cb0a0d30fec9ef3d9685e3d (patch) | |
| tree | 03c9d946c12fe1bf6d6805dda6a8f8444d6085ba /include | |
| parent | 45a1867fb54cf994a51d897ee7eb83f31d72f3fc (diff) | |
ext4_xattr: rework the EA submodule
Diffstat (limited to 'include')
| -rw-r--r-- | include/ext4_xattr.h | 141 |
1 files changed, 60 insertions, 81 deletions
diff --git a/include/ext4_xattr.h b/include/ext4_xattr.h index 3cd1bcd..18a2f1e 100644 --- a/include/ext4_xattr.h +++ b/include/ext4_xattr.h @@ -44,106 +44,85 @@ extern "C" { #include "ext4_config.h" #include "ext4_types.h" #include "ext4_inode.h" -#include "misc/tree.h" -#include "misc/queue.h" - -struct ext4_xattr_item { - /* This attribute should be stored in inode body */ - bool in_inode; - bool is_data; +struct ext4_xattr_info { uint8_t name_index; - char *name; + const char *name; size_t name_len; - void *data; - size_t data_size; - - RB_ENTRY(ext4_xattr_item) node; + const void *value; + size_t value_len; }; -struct ext4_xattr_ref { - bool block_loaded; - struct ext4_block block; - struct ext4_inode_ref *inode_ref; - bool dirty; - size_t ea_size; - size_t block_size_rem; - size_t inode_size_rem; - struct ext4_fs *fs; - - void *iter_arg; - struct ext4_xattr_item *iter_from; - - RB_HEAD(ext4_xattr_tree, - ext4_xattr_item) root; +struct ext4_xattr_list_entry { + uint8_t name_index; + char *name; + size_t name_len; + struct ext4_xattr_list_entry *next; }; -#define EXT4_XATTR_PAD_BITS 2 -#define EXT4_XATTR_PAD (1<<EXT4_XATTR_PAD_BITS) -#define EXT4_XATTR_ROUND (EXT4_XATTR_PAD-1) -#define EXT4_XATTR_LEN(name_len) \ - (((name_len) + EXT4_XATTR_ROUND + \ - sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND) -#define EXT4_XATTR_NEXT(entry) \ - ((struct ext4_xattr_entry *)( \ - (char *)(entry) + EXT4_XATTR_LEN((entry)->e_name_len))) -#define EXT4_XATTR_SIZE(size) \ - (((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND) -#define EXT4_XATTR_NAME(entry) \ - ((char *)((entry) + 1)) - -#define EXT4_XATTR_IHDR(sb, raw_inode) \ - ((struct ext4_xattr_ibody_header *) \ - ((char *)raw_inode + \ - EXT4_GOOD_OLD_INODE_SIZE + \ - ext4_inode_get_extra_isize(sb, raw_inode))) -#define EXT4_XATTR_IFIRST(hdr) \ - ((struct ext4_xattr_entry *)((hdr)+1)) - -#define EXT4_XATTR_BHDR(block) \ - ((struct ext4_xattr_header *)((block)->data)) -#define EXT4_XATTR_ENTRY(ptr) \ - ((struct ext4_xattr_entry *)(ptr)) -#define EXT4_XATTR_BFIRST(block) \ - EXT4_XATTR_ENTRY(EXT4_XATTR_BHDR(block)+1) -#define EXT4_XATTR_IS_LAST_ENTRY(entry) \ - (*(uint32_t *)(entry) == 0) +struct ext4_xattr_search { + /* The first entry in the buffer */ + struct ext4_xattr_entry *first; -#define EXT4_ZERO_XATTR_VALUE ((void *)-1) + /* The address of the buffer */ + void *base; + /* The first inaccessible address */ + void *end; -#define EXT4_XATTR_ITERATE_CONT 0 -#define EXT4_XATTR_ITERATE_STOP 1 -#define EXT4_XATTR_ITERATE_PAUSE 2 + /* The current entry pointer */ + struct ext4_xattr_entry *here; -int ext4_fs_get_xattr_ref(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref, - struct ext4_xattr_ref *ref); + /* Entry not found */ + bool not_found; +}; -void ext4_fs_put_xattr_ref(struct ext4_xattr_ref *ref); +#define EXT4_XATTR_PAD_BITS 2 +#define EXT4_XATTR_PAD (1 << EXT4_XATTR_PAD_BITS) +#define EXT4_XATTR_ROUND (EXT4_XATTR_PAD - 1) +#define EXT4_XATTR_LEN(name_len) \ + (((name_len) + EXT4_XATTR_ROUND + sizeof(struct ext4_xattr_entry)) & \ + ~EXT4_XATTR_ROUND) +#define EXT4_XATTR_NEXT(entry) \ + ((struct ext4_xattr_entry *)((char *)(entry) + \ + EXT4_XATTR_LEN((entry)->e_name_len))) +#define EXT4_XATTR_SIZE(size) (((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND) +#define EXT4_XATTR_NAME(entry) ((char *)((entry) + 1)) + +#define EXT4_XATTR_IHDR(sb, raw_inode) \ + ((struct ext4_xattr_ibody_header *)((char *)raw_inode + \ + EXT4_GOOD_OLD_INODE_SIZE + \ + ext4_inode_get_extra_isize( \ + sb, raw_inode))) +#define EXT4_XATTR_IFIRST(hdr) ((struct ext4_xattr_entry *)((hdr) + 1)) + +#define EXT4_XATTR_BHDR(block) ((struct ext4_xattr_header *)((block)->data)) +#define EXT4_XATTR_ENTRY(ptr) ((struct ext4_xattr_entry *)(ptr)) +#define EXT4_XATTR_BFIRST(block) EXT4_XATTR_ENTRY(EXT4_XATTR_BHDR(block) + 1) +#define EXT4_XATTR_IS_LAST_ENTRY(entry) (*(uint32_t *)(entry) == 0) -int ext4_fs_set_xattr(struct ext4_xattr_ref *ref, uint8_t name_index, - const char *name, size_t name_len, const void *data, - size_t data_size, bool replace); +#define EXT4_ZERO_XATTR_VALUE ((void *)-1) -int ext4_fs_remove_xattr(struct ext4_xattr_ref *ref, uint8_t name_index, - const char *name, size_t name_len); +const char *ext4_extract_xattr_name(const char *full_name, size_t full_name_len, + uint8_t *name_index, size_t *name_len, + bool *found); -int ext4_fs_get_xattr(struct ext4_xattr_ref *ref, uint8_t name_index, - const char *name, size_t name_len, void *buf, - size_t buf_size, size_t *data_size); +const char *ext4_get_xattr_name_prefix(uint8_t name_index, + size_t *ret_prefix_len); -void ext4_fs_xattr_iterate(struct ext4_xattr_ref *ref, - int (*iter)(struct ext4_xattr_ref *ref, - struct ext4_xattr_item *item)); +int ext4_xattr_list(struct ext4_inode_ref *inode_ref, + struct ext4_xattr_list_entry *list, size_t *list_len); -void ext4_fs_xattr_iterate_reset(struct ext4_xattr_ref *ref); +int ext4_xattr_get(struct ext4_inode_ref *inode_ref, uint8_t name_index, + const char *name, size_t name_len, void *buf, size_t buf_len, + size_t *data_len); -const char *ext4_extract_xattr_name(const char *full_name, size_t full_name_len, - uint8_t *name_index, size_t *name_len, - bool *found); +int ext4_xattr_remove(struct ext4_inode_ref *inode_ref, uint8_t name_index, + const char *name, size_t name_len); -const char *ext4_get_xattr_name_prefix(uint8_t name_index, - size_t *ret_prefix_len); +int ext4_xattr_set(struct ext4_inode_ref *inode_ref, uint8_t name_index, + const char *name, size_t name_len, const void *value, + size_t value_len); #ifdef __cplusplus } |
