#include "ext4_blockdev.h"
#include "tree.h"
+#include <stddef.h>
#include <stdint.h>
#define EXT4_CHECKSUM_CRC32C 1
/*
* 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
#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));
/**
* 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;
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;
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) */
};
* 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 */
};
#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)
} __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;
/*****************************************************************************/
+#define EXT4_CRC32_INIT (0xFFFFFFFFUL)
+
+/*****************************************************************************/
#ifdef CONFIG_BIG_ENDIAN
static inline uint64_t to_le64(uint64_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_ */
/**