source: mainline/uspace/lib/ext4/libext4_types.h@ 3169f3b0

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

syntax error fix

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