Code format
[lwext4.git] / lwext4 / ext4_types.h
index 5131336a9f7be9abf84f623ae43c65be1313c668..6a81b444f0a41e58d01db873972f6d52b6db9d36 100644 (file)
@@ -46,6 +46,7 @@
 #include "ext4_blockdev.h"
 #include "tree.h"
 
+#include <stddef.h>
 #include <stdint.h>
 
 #define EXT4_CHECKSUM_CRC32C 1
@@ -217,80 +218,77 @@ struct ext4_sblock {
 /*
  * Incompatible features
  */
-#define EXT4_FEATURE_INCOMPAT_COMPRESSION 0x0001
-#define EXT4_FEATURE_INCOMPAT_FILETYPE 0x0002
-#define EXT4_FEATURE_INCOMPAT_RECOVER 0x0004     /* Needs recovery */
-#define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
-#define EXT4_FEATURE_INCOMPAT_META_BG 0x0010
-#define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */
-#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
-#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
-#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200
-#define EXT4_FEATURE_INCOMPAT_EA_INODE 0x0400   /* EA in inode */
-#define EXT4_FEATURE_INCOMPAT_DIRDATA 0x1000     /* data in dirent */
-#define EXT4_FEATURE_INCOMPAT_BG_USE_META_CSUM 0x2000 /* use crc32c for bg */
-#define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000   /* >2GB or 3-lvl htree */
-#define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000      /* data in inode */
+#define EXT4_FINCOM_COMPRESSION 0x0001
+#define EXT4_FINCOM_FILETYPE 0x0002
+#define EXT4_FINCOM_RECOVER 0x0004     /* Needs recovery */
+#define EXT4_FINCOM_JOURNAL_DEV 0x0008 /* Journal device */
+#define EXT4_FINCOM_META_BG 0x0010
+#define EXT4_FINCOM_EXTENTS 0x0040 /* extents support */
+#define EXT4_FINCOM_64BIT 0x0080
+#define EXT4_FINCOM_MMP 0x0100
+#define EXT4_FINCOM_FLEX_BG 0x0200
+#define EXT4_FINCOM_EA_INODE 0x0400     /* EA in inode */
+#define EXT4_FINCOM_DIRDATA 0x1000       /* data in dirent */
+#define EXT4_FINCOM_BG_USE_META_CSUM 0x2000 /* use crc32c for bg */
+#define EXT4_FINCOM_LARGEDIR 0x4000     /* >2GB or 3-lvl htree */
+#define EXT4_FINCOM_INLINE_DATA 0x8000      /* data in inode */
 
 /*
  * EXT2 supported feature set
  */
-#define EXT2_FEATURE_COMPAT_SUPP 0x0000
+#define EXT2_SUPPORTED_FCOM 0x0000
 
-#define EXT2_FEATURE_INCOMPAT_SUPP                                             \
-       (EXT4_FEATURE_INCOMPAT_FILETYPE | EXT4_FEATURE_INCOMPAT_META_BG)
+#define EXT2_SUPPORTED_FINCOM                                   \
+       (EXT4_FINCOM_FILETYPE | EXT4_FINCOM_META_BG)
 
-#define EXT2_FEATURE_RO_COMPAT_SUPP                                            \
-       (EXT4_FRO_COM_SPARSE_SUPER |                                 \
-        EXT4_FRO_COM_LARGE_FILE | EXT4_FRO_COM_BTREE_DIR)
+#define EXT2_SUPPORTED_FRO_COM                                  \
+       (EXT4_FRO_COM_SPARSE_SUPER |                            \
+        EXT4_FRO_COM_LARGE_FILE)
 
 /*
  * EXT3 supported feature set
  */
-#define EXT3_FEATURE_COMPAT_SUPP (EXT4_FCOM_DIR_INDEX)
+#define EXT3_SUPPORTED_FCOM (EXT4_FCOM_DIR_INDEX)
 
-#define EXT3_FEATURE_INCOMPAT_SUPP                                             \
-       (EXT4_FEATURE_INCOMPAT_FILETYPE | EXT4_FEATURE_INCOMPAT_META_BG)
+#define EXT3_SUPPORTED_FINCOM                                 \
+       (EXT4_FINCOM_FILETYPE | EXT4_FINCOM_META_BG)
 
-#define EXT3_FEATURE_RO_COMPAT_SUPP                                            \
-       (EXT4_FRO_COM_SPARSE_SUPER |                                 \
-        EXT4_FRO_COM_LARGE_FILE | EXT4_FRO_COM_BTREE_DIR)
+#define EXT3_SUPPORTED_FRO_COM                                \
+       (EXT4_FRO_COM_SPARSE_SUPER | EXT4_FRO_COM_LARGE_FILE)
 
 /*
  * EXT4 supported feature set
  */
-#define EXT4_FEATURE_COMPAT_SUPP (EXT4_FCOM_DIR_INDEX)
+#define EXT4_SUPPORTED_FCOM (EXT4_FCOM_DIR_INDEX)
 
-#define EXT4_FEATURE_INCOMPAT_SUPP                                             \
-       (EXT4_FEATURE_INCOMPAT_FILETYPE | EXT4_FEATURE_INCOMPAT_META_BG |      \
-        EXT4_FEATURE_INCOMPAT_EXTENTS | EXT4_FEATURE_INCOMPAT_FLEX_BG |       \
-        EXT4_FEATURE_INCOMPAT_64BIT)
+#define EXT4_SUPPORTED_FINCOM                              \
+       (EXT4_FINCOM_FILETYPE | EXT4_FINCOM_META_BG |      \
+        EXT4_FINCOM_EXTENTS | EXT4_FINCOM_FLEX_BG |       \
+        EXT4_FINCOM_64BIT)
 
-#define EXT4_FEATURE_RO_COMPAT_SUPP                                            \
-       (EXT4_FRO_COM_SPARSE_SUPER |                                 \
-        EXT4_FRO_COM_METADATA_CSUM |                                 \
+#define EXT4_SUPPORTED_FRO_COM                             \
+       (EXT4_FRO_COM_SPARSE_SUPER |                       \
+        EXT4_FRO_COM_METADATA_CSUM |                      \
         EXT4_FRO_COM_LARGE_FILE | EXT4_FRO_COM_GDT_CSUM | \
-        EXT4_FRO_COM_DIR_NLINK |                                    \
-        EXT4_FRO_COM_EXTRA_ISIZE |                                  \
-        EXT4_FRO_COM_BTREE_DIR | EXT4_FRO_COM_HUGE_FILE)
+        EXT4_FRO_COM_DIR_NLINK |                          \
+        EXT4_FRO_COM_EXTRA_ISIZE | EXT4_FRO_COM_HUGE_FILE)
 
 /*Ignored features:
  * RECOVER - journaling in lwext4 is not supported
  *           (probably won't be ever...)
  * MMP - multi-mout protection (impossible scenario)
  * */
-#define FEATURE_INCOMPAT_IGNORED                                               \
-       EXT4_FEATURE_INCOMPAT_RECOVER | EXT4_FEATURE_INCOMPAT_MMP
+#define EXT_FINCOM_IGNORED                                 \
+       EXT4_FINCOM_RECOVER | EXT4_FINCOM_MMP
 
 #if 0
 /*TODO: Features incompatible to implement*/
-#define EXT4_FEATURE_INCOMPAT_SUPP
-                     (EXT4_FEATURE_INCOMPAT_INLINE_DATA)
+#define EXT4_SUPPORTED_FINCOM
+                     (EXT4_FINCOM_INLINE_DATA)
 
 /*TODO: Features read only to implement*/
-#define EXT4_FEATURE_RO_COMPAT_SUPP
+#define EXT4_SUPPORTED_FRO_COM
                      EXT4_FRO_COM_BIGALLOC |\
-                     EXT4_FRO_COM_METADATA_CSUM|\
                      EXT4_FRO_COM_QUOTA)
 #endif
 
@@ -483,7 +481,7 @@ enum { EXT4_DIRENTRY_UNKNOWN = 0,
 
 #define EXT4_DIRENTRY_DIR_CSUM 0xDE
 
-union ext4_directory_entry_ll_internal {
+union ext4_dir_entry_ll_internal {
        uint8_t name_length_high; /* Higher 8 bits of name length */
        uint8_t inode_type;       /* Type of referenced inode (in rev >= 0.5) */
 } __attribute__((packed));
@@ -491,36 +489,36 @@ union ext4_directory_entry_ll_internal {
 /**
  * Linked list directory entry structure
  */
-struct ext4_directory_entry_ll {
+struct ext4_dir_entry_ll {
        uint32_t inode; /* I-node for the entry */
        uint16_t entry_length; /* Distance to the next directory entry */
        uint8_t name_length;   /* Lower 8 bits of name length */
 
-       union ext4_directory_entry_ll_internal in;
+       union ext4_dir_entry_ll_internal in;
 
        uint8_t name[EXT4_DIRECTORY_FILENAME_LEN]; /* Entry name */
 } __attribute__((packed));
 
-struct ext4_directory_iterator {
+struct ext4_dir_iterator {
        struct ext4_inode_ref *inode_ref;
        struct ext4_block current_block;
        uint64_t current_offset;
-       struct ext4_directory_entry_ll *current;
+       struct ext4_dir_entry_ll *current;
 };
 
-struct ext4_directory_search_result {
+struct ext4_dir_search_result {
        struct ext4_block block;
-       struct ext4_directory_entry_ll *dentry;
+       struct ext4_dir_entry_ll *dentry;
 };
 
 /* Structures for indexed directory */
 
-struct ext4_directory_dx_countlimit {
+struct ext4_dir_idx_countlimit {
        uint16_t limit;
        uint16_t count;
 };
 
-struct ext4_directory_dx_dot_entry {
+struct ext4_dir_idx_dot_entry {
        uint32_t inode;
        uint16_t entry_length;
        uint8_t name_length;
@@ -528,7 +526,7 @@ struct ext4_directory_dx_dot_entry {
        uint8_t name[4];
 };
 
-struct ext4_directory_dx_root_info {
+struct ext4_dir_idx_root_info {
        uint32_t reserved_zero;
        uint8_t hash_version;
        uint8_t info_length;
@@ -536,39 +534,39 @@ struct ext4_directory_dx_root_info {
        uint8_t unused_flags;
 };
 
-struct ext4_directory_dx_entry {
+struct ext4_dir_idx_entry {
        uint32_t hash;
        uint32_t block;
 };
 
-struct ext4_directory_dx_root {
-       struct ext4_directory_dx_dot_entry dots[2];
-       struct ext4_directory_dx_root_info info;
-       struct ext4_directory_dx_entry entries[];
+struct ext4_dir_idx_root {
+       struct ext4_dir_idx_dot_entry dots[2];
+       struct ext4_dir_idx_root_info info;
+       struct ext4_dir_idx_entry entries[];
 };
 
-struct ext4_fake_directory_entry {
+struct ext4_fake_dir_entry {
        uint32_t inode;
        uint16_t entry_length;
        uint8_t name_length;
        uint8_t inode_type;
 };
 
-struct ext4_directory_dx_node {
-       struct ext4_fake_directory_entry fake;
-       struct ext4_directory_dx_entry entries[];
+struct ext4_dir_idx_node {
+       struct ext4_fake_dir_entry fake;
+       struct ext4_dir_idx_entry entries[];
 };
 
-struct ext4_directory_dx_block {
+struct ext4_dir_idx_block {
        struct ext4_block block;
-       struct ext4_directory_dx_entry *entries;
-       struct ext4_directory_dx_entry *position;
+       struct ext4_dir_idx_entry *entries;
+       struct ext4_dir_idx_entry *position;
 };
 
 /*
  * This goes at the end of each htree block.
  */
-struct ext4_directory_dx_tail {
+struct ext4_dir_idx_tail {
        uint32_t reserved;
        uint32_t checksum;      /* crc32c(uuid+inum+dirblock) */
 };
@@ -577,7 +575,7 @@ struct ext4_directory_dx_tail {
  * This is a bogus directory entry at the end of each leaf block that
  * records checksums.
  */
-struct ext4_directory_entry_tail {
+struct ext4_dir_entry_tail {
        uint32_t reserved_zero1;        /* Pretend to be unused */
        uint16_t rec_len;               /* 12 */
        uint8_t reserved_zero2; /* Zero name length */
@@ -586,9 +584,8 @@ struct ext4_directory_entry_tail {
 };
 
 #define EXT4_DIRENT_TAIL(block, blocksize) \
-       ((struct ext4_directory_entry_tail *)(((char *)(block)) + \
-                                            ((blocksize) - \
-                                            sizeof(struct ext4_directory_entry_tail))))
+       ((struct ext4_dir_entry_tail *)(((char *)(block)) + ((blocksize) - \
+                                       sizeof(struct ext4_dir_entry_tail))))
 
 #define EXT4_ERR_BAD_DX_DIR (-25000)
 
@@ -824,6 +821,9 @@ struct ext4_xattr_entry {
 } __attribute__((packed));
 
 struct ext4_xattr_item {
+       /* This attribute should be stored in inode body */
+       bool in_inode;
+
        uint8_t name_index;
        char  *name;
        size_t name_len;
@@ -889,6 +889,9 @@ struct ext4_xattr_ref {
 
 /*****************************************************************************/
 
+#define EXT4_CRC32_INIT (0xFFFFFFFFUL)
+
+/*****************************************************************************/
 #ifdef CONFIG_BIG_ENDIAN
 static inline uint64_t to_le64(uint64_t n)
 {
@@ -934,6 +937,18 @@ static inline uint16_t to_le16(uint16_t n)
        (s, f, v) do { (s)->f = (v); }                                         \
        while (0)
 
+
+#ifdef __GNUC__
+#ifndef __unused
+#define __unused __attribute__ ((__unused__))
+#endif
+#endif
+
+#ifndef offsetof
+#define offsetof(type, field)          \
+       ((size_t)(&(((type *)0)->field)))
+#endif
+
 #endif /* EXT4_TYPES_H_ */
 
 /**