ext4_xattr: rework the EA submodule
[lwext4.git] / include / ext4_xattr.h
index 097fabf8dcbaeab7f6ed9d9e81136048c3efa1fc..18a2f1eacc01155df24cac6d9ff2e90a832f8066 100644 (file)
@@ -44,103 +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;
 
+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;
-       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
 }