ext4_xattr: rework the EA submodule
[lwext4.git] / include / ext4_xattr.h
index f6076d2b8b3fb3858480edb5b62b799d91b90c2e..18a2f1eacc01155df24cac6d9ff2e90a832f8066 100644 (file)
@@ -43,35 +43,87 @@ extern "C" {
 
 #include "ext4_config.h"
 #include "ext4_types.h"
+#include "ext4_inode.h"
 
-int ext4_fs_get_xattr_ref(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref,
-                         struct ext4_xattr_ref *ref);
+struct ext4_xattr_info {
+       uint8_t name_index;
+       const char *name;
+       size_t name_len;
+       const void *value;
+       size_t value_len;
+};
 
-void ext4_fs_put_xattr_ref(struct ext4_xattr_ref *ref);
+struct ext4_xattr_list_entry {
+       uint8_t name_index;
+       char *name;
+       size_t name_len;
+       struct ext4_xattr_list_entry *next;
+};
 
-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);
+struct ext4_xattr_search {
+       /* The first entry in the buffer */
+       struct ext4_xattr_entry *first;
 
-int ext4_fs_remove_xattr(struct ext4_xattr_ref *ref, uint8_t name_index,
-                        const char *name, size_t name_len);
+       /* The address of the buffer */
+       void *base;
 
-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);
+       /* The first inaccessible address */
+       void *end;
 
-void ext4_fs_xattr_iterate(struct ext4_xattr_ref *ref,
-                          int (*iter)(struct ext4_xattr_ref *ref,
-                                    struct ext4_xattr_item *item));
+       /* The current entry pointer */
+       struct ext4_xattr_entry *here;
 
-void ext4_fs_xattr_iterate_reset(struct ext4_xattr_ref *ref);
+       /* Entry not found */
+       bool not_found;
+};
+
+#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)
+
+#define EXT4_ZERO_XATTR_VALUE ((void *)-1)
 
 const char *ext4_extract_xattr_name(const char *full_name, size_t full_name_len,
-                             uint8_t *name_index, size_t *name_len);
+                                   uint8_t *name_index, size_t *name_len,
+                                   bool *found);
 
 const char *ext4_get_xattr_name_prefix(uint8_t name_index,
                                       size_t *ret_prefix_len);
 
+int ext4_xattr_list(struct ext4_inode_ref *inode_ref,
+                   struct ext4_xattr_list_entry *list, size_t *list_len);
+
+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);
+
+int ext4_xattr_remove(struct ext4_inode_ref *inode_ref, uint8_t name_index,
+                     const char *name, size_t name_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
 }
 #endif