source: mainline/uspace/lib/ext4/libext4_types.h@ 865a4bf

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 865a4bf was 865a4bf, checked in by Frantisek Princ <frantisek.princ@…>, 13 years ago

changed supported features

  • Property mode set to 100644
File size: 20.7 KB
Line 
1/*
2 * Copyright (c) 2012 Frantisek Princ
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libext4
30 * @{
31 */
32
33#ifndef LIBEXT4_LIBEXT4_TYPES_H_
34#define LIBEXT4_LIBEXT4_TYPES_H_
35
36#include <libblock.h>
37
38/*
39 * Structure of the super block
40 */
41typedef struct ext4_superblock {
42 uint32_t inodes_count; // Inodes count
43 uint32_t blocks_count_lo; // Blocks count
44 uint32_t reserved_blocks_count_lo; // Reserved blocks count
45 uint32_t free_blocks_count_lo; // Free blocks count
46 uint32_t free_inodes_count; // Free inodes count
47 uint32_t first_data_block; // First Data Block
48 uint32_t log_block_size; // Block size
49 uint32_t log_frag_size; // Obsoleted fragment size
50 uint32_t blocks_per_group; // Number of blocks per group
51 uint32_t frags_per_group; // Obsoleted fragments per group
52 uint32_t inodes_per_group; // Number of inodes per group
53 uint32_t mount_time; // Mount time
54 uint32_t write_time; // Write time
55 uint16_t mount_count; // Mount count
56 uint16_t max_mount_count; // Maximal mount count
57 uint16_t magic; // Magic signature
58 uint16_t state; // Filesystem state
59 uint16_t errors; // Behaviour when detecting errors
60 uint16_t minor_rev_level; // Minor revision level
61 uint32_t last_check_time; // Time of last check
62 uint32_t check_interval; // Maximum time between checks
63 uint32_t creator_os; // Creator OS
64 uint32_t rev_level; // Revision level
65 uint16_t def_resuid; // Default uid for reserved blocks
66 uint16_t def_resgid; // Default gid for reserved blocks
67
68 // Fields for EXT4_DYNAMIC_REV superblocks only.
69 uint32_t first_inode; // First non-reserved inode
70 uint16_t inode_size; // Size of inode structure
71 uint16_t block_group_index; // Block group index of this superblock
72 uint32_t features_compatible; // Compatible feature set
73 uint32_t features_incompatible; // Incompatible feature set
74 uint32_t features_read_only; // Readonly-compatible feature set
75 uint8_t uuid[16]; // 128-bit uuid for volume
76 char volume_name[16]; // Volume name
77 char last_mounted[64]; // Directory where last mounted
78 uint32_t algorithm_usage_bitmap; // For compression
79
80 /*
81 * Performance hints. Directory preallocation should only
82 * happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on.
83 */
84 uint8_t s_prealloc_blocks; // Number of blocks to try to preallocate
85 uint8_t s_prealloc_dir_blocks; // Number to preallocate for dirs
86 uint16_t s_reserved_gdt_blocks; // Per group desc for online growth
87
88 /*
89 * Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set.
90 */
91 uint8_t journal_uuid[16]; // UUID of journal superblock
92 uint32_t journal_inode_number; // Inode number of journal file
93 uint32_t journal_dev; // Device number of journal file
94 uint32_t last_orphan; // Head of list of inodes to delete
95 uint32_t hash_seed[4]; // HTREE hash seed
96 uint8_t default_hash_version; // Default hash version to use
97 uint8_t journal_backup_type;
98 uint16_t desc_size; // Size of group descriptor
99 uint32_t default_mount_opts; // Default mount options
100 uint32_t first_meta_bg; // First metablock block group
101 uint32_t mkfs_time; // When the filesystem was created
102 uint32_t journal_blocks[17]; // Backup of the journal inode
103
104 /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
105 uint32_t blocks_count_hi; // Blocks count
106 uint32_t reserved_blocks_count_hi; // Reserved blocks count
107 uint32_t free_blocks_count_hi; // Free blocks count
108 uint16_t min_extra_isize; // All inodes have at least # bytes
109 uint16_t want_extra_isize; // New inodes should reserve # bytes
110 uint32_t flags; // Miscellaneous flags
111 uint16_t raid_stride; // RAID stride
112 uint16_t mmp_interval; // # seconds to wait in MMP checking
113 uint64_t mmp_block; // Block for multi-mount protection
114 uint32_t raid_stripe_width; // blocks on all data disks (N*stride)
115 uint8_t log_groups_per_flex; // FLEX_BG group size
116 uint8_t reserved_char_pad;
117 uint16_t reserved_pad;
118 uint64_t kbytes_written; // Number of lifetime kilobytes written
119 uint32_t snapshot_inum; // Inode number of active snapshot
120 uint32_t snapshot_id; // Sequential ID of active snapshot
121 uint64_t snapshot_r_blocks_count; /* reserved blocks for active snapshot's future use */
122 uint32_t snapshot_list; // inode number of the head of the on-disk snapshot list
123 uint32_t error_count; // number of fs errors
124 uint32_t first_error_time; // First time an error happened
125 uint32_t first_error_ino; // Inode involved in first error
126 uint64_t first_error_block; // block involved of first error
127 uint8_t first_error_func[32]; // Function where the error happened
128 uint32_t first_error_line; // Line number where error happened
129 uint32_t last_error_time; // Most recent time of an error
130 uint32_t last_error_ino; // Inode involved in last error
131 uint32_t last_error_line; // Line number where error happened
132 uint64_t last_error_block; // Block involved of last error
133 uint8_t last_error_func[32]; // Function where the error happened
134 uint8_t mount_opts[64];
135 uint32_t padding[112]; // Padding to the end of the block
136} __attribute__((packed)) ext4_superblock_t;
137
138
139#define EXT4_SUPERBLOCK_MAGIC 0xEF53
140#define EXT4_SUPERBLOCK_SIZE 1024
141#define EXT4_SUPERBLOCK_OFFSET 1024
142
143#define EXT4_SUPERBLOCK_OS_LINUX 0
144#define EXT4_SUPERBLOCK_OS_HURD 1
145
146/*
147 * Misc. filesystem flags
148 */
149#define EXT4_SUPERBLOCK_FLAGS_SIGNED_HASH 0x0001 // Signed dirhash in use
150#define EXT4_SUPERBLOCK_FLAGS_UNSIGNED_HASH 0x0002 // Unsigned dirhash in use
151#define EXT4_SUPERBLOCK_FLAGS_TEST_FILESYS 0x0004 // to test development code
152
153/*
154 * Filesystem states
155 */
156#define EXT4_SUPERBLOCK_STATE_VALID_FS 0x0001 // Unmounted cleanly
157#define EXT4_SUPERBLOCK_STATE_ERROR_FS 0x0002 // Errors detected
158#define EXT4_SUPERBLOCK_STATE_ORPHAN_FS 0x0004 // Orphans being recovered
159
160/*
161 * Behaviour when errors detected
162 */
163#define EXT4_SUPERBLOCK_ERRORS_CONTINUE 1 // Continue execution
164#define EXT4_SUPERBLOCK_ERRORS_RO 2 // Remount fs read-only
165#define EXT4_SUPERBLOCK_ERRORS_PANIC 3 // Panic
166#define EXT4_SUPERBLOCK_ERRORS_DEFAULT EXT4_ERRORS_CONTINUE
167
168/*
169 * Compatible features
170 */
171#define EXT4_FEATURE_COMPAT_DIR_PREALLOC 0x0001
172#define EXT4_FEATURE_COMPAT_IMAGIC_INODES 0x0002
173#define EXT4_FEATURE_COMPAT_HAS_JOURNAL 0x0004
174#define EXT4_FEATURE_COMPAT_EXT_ATTR 0x0008
175#define EXT4_FEATURE_COMPAT_RESIZE_INODE 0x0010
176#define EXT4_FEATURE_COMPAT_DIR_INDEX 0x0020
177
178/*
179 * Read-only compatible features
180 */
181#define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
182#define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
183#define EXT4_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
184#define EXT4_FEATURE_RO_COMPAT_HUGE_FILE 0x0008
185#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM 0x0010
186#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK 0x0020
187#define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE 0x0040
188
189/*
190 * Incompatible features
191 */
192#define EXT4_FEATURE_INCOMPAT_COMPRESSION 0x0001
193#define EXT4_FEATURE_INCOMPAT_FILETYPE 0x0002
194#define EXT4_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */
195#define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
196#define EXT4_FEATURE_INCOMPAT_META_BG 0x0010
197#define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */
198#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
199#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
200#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200
201#define EXT4_FEATURE_INCOMPAT_EA_INODE 0x0400 /* EA in inode */
202#define EXT4_FEATURE_INCOMPAT_DIRDATA 0x1000 /* data in dirent */
203
204#define EXT4_FEATURE_COMPAT_SUPP (EXT4_FEATURE_COMPAT_DIR_INDEX)
205
206#define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE | \
207 EXT4_FEATURE_INCOMPAT_EXTENTS | \
208 EXT4_FEATURE_INCOMPAT_64BIT)
209
210#define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER | \
211 EXT4_FEATURE_RO_COMPAT_DIR_NLINK | \
212 EXT4_FEATURE_RO_COMPAT_HUGE_FILE | \
213 EXT4_FEATURE_RO_COMPAT_LARGE_FILE | \
214 EXT4_FEATURE_RO_COMPAT_GDT_CSUM | \
215 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE)
216
217
218/*****************************************************************************/
219
220typedef struct ext4_filesystem {
221 service_id_t device;
222 ext4_superblock_t * superblock;
223 aoff64_t inode_block_limits[4];
224 aoff64_t inode_blocks_per_level[4];
225} ext4_filesystem_t;
226
227
228/*****************************************************************************/
229
230#define EXT4_BLOCK_GROUP_INODE_UNINIT 0x0001 /* Inode table/bitmap not in use */
231#define EXT4_BLOCK_GROUP_BLOCK_UNINIT 0x0002 /* Block bitmap not in use */
232#define EXT4_BLOCK_GROUP_ITABLE_ZEROED 0x0004 /* On-disk itable initialized to zero */
233
234/*
235 * Structure of a blocks group descriptor
236 */
237typedef struct ext4_block_group {
238 uint32_t block_bitmap_lo; // Blocks bitmap block
239 uint32_t inode_bitmap_lo; // Inodes bitmap block
240 uint32_t inode_table_first_block_lo; // Inodes table block
241 uint16_t free_blocks_count_lo; // Free blocks count
242 uint16_t free_inodes_count_lo; // Free inodes count
243 uint16_t used_dirs_count_lo; // Directories count
244 uint16_t flags; // EXT4_BG_flags (INODE_UNINIT, etc)
245 uint32_t reserved[2]; // Likely block/inode bitmap checksum
246 uint16_t itable_unused_lo; // Unused inodes count
247 uint16_t checksum; // crc16(sb_uuid+group+desc)
248 /* -------------- */
249 uint32_t block_bitmap_hi; // Blocks bitmap block MSB
250 uint32_t inode_bitmap_hi; // Inodes bitmap block MSB
251 uint32_t inode_table_first_block_hi; // Inodes table block MSB
252 uint16_t free_blocks_count_hi; // Free blocks count MSB
253 uint16_t free_inodes_count_hi; // Free inodes count MSB
254 uint16_t used_dirs_count_hi; // Directories count MSB
255 uint16_t itable_unused_hi; // Unused inodes count MSB
256 uint32_t reserved2[3]; // Padding
257} ext4_block_group_t;
258
259typedef struct ext4_block_group_ref {
260 block_t *block; // Reference to a block containing this block group descr
261 ext4_block_group_t *block_group;
262 ext4_filesystem_t *fs;
263 uint32_t index;
264 bool dirty;
265} ext4_block_group_ref_t;
266
267
268#define EXT4_MIN_BLOCK_GROUP_DESCRIPTOR_SIZE 32
269#define EXT4_MAX_BLOCK_GROUP_DESCRIPTOR_SIZE 64
270
271/*****************************************************************************/
272
273
274#define EXT4_MIN_BLOCK_SIZE 1024 //1 KiB
275#define EXT4_MAX_BLOCK_SIZE 65536 //64 KiB
276#define EXT4_REV0_INODE_SIZE 128
277
278#define EXT4_INODE_BLOCK_SIZE 512
279
280#define EXT4_INODE_DIRECT_BLOCK_COUNT 12
281#define EXT4_INODE_INDIRECT_BLOCK EXT4_INODE_DIRECT_BLOCK_COUNT
282#define EXT4_INODE_DOUBLE_INDIRECT_BLOCK (EXT4_INODE_INDIRECT_BLOCK + 1)
283#define EXT4_INODE_TRIPPLE_INDIRECT_BLOCK (EXT4_INODE_DOUBLE_INDIRECT_BLOCK + 1)
284#define EXT4_INODE_BLOCKS (EXT4_INODE_TRIPPLE_INDIRECT_BLOCK + 1)
285#define EXT4_INODE_INDIRECT_BLOCK_COUNT (EXT4_INODE_BLOCKS - EXT4_INODE_DIRECT_BLOCK_COUNT)
286
287/*
288 * Structure of an inode on the disk
289 */
290typedef struct ext4_inode {
291 uint16_t mode; // File mode
292 uint16_t uid; // Low 16 bits of owner uid
293 uint32_t size_lo; // Size in bytes
294 uint32_t access_time; // Access time
295 uint32_t change_inode_time; // Inode change time
296 uint32_t modification_time; // Modification time
297 uint32_t deletion_time; // Deletion time
298 uint16_t gid; // Low 16 bits of group id
299 uint16_t links_count; // Links count
300 uint32_t blocks_count_lo; // Blocks count
301 uint32_t flags; // File flags
302 uint32_t unused_osd1; // OS dependent - not used in HelenOS
303 uint32_t blocks[EXT4_INODE_BLOCKS]; // Pointers to blocks
304 uint32_t generation; // File version (for NFS)
305 uint32_t file_acl_lo; // File ACL
306 uint32_t size_hi;
307 uint32_t obso_faddr; // Obsoleted fragment address
308 union {
309 struct {
310 uint16_t blocks_high; /* were l_i_reserved1 */
311 uint16_t file_acl_high;
312 uint16_t uid_high; /* these 2 fields */
313 uint16_t gid_high; /* were reserved2[0] */
314 uint32_t reserved2;
315 } linux2;
316 struct {
317 uint16_t reserved1; /* Obsoleted fragment number/size which are removed in ext4 */
318 uint16_t mode_high;
319 uint16_t uid_high;
320 uint16_t gid_high;
321 uint32_t author;
322 } hurd2;
323 } __attribute__ ((packed)) osd2;
324
325 uint16_t extra_isize;
326 uint16_t pad1;
327 uint32_t ctime_extra; // Extra change time (nsec << 2 | epoch)
328 uint32_t mtime_extra; // Extra Modification time (nsec << 2 | epoch)
329 uint32_t atime_extra; // Extra Access time (nsec << 2 | epoch)
330 uint32_t crtime; // File creation time
331 uint32_t crtime_extra; // Extra file creation time (nsec << 2 | epoch)
332 uint32_t version_hi; // High 32 bits for 64-bit version
333} __attribute__ ((packed)) ext4_inode_t;
334
335#define EXT4_INODE_MODE_FIFO 0x1000
336#define EXT4_INODE_MODE_CHARDEV 0x2000
337#define EXT4_INODE_MODE_DIRECTORY 0x4000
338#define EXT4_INODE_MODE_BLOCKDEV 0x6000
339#define EXT4_INODE_MODE_FILE 0x8000
340#define EXT4_INODE_MODE_SOFTLINK 0xA000
341#define EXT4_INODE_MODE_SOCKET 0xC000
342#define EXT4_INODE_MODE_TYPE_MASK 0xF000
343
344/*
345 * Inode flags
346 */
347#define EXT4_INODE_FLAG_SECRM 0x00000001 // Secure deletion
348#define EXT4_INODE_FLAG_UNRM 0x00000002 // Undelete
349#define EXT4_INODE_FLAG_COMPR 0x00000004 // Compress file
350#define EXT4_INODE_FLAG_SYNC 0x00000008 // Synchronous updates
351#define EXT4_INODE_FLAG_IMMUTABLE 0x00000010 // Immutable file
352#define EXT4_INODE_FLAG_APPEND 0x00000020 // writes to file may only append
353#define EXT4_INODE_FLAG_NODUMP 0x00000040 // do not dump file
354#define EXT4_INODE_FLAG_NOATIME 0x00000080 // do not update atime
355/* Compression flags */
356#define EXT4_INODE_FLAG_DIRTY 0x00000100
357#define EXT4_INODE_FLAG_COMPRBLK 0x00000200 // One or more compressed clusters
358#define EXT4_INODE_FLAG_NOCOMPR 0x00000400 // Don't compress
359#define EXT4_INODE_FLAG_ECOMPR 0x00000800 // Compression error
360/* End compression flags --- maybe not all used */
361#define EXT4_INODE_FLAG_INDEX 0x00001000 // hash-indexed directory
362#define EXT4_INODE_FLAG_IMAGIC 0x00002000 // AFS directory */
363#define EXT4_INODE_FLAG_JOURNAL_DATA 0x00004000 // File data should be journaled
364#define EXT4_INODE_FLAG_NOTAIL 0x00008000 // File tail should not be merged
365#define EXT4_INODE_FLAG_DIRSYNC 0x00010000 // Dirsync behaviour (directories only)
366#define EXT4_INODE_FLAG_TOPDIR 0x00020000 // Top of directory hierarchies
367#define EXT4_INODE_FLAG_HUGE_FILE 0x00040000 // Set to each huge file
368#define EXT4_INODE_FLAG_EXTENTS 0x00080000 // Inode uses extents
369#define EXT4_INODE_FLAG_EA_INODE 0x00200000 // Inode used for large EA
370#define EXT4_INODE_FLAG_EOFBLOCKS 0x00400000 // Blocks allocated beyond EOF
371#define EXT4_INODE_FLAG_RESERVED 0x80000000 // reserved for ext4 lib
372
373#define EXT4_INODE_ROOT_INDEX 2
374
375typedef struct ext4_inode_ref {
376 block_t *block; // Reference to a block containing this inode
377 ext4_inode_t *inode;
378 ext4_filesystem_t *fs;
379 uint32_t index; // Index number of this inode
380 bool dirty;
381} ext4_inode_ref_t;
382
383/*****************************************************************************/
384
385#define EXT4_DIRECTORY_FILENAME_LEN 255
386
387#define EXT4_DIRECTORY_FILETYPE_UNKNOWN 0
388#define EXT4_DIRECTORY_FILETYPE_REG_FILE 1
389#define EXT4_DIRECTORY_FILETYPE_DIR 2
390#define EXT4_DIRECTORY_FILETYPE_CHRDEV 3
391#define EXT4_DIRECTORY_FILETYPE_BLKDEV 4
392#define EXT4_DIRECTORY_FILETYPE_FIFO 5
393#define EXT4_DIRECTORY_FILETYPE_SOCK 6
394#define EXT4_DIRECTORY_FILETYPE_SYMLINK 7
395
396/**
397 * Linked list directory entry structure
398 */
399typedef struct ext4_directory_entry_ll {
400 uint32_t inode; // Inode for the entry
401 uint16_t entry_length; // Distance to the next directory entry
402 uint8_t name_length; // Lower 8 bits of name length
403 union {
404 uint8_t name_length_high; // Higher 8 bits of name length
405 uint8_t inode_type; // Type of referenced inode (in rev >= 0.5)
406 } __attribute__ ((packed));
407 uint8_t name[EXT4_DIRECTORY_FILENAME_LEN]; // Entry name
408} __attribute__ ((packed)) ext4_directory_entry_ll_t;
409
410typedef struct ext4_directory_iterator {
411 ext4_inode_ref_t *inode_ref;
412 block_t *current_block;
413 aoff64_t current_offset;
414 ext4_directory_entry_ll_t *current;
415} ext4_directory_iterator_t;
416
417typedef struct ext4_directory_search_result {
418 block_t *block;
419 ext4_directory_entry_ll_t *dentry;
420} ext4_directory_search_result_t;
421
422
423/*****************************************************************************/
424
425/* Structures for indexed directory */
426
427typedef struct ext4_directory_dx_countlimit {
428 uint16_t limit;
429 uint16_t count;
430} ext4_directory_dx_countlimit_t;
431
432typedef struct ext4_directory_dx_dot_entry {
433 uint32_t inode;
434 uint16_t entry_length;
435 uint8_t name_length;
436 uint8_t inode_type;
437 uint8_t name[4];
438} ext4_directory_dx_dot_entry_t;
439
440typedef struct ext4_directory_dx_root_info {
441 uint32_t reserved_zero;
442 uint8_t hash_version;
443 uint8_t info_length;
444 uint8_t indirect_levels;
445 uint8_t unused_flags;
446} ext4_directory_dx_root_info_t;
447
448typedef struct ext4_directory_dx_entry {
449 uint32_t hash;
450 uint32_t block;
451} ext4_directory_dx_entry_t;
452
453typedef struct ext4_directory_dx_root {
454 ext4_directory_dx_dot_entry_t dots[2];
455 ext4_directory_dx_root_info_t info;
456 ext4_directory_dx_entry_t entries[0];
457} ext4_directory_dx_root_t;
458
459typedef struct ext4_fake_directory_entry {
460 uint32_t inode;
461 uint16_t entry_length;
462 uint8_t name_length;
463 uint8_t inode_type;
464} ext4_fake_directory_entry_t;
465
466typedef struct ext4_directory_dx_node {
467 ext4_fake_directory_entry_t fake;
468 ext4_directory_dx_entry_t entries[0];
469} ext4_directory_dx_node_t;
470
471
472typedef struct ext4_directory_dx_block {
473 block_t *block;
474 ext4_directory_dx_entry_t *entries;
475 ext4_directory_dx_entry_t *position;
476} ext4_directory_dx_block_t;
477
478
479
480#define EXT4_ERR_BAD_DX_DIR (-75000)
481#define EXT4_DIRECTORY_HTREE_EOF (uint32_t)0x7fffffff
482
483/*****************************************************************************/
484
485/*
486 * This is the extent on-disk structure.
487 * It's used at the bottom of the tree.
488 */
489typedef struct ext4_extent {
490 uint32_t first_block; // First logical block extent covers
491 uint16_t block_count; // Number of blocks covered by extent
492 uint16_t start_hi; // High 16 bits of physical block
493 uint32_t start_lo; // Low 32 bits of physical block
494} ext4_extent_t;
495
496/*
497 * This is index on-disk structure.
498 * It's used at all the levels except the bottom.
499 */
500typedef struct ext4_extent_index {
501 uint32_t first_block; // Index covers logical blocks from 'block'
502 uint32_t leaf_lo; /* Pointer to the physical block of the next
503 * level. leaf or next index could be there */
504 uint16_t leaf_hi; /* high 16 bits of physical block */
505 uint16_t padding;
506} ext4_extent_index_t;
507
508/*
509 * Each block (leaves and indexes), even inode-stored has header.
510 */
511typedef struct ext4_extent_header {
512 uint16_t magic;
513 uint16_t entries_count; // Number of valid entries
514 uint16_t max_entries_count; // Capacity of store in entries
515 uint16_t depth; // Has tree real underlying blocks?
516 uint32_t generation; // generation of the tree
517} ext4_extent_header_t;
518
519typedef struct ext4_extent_path {
520 block_t *block;
521 uint16_t depth;
522 ext4_extent_header_t *header;
523 ext4_extent_index_t *index;
524 ext4_extent_t *extent;
525} ext4_extent_path_t;
526
527#define EXT4_EXTENT_MAGIC 0xF30A
528#define EXT4_EXTENT_FIRST(header) \
529 ((ext4_extent_t *) (((void *) (header)) + sizeof(ext4_extent_header_t)))
530#define EXT4_EXTENT_FIRST_INDEX(header) \
531 ((ext4_extent_index_t *) (((void *) (header)) + sizeof(ext4_extent_header_t)))
532
533/*****************************************************************************/
534
535#define EXT4_HASH_VERSION_LEGACY 0
536#define EXT4_HASH_VERSION_HALF_MD4 1
537#define EXT4_HASH_VERSION_TEA 2
538#define EXT4_HASH_VERSION_LEGACY_UNSIGNED 3
539#define EXT4_HASH_VERSION_HALF_MD4_UNSIGNED 4
540#define EXT4_HASH_VERSION_TEA_UNSIGNED 5
541
542typedef struct ext4_hash_info {
543 uint32_t hash;
544 uint32_t minor_hash;
545 uint32_t hash_version;
546 const uint32_t *seed;
547} ext4_hash_info_t;
548
549#endif
550
551/**
552 * @}
553 */
Note: See TracBrowser for help on using the repository browser.