source: mainline/uspace/lib/ext4/libext4_types.h@ 81092ce

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

fixed bug with block group flags

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