miniOS
x86_64 hobby kernel with SMP, VFS, and POSIX process model
Loading...
Searching...
No Matches
ext2.h
Go to the documentation of this file.
1// MIT License
2//
3// Copyright (c) 2026 Christian Spoo
4//
5// Permission is hereby granted, free of charge, to any person obtaining a copy
6// of this software and associated documentation files (the "Software"), to deal
7// in the Software without restriction, including without limitation the rights
8// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9// copies of the Software, and to permit persons to whom the Software is
10// furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in all
13// copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20// OUT of OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21// SOFTWARE.
22
23#ifndef _MINIOS_FS_EXT2_H_
24#define _MINIOS_FS_EXT2_H_
25
26#include <miniOS/types.h>
27#include <miniOS/fs/fs_types.h>
28
30
31/* -----------------------------------------------------------------------
32 * ext2 on-disk constants
33 * ---------------------------------------------------------------------- */
34#define EXT2_MAGIC 0xEF53
35#define EXT2_ROOT_INO 2
36
37/* Inode mode type bits */
38#define EXT2_S_IFREG 0x8000 /* regular file */
39#define EXT2_S_IFDIR 0x4000 /* directory */
40#define EXT2_S_IFLNK 0xA000 /* symbolic link */
41#define EXT2_S_IFCHR 0x2000 /* character device */
42#define EXT2_S_IFBLK 0x6000 /* block device */
43
44/* Directory entry file_type values */
45#define EXT2_FT_UNKNOWN 0
46#define EXT2_FT_REG_FILE 1
47#define EXT2_FT_DIR 2
48#define EXT2_FT_CHRDEV 3
49#define EXT2_FT_BLKDEV 4
50#define EXT2_FT_SYMLINK 7
51
52/* -----------------------------------------------------------------------
53 * On-disk structures (all little-endian; packed to match disk layout)
54 * ---------------------------------------------------------------------- */
55
56/* ext2 superblock — located at byte offset 1024 from partition start
57 * (block 1 when block_size == 1024) */
58typedef struct {
64 uint32_t s_first_data_block; /* 1 for 1024-byte blocks, 0 for 2048+ */
65 uint32_t s_log_block_size; /* block_size = 1024 << s_log_block_size */
74 uint16_t s_magic; /* 0xEF53 */
81 uint32_t s_rev_level; /* 0 = original, 1 = dynamic */
84 /* EXT2_DYNAMIC_REV fields (only valid if s_rev_level >= 1) */
95 /* pad to 1024 bytes */
97} __attribute__((packed)) ext2_superblock_t;
98
99/* Block Group Descriptor — 32 bytes each, in a table at block 2
100 * (for 1024-byte blocks) */
101typedef struct {
110} __attribute__((packed)) ext2_bgd_t;
111
112/* Inode — 128 bytes (rev 0) or s_inode_size bytes (rev 1) */
113typedef struct {
114 uint16_t i_mode; /* file type + permissions */
116 uint32_t i_size; /* file size in bytes */
123 uint32_t i_blocks; /* count in 512-byte units */
126 uint32_t i_block[15]; /* 0-11: direct, 12: indirect, 13: dbl-indirect, 14: triple */
132} __attribute__((packed)) ext2_inode_t;
133
134/* Directory entry — variable length */
135typedef struct {
139 uint8_t file_type; /* 0=unknown, 1=reg, 2=dir, 7=symlink */
140 char name[]; /* NOT null-terminated; length = name_len */
141} __attribute__((packed)) ext2_dirent_t;
142
143/* -----------------------------------------------------------------------
144 * Public API
145 * ---------------------------------------------------------------------- */
146
160int ext2_mount(uint64_t part_lba_start, uint64_t part_lba_end);
161
177int ext2_lookup(const char *path, vfs_inode_info_t *out);
178
196int ext2_read_file(uint32_t ino, uint64_t off, void *buf, uint32_t len);
197
215int ext2_readdir(uint32_t dir_ino, uint64_t *offset, vfs_dirent_cb_t cb, void *ud);
216
230int ext2_write_file(uint32_t ino, uint64_t off, const void *buf, uint32_t len);
231
246int ext2_create(uint32_t parent_ino, const char *name, uint16_t mode, uint32_t *out_ino);
247
260
272int ext2_truncate_inode(uint32_t ino, uint64_t new_size);
273
281int ext2_readlink(uint32_t ino, char *buf, uint32_t len);
282
290int ext2_symlink(uint32_t parent_ino, const char *name, const char *target);
291
302int ext2_mknod(uint32_t parent_ino, const char *name, uint16_t mode,
303 uint32_t dev, uint32_t *out_ino);
304
319int ext2_mkdir(uint32_t parent_ino, const char *name, uint32_t *out_ino);
320
332int ext2_rmdir(uint32_t parent_ino, const char *name);
333
334/* -----------------------------------------------------------------------
335 * Filesystem type registry integration
336 * ---------------------------------------------------------------------- */
337
346void ext2_init(void);
347
348#endif /* _MINIOS_FS_EXT2_H_ */
int ext2_mkdir(uint32_t parent_ino, const char *name, uint32_t *out_ino)
Definition ext2.c:1369
int ext2_write_file(uint32_t ino, uint64_t off, const void *buf, uint32_t len)
Definition ext2.c:1184
struct vfs_inode_info vfs_inode_info_t
Definition ext2.h:29
void ext2_init(void)
Definition ext2.c:2004
int ext2_lookup(const char *path, vfs_inode_info_t *out)
Definition ext2.c:733
int ext2_mknod(uint32_t parent_ino, const char *name, uint16_t mode, uint32_t dev, uint32_t *out_ino)
Definition ext2.c:1820
int ext2_create(uint32_t parent_ino, const char *name, uint16_t mode, uint32_t *out_ino)
Definition ext2.c:882
int ext2_mount(uint64_t part_lba_start, uint64_t part_lba_end)
Definition ext2.c:498
int ext2_readdir(uint32_t dir_ino, uint64_t *offset, vfs_dirent_cb_t cb, void *ud)
Definition ext2.c:556
int ext2_flush_inode(uint32_t ino)
Definition ext2.c:1341
int ext2_readlink(uint32_t ino, char *buf, uint32_t len)
Definition ext2.c:1019
int ext2_rmdir(uint32_t parent_ino, const char *name)
Definition ext2.c:1532
int ext2_symlink(uint32_t parent_ino, const char *name, const char *target)
Definition ext2.c:1060
int ext2_truncate_inode(uint32_t ino, uint64_t new_size)
Definition ext2.c:225
int ext2_read_file(uint32_t ino, uint64_t off, void *buf, uint32_t len)
Definition ext2.c:809
int(* vfs_dirent_cb_t)(const char *name, uint8_t name_len, uint32_t inode, uint8_t file_type, void *ud)
Definition fs_types.h:29
struct idt_entry_t * offset
Definition irq.h:1
uint16_t s_max_mnt_count
Definition ext2.h:73
uint8_t s_volume_name[16]
Definition ext2.h:92
uint16_t name[36]
Definition gpt.h:65
uint32_t s_algo_bitmap
Definition ext2.h:94
uint32_t bg_inode_bitmap
Definition ext2.h:103
uint32_t s_feature_incompat
Definition ext2.h:89
uint32_t s_log_block_size
Definition ext2.h:65
uint32_t s_wtime
Definition ext2.h:71
uint32_t i_osd1
Definition ext2.h:125
uint8_t i_osd2[12]
Definition ext2.h:131
uint16_t s_state
Definition ext2.h:75
uint16_t s_minor_rev_level
Definition ext2.h:77
uint32_t i_blocks
Definition ext2.h:123
uint16_t s_mnt_count
Definition ext2.h:72
uint32_t s_mtime
Definition ext2.h:70
uint32_t bg_block_bitmap
Definition ext2.h:102
uint32_t s_blocks_per_group
Definition ext2.h:67
uint16_t bg_pad
Definition ext2.h:108
uint8_t s_padding[820]
Definition ext2.h:96
uint32_t i_flags
Definition ext2.h:124
uint32_t i_dtime
Definition ext2.h:120
uint32_t inode
Definition ext2.h:136
uint8_t s_last_mounted[64]
Definition ext2.h:93
uint32_t i_faddr
Definition ext2.h:130
uint32_t s_feature_compat
Definition ext2.h:88
uint16_t s_magic
Definition ext2.h:74
uint32_t s_log_frag_size
Definition ext2.h:66
uint16_t i_gid
Definition ext2.h:121
uint32_t s_feature_ro_compat
Definition ext2.h:90
uint16_t bg_used_dirs_count
Definition ext2.h:107
uint16_t s_inode_size
Definition ext2.h:86
uint16_t i_uid
Definition ext2.h:115
uint16_t s_block_group_nr
Definition ext2.h:87
uint32_t s_creator_os
Definition ext2.h:80
uint32_t s_first_data_block
Definition ext2.h:64
uint32_t i_dir_acl
Definition ext2.h:129
uint32_t s_frags_per_group
Definition ext2.h:68
uint16_t bg_free_blocks_count
Definition ext2.h:105
uint32_t i_block[15]
Definition ext2.h:126
uint16_t i_links_count
Definition ext2.h:122
uint32_t s_inodes_per_group
Definition ext2.h:69
uint32_t i_size
Definition ext2.h:116
uint32_t s_blocks_count
Definition ext2.h:60
uint16_t s_def_resgid
Definition ext2.h:83
uint32_t s_r_blocks_count
Definition ext2.h:61
uint32_t s_free_inodes_count
Definition ext2.h:63
uint16_t i_mode
Definition ext2.h:114
uint32_t bg_inode_table
Definition ext2.h:104
uint16_t s_def_resuid
Definition ext2.h:82
uint32_t s_inodes_count
Definition ext2.h:59
uint8_t bg_reserved[12]
Definition ext2.h:109
uint16_t rec_len
Definition ext2.h:137
uint32_t s_rev_level
Definition ext2.h:81
uint32_t i_ctime
Definition ext2.h:118
uint32_t s_first_ino
Definition ext2.h:85
uint16_t bg_free_inodes_count
Definition ext2.h:106
uint32_t s_checkinterval
Definition ext2.h:79
uint8_t file_type
Definition ext2.h:139
uint8_t name_len
Definition ext2.h:138
uint16_t s_errors
Definition ext2.h:76
uint32_t i_file_acl
Definition ext2.h:128
uint32_t i_mtime
Definition ext2.h:119
uint8_t s_uuid[16]
Definition ext2.h:91
uint32_t i_atime
Definition ext2.h:117
uint32_t s_lastcheck
Definition ext2.h:78
uint32_t i_generation
Definition ext2.h:127
uint32_t s_free_blocks_count
Definition ext2.h:62
Definition vfs.h:52
unsigned short uint16_t
Definition types.h:31
unsigned int uint32_t
Definition types.h:34
unsigned long int uint64_t
Definition types.h:37
unsigned char uint8_t
Definition types.h:28
uint32_t len
Definition virtio_net.c:1
typedef __attribute__