source: mainline/uspace/lib/ext4/libext4_types.h@ 4059a28

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

adjusted supported features

  • Property mode set to 100644
File size: 20.6 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// TODO MODIFY features corresponding with implementation
205#define EXT4_FEATURE_COMPAT_SUPP (EXT4_FEATURE_COMPAT_DIR_INDEX)
206
207#define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE | \
208 EXT4_FEATURE_INCOMPAT_EXTENTS | \
209 EXT4_FEATURE_INCOMPAT_64BIT)
210
211#define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER | \
212 EXT4_FEATURE_RO_COMPAT_DIR_NLINK | \
213 EXT4_FEATURE_RO_COMPAT_HUGE_FILE)
214
215
216/*****************************************************************************/
217
218typedef struct ext4_filesystem {
219 service_id_t device;
220 ext4_superblock_t * superblock;
221 aoff64_t inode_block_limits[4];
222 aoff64_t inode_blocks_per_level[4];
223} ext4_filesystem_t;
224
225
226/*****************************************************************************/
227
228#define EXT4_BLOCK_GROUP_INODE_UNINIT 0x0001 /* Inode table/bitmap not in use */
229#define EXT4_BLOCK_GROUP_BLOCK_UNINIT 0x0002 /* Block bitmap not in use */
230#define EXT4_BLOCK_GROUP_INODE_ZEROED 0x0004 /* On-disk itable initialized to zero */
231
232/*
233 * Structure of a blocks group descriptor
234 */
235typedef struct ext4_block_group {
236 uint32_t block_bitmap_lo; // Blocks bitmap block
237 uint32_t inode_bitmap_lo; // Inodes bitmap block
238 uint32_t inode_table_first_block_lo; // Inodes table block
239 uint16_t free_blocks_count_lo; // Free blocks count
240 uint16_t free_inodes_count_lo; // Free inodes count
241 uint16_t used_dirs_count_lo; // Directories count
242 uint16_t flags; // EXT4_BG_flags (INODE_UNINIT, etc)
243 uint32_t reserved[2]; // Likely block/inode bitmap checksum
244 uint16_t itable_unused_lo; // Unused inodes count
245 uint16_t checksum; // crc16(sb_uuid+group+desc)
246 /* -------------- */
247 uint32_t block_bitmap_hi; // Blocks bitmap block MSB
248 uint32_t inode_bitmap_hi; // Inodes bitmap block MSB
249 uint32_t inode_table_first_block_hi; // Inodes table block MSB
250 uint16_t free_blocks_count_hi; // Free blocks count MSB
251 uint16_t free_inodes_count_hi; // Free inodes count MSB
252 uint16_t used_dirs_count_hi; // Directories count MSB
253 uint16_t itable_unused_hi; // Unused inodes count MSB
254 uint32_t reserved2[3]; // Padding
255} ext4_block_group_t;
256
257typedef struct ext4_block_group_ref {
258 block_t *block; // Reference to a block containing this block group descr
259 ext4_block_group_t *block_group;
260 ext4_filesystem_t *fs;
261 uint32_t index;
262 bool dirty;
263} ext4_block_group_ref_t;
264
265
266#define EXT4_MIN_BLOCK_GROUP_DESCRIPTOR_SIZE 32
267#define EXT4_MAX_BLOCK_GROUP_DESCRIPTOR_SIZE 64
268
269/*****************************************************************************/
270
271
272#define EXT4_MIN_BLOCK_SIZE 1024 //1 KiB
273#define EXT4_MAX_BLOCK_SIZE 65536 //64 KiB
274#define EXT4_REV0_INODE_SIZE 128
275
276#define EXT4_INODE_BLOCK_SIZE 512
277
278#define EXT4_INODE_DIRECT_BLOCK_COUNT 12
279#define EXT4_INODE_INDIRECT_BLOCK EXT4_INODE_DIRECT_BLOCK_COUNT
280#define EXT4_INODE_DOUBLE_INDIRECT_BLOCK (EXT4_INODE_INDIRECT_BLOCK + 1)
281#define EXT4_INODE_TRIPPLE_INDIRECT_BLOCK (EXT4_INODE_DOUBLE_INDIRECT_BLOCK + 1)
282#define EXT4_INODE_BLOCKS (EXT4_INODE_TRIPPLE_INDIRECT_BLOCK + 1)
283#define EXT4_INODE_INDIRECT_BLOCK_COUNT (EXT4_INODE_BLOCKS - EXT4_INODE_DIRECT_BLOCK_COUNT)
284
285/*
286 * Structure of an inode on the disk
287 */
288typedef struct ext4_inode {
289 uint16_t mode; // File mode
290 uint16_t uid; // Low 16 bits of owner uid
291 uint32_t size_lo; // Size in bytes
292 uint32_t access_time; // Access time
293 uint32_t change_inode_time; // Inode change time
294 uint32_t modification_time; // Modification time
295 uint32_t deletion_time; // Deletion time
296 uint16_t gid; // Low 16 bits of group id
297 uint16_t links_count; // Links count
298 uint32_t blocks_count_lo; // Blocks count
299 uint32_t flags; // File flags
300 uint32_t unused_osd1; // OS dependent - not used in HelenOS
301 uint32_t blocks[EXT4_INODE_BLOCKS]; // Pointers to blocks
302 uint32_t generation; // File version (for NFS)
303 uint32_t file_acl_lo; // File ACL
304 uint32_t size_hi;
305 uint32_t obso_faddr; // Obsoleted fragment address
306 union {
307 struct {
308 uint16_t blocks_high; /* were l_i_reserved1 */
309 uint16_t file_acl_high;
310 uint16_t uid_high; /* these 2 fields */
311 uint16_t gid_high; /* were reserved2[0] */
312 uint32_t reserved2;
313 } linux2;
314 struct {
315 uint16_t reserved1; /* Obsoleted fragment number/size which are removed in ext4 */
316 uint16_t mode_high;
317 uint16_t uid_high;
318 uint16_t gid_high;
319 uint32_t author;
320 } hurd2;
321 } __attribute__ ((packed)) osd2;
322
323 uint16_t extra_isize;
324 uint16_t pad1;
325 uint32_t ctime_extra; // Extra change time (nsec << 2 | epoch)
326 uint32_t mtime_extra; // Extra Modification time (nsec << 2 | epoch)
327 uint32_t atime_extra; // Extra Access time (nsec << 2 | epoch)
328 uint32_t crtime; // File creation time
329 uint32_t crtime_extra; // Extra file creation time (nsec << 2 | epoch)
330 uint32_t version_hi; // High 32 bits for 64-bit version
331} __attribute__ ((packed)) ext4_inode_t;
332
333#define EXT4_INODE_MODE_FIFO 0x1000
334#define EXT4_INODE_MODE_CHARDEV 0x2000
335#define EXT4_INODE_MODE_DIRECTORY 0x4000
336#define EXT4_INODE_MODE_BLOCKDEV 0x6000
337#define EXT4_INODE_MODE_FILE 0x8000
338#define EXT4_INODE_MODE_SOFTLINK 0xA000
339#define EXT4_INODE_MODE_SOCKET 0xC000
340#define EXT4_INODE_MODE_TYPE_MASK 0xF000
341
342/*
343 * Inode flags
344 */
345#define EXT4_INODE_FLAG_SECRM 0x00000001 // Secure deletion
346#define EXT4_INODE_FLAG_UNRM 0x00000002 // Undelete
347#define EXT4_INODE_FLAG_COMPR 0x00000004 // Compress file
348#define EXT4_INODE_FLAG_SYNC 0x00000008 // Synchronous updates
349#define EXT4_INODE_FLAG_IMMUTABLE 0x00000010 // Immutable file
350#define EXT4_INODE_FLAG_APPEND 0x00000020 // writes to file may only append
351#define EXT4_INODE_FLAG_NODUMP 0x00000040 // do not dump file
352#define EXT4_INODE_FLAG_NOATIME 0x00000080 // do not update atime
353/* Compression flags */
354#define EXT4_INODE_FLAG_DIRTY 0x00000100
355#define EXT4_INODE_FLAG_COMPRBLK 0x00000200 // One or more compressed clusters
356#define EXT4_INODE_FLAG_NOCOMPR 0x00000400 // Don't compress
357#define EXT4_INODE_FLAG_ECOMPR 0x00000800 // Compression error
358/* End compression flags --- maybe not all used */
359#define EXT4_INODE_FLAG_INDEX 0x00001000 // hash-indexed directory
360#define EXT4_INODE_FLAG_IMAGIC 0x00002000 // AFS directory */
361#define EXT4_INODE_FLAG_JOURNAL_DATA 0x00004000 // File data should be journaled
362#define EXT4_INODE_FLAG_NOTAIL 0x00008000 // File tail should not be merged
363#define EXT4_INODE_FLAG_DIRSYNC 0x00010000 // Dirsync behaviour (directories only)
364#define EXT4_INODE_FLAG_TOPDIR 0x00020000 // Top of directory hierarchies
365#define EXT4_INODE_FLAG_HUGE_FILE 0x00040000 // Set to each huge file
366#define EXT4_INODE_FLAG_EXTENTS 0x00080000 // Inode uses extents
367#define EXT4_INODE_FLAG_EA_INODE 0x00200000 // Inode used for large EA
368#define EXT4_INODE_FLAG_EOFBLOCKS 0x00400000 // Blocks allocated beyond EOF
369#define EXT4_INODE_FLAG_RESERVED 0x80000000 // reserved for ext4 lib
370
371#define EXT4_INODE_ROOT_INDEX 2
372
373typedef struct ext4_inode_ref {
374 block_t *block; // Reference to a block containing this inode
375 ext4_inode_t *inode;
376 ext4_filesystem_t *fs;
377 uint32_t index; // Index number of this inode
378 bool dirty;
379} ext4_inode_ref_t;
380
381/*****************************************************************************/
382
383#define EXT4_DIRECTORY_FILENAME_LEN 255
384
385#define EXT4_DIRECTORY_FILETYPE_UNKNOWN 0
386#define EXT4_DIRECTORY_FILETYPE_REG_FILE 1
387#define EXT4_DIRECTORY_FILETYPE_DIR 2
388#define EXT4_DIRECTORY_FILETYPE_CHRDEV 3
389#define EXT4_DIRECTORY_FILETYPE_BLKDEV 4
390#define EXT4_DIRECTORY_FILETYPE_FIFO 5
391#define EXT4_DIRECTORY_FILETYPE_SOCK 6
392#define EXT4_DIRECTORY_FILETYPE_SYMLINK 7
393
394/**
395 * Linked list directory entry structure
396 */
397typedef struct ext4_directory_entry_ll {
398 uint32_t inode; // Inode for the entry
399 uint16_t entry_length; // Distance to the next directory entry
400 uint8_t name_length; // Lower 8 bits of name length
401 union {
402 uint8_t name_length_high; // Higher 8 bits of name length
403 uint8_t inode_type; // Type of referenced inode (in rev >= 0.5)
404 } __attribute__ ((packed));
405 uint8_t name[EXT4_DIRECTORY_FILENAME_LEN]; // Entry name
406} __attribute__ ((packed)) ext4_directory_entry_ll_t;
407
408typedef struct ext4_directory_iterator {
409 ext4_inode_ref_t *inode_ref;
410 block_t *current_block;
411 aoff64_t current_offset;
412 ext4_directory_entry_ll_t *current;
413} ext4_directory_iterator_t;
414
415typedef struct ext4_directory_search_result {
416 block_t *block;
417 ext4_directory_entry_ll_t *dentry;
418} ext4_directory_search_result_t;
419
420
421/*****************************************************************************/
422
423/* Structures for indexed directory */
424
425typedef struct ext4_directory_dx_countlimit {
426 uint16_t limit;
427 uint16_t count;
428} ext4_directory_dx_countlimit_t;
429
430typedef struct ext4_directory_dx_dot_entry {
431 uint32_t inode;
432 uint16_t entry_length;
433 uint8_t name_length;
434 uint8_t inode_type;
435 uint8_t name[4];
436} ext4_directory_dx_dot_entry_t;
437
438typedef struct ext4_directory_dx_root_info {
439 uint32_t reserved_zero;
440 uint8_t hash_version;
441 uint8_t info_length;
442 uint8_t indirect_levels;
443 uint8_t unused_flags;
444} ext4_directory_dx_root_info_t;
445
446typedef struct ext4_directory_dx_entry {
447 uint32_t hash;
448 uint32_t block;
449} ext4_directory_dx_entry_t;
450
451typedef struct ext4_directory_dx_root {
452 ext4_directory_dx_dot_entry_t dots[2];
453 ext4_directory_dx_root_info_t info;
454 ext4_directory_dx_entry_t entries[0];
455} ext4_directory_dx_root_t;
456
457typedef struct ext4_fake_directory_entry {
458 uint32_t inode;
459 uint16_t entry_length;
460 uint8_t name_length;
461 uint8_t inode_type;
462} ext4_fake_directory_entry_t;
463
464typedef struct ext4_directory_dx_node {
465 ext4_fake_directory_entry_t fake;
466 ext4_directory_dx_entry_t entries[0];
467} ext4_directory_dx_node_t;
468
469
470typedef struct ext4_directory_dx_block {
471 block_t *block;
472 ext4_directory_dx_entry_t *entries;
473 ext4_directory_dx_entry_t *position;
474} ext4_directory_dx_block_t;
475
476
477
478#define EXT4_ERR_BAD_DX_DIR (-75000)
479#define EXT4_DIRECTORY_HTREE_EOF (uint32_t)0x7fffffff
480
481/*****************************************************************************/
482
483/*
484 * This is the extent on-disk structure.
485 * It's used at the bottom of the tree.
486 */
487typedef struct ext4_extent {
488 uint32_t first_block; // First logical block extent covers
489 uint16_t block_count; // Number of blocks covered by extent
490 uint16_t start_hi; // High 16 bits of physical block
491 uint32_t start_lo; // Low 32 bits of physical block
492} ext4_extent_t;
493
494/*
495 * This is index on-disk structure.
496 * It's used at all the levels except the bottom.
497 */
498typedef struct ext4_extent_index {
499 uint32_t first_block; // Index covers logical blocks from 'block'
500 uint32_t leaf_lo; /* Pointer to the physical block of the next
501 * level. leaf or next index could be there */
502 uint16_t leaf_hi; /* high 16 bits of physical block */
503 uint16_t padding;
504} ext4_extent_index_t;
505
506/*
507 * Each block (leaves and indexes), even inode-stored has header.
508 */
509typedef struct ext4_extent_header {
510 uint16_t magic;
511 uint16_t entries_count; // Number of valid entries
512 uint16_t max_entries_count; // Capacity of store in entries
513 uint16_t depth; // Has tree real underlying blocks?
514 uint32_t generation; // generation of the tree
515} ext4_extent_header_t;
516
517typedef struct ext4_extent_path {
518 block_t *block;
519 uint16_t depth;
520 ext4_extent_header_t *header;
521 ext4_extent_index_t *index;
522 ext4_extent_t *extent;
523} ext4_extent_path_t;
524
525#define EXT4_EXTENT_MAGIC 0xF30A
526#define EXT4_EXTENT_FIRST(header) \
527 ((ext4_extent_t *) (((void *) (header)) + sizeof(ext4_extent_header_t)))
528#define EXT4_EXTENT_FIRST_INDEX(header) \
529 ((ext4_extent_index_t *) (((void *) (header)) + sizeof(ext4_extent_header_t)))
530
531/*****************************************************************************/
532
533#define EXT4_HASH_VERSION_LEGACY 0
534#define EXT4_HASH_VERSION_HALF_MD4 1
535#define EXT4_HASH_VERSION_TEA 2
536#define EXT4_HASH_VERSION_LEGACY_UNSIGNED 3
537#define EXT4_HASH_VERSION_HALF_MD4_UNSIGNED 4
538#define EXT4_HASH_VERSION_TEA_UNSIGNED 5
539
540typedef struct ext4_hash_info {
541 uint32_t hash;
542 uint32_t minor_hash;
543 uint32_t hash_version;
544 const uint32_t *seed;
545} ext4_hash_info_t;
546
547#endif
548
549/**
550 * @}
551 */
Note: See TracBrowser for help on using the repository browser.