Skip to content

Ext2

struct ext2_sblock (39 fields) source
§ uint32_t inodes_count
§ uint32_t blocks_count
§ uint32_t r_blocks_count
§ uint32_t free_blocks_count
§ uint32_t free_inodes_count
§ uint32_t first_data_block
§ uint32_t log_block_size
§ uint32_t log_frag_size
§ uint32_t blocks_per_group
§ uint32_t frags_per_group
§ uint32_t inodes_per_group
§ uint32_t mtime
§ uint32_t wtime
§ uint16_t mnt_count
§ uint16_t max_mnt_count
§ uint16_t magic
§ uint16_t state
§ uint16_t errors
§ uint16_t minor_rev_level
§ uint32_t lastcheck
§ uint32_t checkinterval
§ uint32_t creator_os
§ uint32_t rev_level
§ uint16_t def_resuid
§ uint16_t def_resgid
§ uint32_t first_ino
§ uint16_t inode_size
§ uint16_t block_group_nr
§ uint32_t feature_compat
§ uint32_t feature_incompat
§ uint32_t feature_ro_compat
§ uint8_t uuid[16]
§ char volume_name[16]
§ char last_mounted[64]
§ uint32_t algorithm_usage_bitmap
§ uint8_t prealloc_blocks
§ uint8_t prealloc_dir_blocks
§ uint16_t padding
§ union
§ struct
§ uint32_t journal_uuid[4]
§ uint32_t journal_inum
§ uint32_t journal_dev
§ uint32_t last_orphan
§ uint32_t hash_seed[4]
§ uint8_t def_hash_version
§ uint8_t journal_backup_type
§ uint16_t desc_size
§ uint32_t default_mount_opts
§ uint32_t first_meta_bg
§ uint32_t mkfs_time
§ uint32_t journal_blocks[17]
§ uint32_t quota_group_inode

[4] → offset 0x258

§ uint32_t quota_project_inode

[5] → offset 0x25C

§ uint32_t reserved[204]
struct ext2_group_desc (8 fields) source
§ uint32_t block_bitmap
§ uint32_t inode_bitmap
§ uint32_t inode_table
§ uint16_t free_blocks_count
§ uint16_t free_inodes_count
§ uint16_t used_dirs_count
§ uint16_t pad
§ uint32_t reserved[3]
struct ext2_inode (19 fields) source
§ mode_t mode
§ uint16_t uid
§ uint32_t size
§ uint32_t atime
§ uint32_t ctime
§ uint32_t mtime
§ uint32_t dtime
§ uint16_t gid
§ uint32_t blocks
§ uint32_t flags
§ uint32_t osd1
§ uint32_t block[EXT2_NBLOCKS]
§ uint32_t generation
§ uint32_t file_acl
§ uint32_t dir_acl
§ uint32_t faddr
§ uint8_t frag[16]
§ uint8_t osd2[12]
struct ext2_full_inode (3 fields) source
§ struct ext2_inode node
§ inode_t inode_num
§ struct bcache_entry *ent
struct ext2_dir_entry (5 fields) source
§ inode_t inode
§ uint16_t rec_len
§ uint8_t name_len
§ uint8_t file_type
§ char name[EXT2_NAME_LEN + 1]
struct ext2_fs (14 fields) source
§ struct partition *partition
§ struct block_device *drive
§ struct ext2_sblock *sblock
§ struct ext2_group_desc *group_desc
§ struct bcache_entry *sbcache_ent
§ struct bcache_entry *gdesc_cache_ent
§ uint32_t num_groups
§ uint32_t inodes_count
§ uint32_t inodes_per_group
§ uint32_t blocks_per_group
§ uint32_t block_size
§ uint32_t sectors_per_block
§ uint16_t inode_size
§ struct spinlock lock

lock the fs struct

enum ext2_errno (2 variants) source
§ EXT2_ERR_FS_INVALID = ERR_DELTA_START
§ EXT2_ERR_NO_INODE
typedef bool (*dir_entry_callback)(
    struct ext2_fs * fs,
    struct ext2_dir_entry * entry,
    void * ctx,
    uint32_t block_num,
    uint32_t entry_num,
    uint32_t entry_offset
)
source
typedef void (*ext2_block_visitor)(
    struct ext2_fs * fs,
    struct ext2_inode * inode,
    uint32_t depth,
    uint32_t * block_ptr,
    void * user_data
)
source
uint8_t * ext2_block_read(
    struct ext2_fs *fs,
    uint32_t block_num,
    struct bcache_entry **out
)
source
bool ext2_block_write(
    struct ext2_fs *fs,
    struct bcache_entry *ent,
    enum bio_request_priority prio
)
source
bool ext2_read_superblock(
    struct partition * *,
    struct ext2_sblock *sblock
)
source
bool ext2_write_superblock(struct ext2_fs *fs)
source
bool ext2_write_group_desc(struct ext2_fs *fs)
source
enum err ext2_mount(
    struct partition * *,
    struct ext2_fs *fs,
    struct ext2_sblock *sblock,
    struct vfs_node *out_node
)
source
struct vfs_node * ext2_g_mount(struct partition * *)
source
struct ext2_inode * ext2_inode_read(
    struct ext2_fs *fs,
    inode_t inode_idx,
    struct bcache_entry **out_ent
)
source
bool ext2_inode_write(
    struct ext2_fs *fs,
    inode_t inode_num,
    const struct ext2_inode *inode
)
source
uint32_t ext2_get_or_set_block(
    struct ext2_fs *fs,
    struct ext2_inode *inode,
    uint32_t block_index,
    uint32_t new_block_num,
    bool allocate,
    bool *was_allocated
)
source
uint32_t ext2_block_to_lba(struct ext2_fs *fs, uint32_t block_num)
source
bool ext2_dirent_valid(struct ext2_dir_entry *entry)
source
void ext2_init_inode(struct ext2_inode *new_inode, mode_t mode)
source
void ext2_init_dirent(
    struct ext2_fs *fs,
    struct ext2_dir_entry *new_entry,
    inode_t inode_num,
    const char *name,
    uint8_t type
)
source
uint8_t ext2_extract_ftype(mode_t mode)
source
bool ext2_walk_dir(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir,
    dir_entry_callback cb,
    void *ctx
)
source
void ext2_dealloc_inode(struct ext2_full_inode *ino)
source
uint32_t ext2_get_block_group(struct ext2_fs *fs, uint32_t block)
source
uint32_t ext2_get_inode_group(struct ext2_fs *fs, inode_t inode)
source
enum irql ext2_fs_lock(struct ext2_fs *fs)
source
void ext2_fs_unlock(struct ext2_fs *fs, enum irql i)
source
void ext2_prefetch_block(struct ext2_fs *fs, uint32_t block)
source
void ext2_inode_lock(struct ext2_full_inode *ino)
source
void ext2_inode_unlock(struct ext2_full_inode *ino)
source
uint8_t * ext2_create_bcache_ent(
    struct ext2_fs *fs,
    uint32_t block,
    struct bcache_entry **out
)
source
enum err ext2_link_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir_inode,
    struct ext2_full_inode *inode,
    const char *name,
    uint8_t type,
    bool increment_links
)
source
enum err ext2_unlink_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir_inode,
    const char *name,
    bool free_blocks,
    bool decrement_links
)
source
enum err ext2_create_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *parent_dir,
    const char *name,
    mode_t mode,
    bool increment_links
)
source
enum err ext2_symlink_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir_inode,
    const char *name,
    const char *target
)
source
enum err ext2_write_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *inode,
    uint32_t offset,
    const uint8_t *src,
    uint32_t size
)
source
enum err ext2_read_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *inode,
    uint32_t offset,
    uint8_t *buffer,
    uint64_t length
)
source
enum err ext2_truncate_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *inode,
    uint32_t new_size
)
source
enum err ext2_chmod(
    struct ext2_fs *fs,
    struct ext2_full_inode *node,
    mode_t new_mode
)
source
enum err ext2_chown(
    struct ext2_fs *fs,
    struct ext2_full_inode *node,
    uid_t new_uid,
    gid_t new_gid
)
source
enum err ext2_readlink(
    struct ext2_fs *fs,
    struct ext2_full_inode *node,
    char *buf,
    uint64_t size
)
source
struct ext2_full_inode * ext2_find_file_in_dir(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir_inode,
    const char *fname,
    uint8_t *type_out
)
source
bool ext2_dir_contains_file(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir_inode,
    const char *fname
)
source
enum err ext2_mkdir(
    struct ext2_fs *fs,
    struct ext2_full_inode *parent_dir,
    const char *name,
    mode_t mode
)
source
enum err ext2_rmdir(
    struct ext2_fs *fs,
    struct ext2_full_inode *parent_dir,
    const char *name
)
source
enum err ext2_readdir(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir_inode,
    struct ext2_dir_entry *out,
    uint32_t entry_offset
)
source
uint32_t ext2_alloc_block(struct ext2_fs *fs)
source
bool ext2_free_block(struct ext2_fs *fs, uint32_t block_num)
source
inode_t ext2_alloc_inode(struct ext2_fs *fs)
source
bool ext2_free_inode(struct ext2_fs *fs, inode_t inode_num)
source
bool ext2_find_first_available(
    struct ext2_fs *fs,
    struct ext2_full_inode *dir,
    uint32_t *new_block
)
source
void ext2_traverse_inode_blocks(
    struct ext2_fs *fs,
    struct ext2_inode *inode,
    ext2_block_visitor visitor,
    void *user_data,
    bool readahead
)
source
void ext2_g_print(struct partition * *)
source
void ext2_dump_file_data(
    struct ext2_fs *fs,
    const struct ext2_inode *inode,
    uint32_t start_block_index,
    uint32_t length
)
source
extern uint64_t PTRS_PER_BLOCK
source
TODO

move this flaming disaster into internal.h, and also, this file is going to all get modified BIG TIME when we get actual page cache stuff.

If you are reading this for the sake of education, DON’T!

#define EXT2_PRIO_DIRENT BIO_RQ_MEDIUM
source
#define EXT2_PRIO_INODE BIO_RQ_MEDIUM
source
#define EXT2_PRIO_DATA BIO_RQ_HIGH
source
#define EXT2_PRIO_BITMAPS BIO_RQ_BACKGROUND
source
#define EXT2_PRIO_SBLOCK BIO_RQ_LOW
source
#define EXT2_NBLOCKS 15
source
#define EXT2_SUPERBLOCK_OFFSET 1024
source
#define EXT2_SIGNATURE_OFFSET 0x38
source
#define EXT2_SIGNATURE 0xEF53
source
#define EXT2_NAME_LEN 255
source
#define EXT2_ROOT_INODE 2
source
#define EXT2_S_IFSOCK 0xC000
source

socket

#define EXT2_S_IFLNK 0xA000
source

symbolic link

#define EXT2_S_IFREG 0x8000
source

regular file

#define EXT2_S_IFBLK 0x6000
source

block device

#define EXT2_S_IFDIR 0x4000
source

directory

#define EXT2_S_IFCHR 0x2000
source

character device

#define EXT2_S_IFIFO 0x1000
source

FIFO

#define EXT2_S_IFMT 0xF000
source

mask to extract file type from i_mode

#define EXT2_S_PERMS 0x0FFF
source

lower 12 bits: special + rwx bits

#define EXT2_S_IRWXU 0x01C0
source

owner permissions - ALL

#define EXT2_S_IRWXG 0x0038
source

group permissions - ALL

#define EXT2_S_IRWXO 0x0007
source

others permissions - ALL

#define EXT2_S_PERMS_ONLY 0x01FF
source

rwx bits only

#define EXT2_S_IRUSR 0x0100
source

Owner can read

#define EXT2_S_IWUSR 0x0080
source

Owner can write

#define EXT2_S_IXUSR 0x0040
source

Owner can execute

#define EXT2_S_IRGRP 0x0020
source

Group can read

#define EXT2_S_IWGRP 0x0010
source

Group can write

#define EXT2_S_IXGRP 0x0008
source

Group can execute

#define EXT2_S_IROTH 0x0004
source

Others can read

#define EXT2_S_IWOTH 0x0002
source

Others can write

#define EXT2_S_IXOTH 0x0001
source

Others can execute

#define EXT2_FT_UNKNOWN 0
source

Unknown file type

#define EXT2_FT_REG_FILE 1
source

Regular file

#define EXT2_FT_DIR 2
source

Directory

#define EXT2_FT_CHRDEV 3
source

Character device

#define EXT2_FT_BLKDEV 4
source

Block device

#define EXT2_FT_FIFO 5
source
FIFO (named pipe)
#define EXT2_FT_SOCK 6
source

Unix domain socket

#define EXT2_FT_SYMLINK 7
source

Symbolic link

#define EXT2_FT_MAX 8
source

Number of defined file types

#define EXT2_SECRM_FL 0x00000001
source

ext2 inode flags

Secure deletion

#define EXT2_UNRM_FL 0x00000002
source

Undelete

#define EXT2_COMPR_FL 0x00000004
source

Compress file

#define EXT2_SYNC_FL 0x00000008
source

Synchronous updates

#define EXT2_IMMUTABLE_FL 0x00000010
source

Immutable file

#define EXT2_APPEND_FL 0x00000020
source

Writes only append

#define EXT2_NODUMP_FL 0x00000040
source

Don’t include in backups

#define EXT2_NOATIME_FL 0x00000080
source

Don’t update access time

#define EXT2_DIRTY_FL 0x00000100
source
Dirty (compress support)
#define EXT2_COMPRBLK_FL 0x00000200
source

One or more compressed clusters

#define EXT2_NOCOMPR_FL 0x00000400
source

Don’t compress

#define EXT2_ECOMPR_FL 0x00000800
source

Compression error

#define EXT2_IMAGIC_FL 0x00002000
source

AFS directory

#define EXT2_JOURNAL_DATA_FL 0x00004000
source

Write data to journal (data=journal)

#define EXT2_NOTAIL_FL 0x00008000
source

File tail not merged (reiserfs)

#define EXT2_DIRSYNC_FL 0x00010000
source

Directory sync updates

#define EXT2_TOPDIR_FL 0x00020000
source

Top of directory hierarchy

#define EXT2_HUGE_FILE_FL 0x00040000
source

Set to each huge file

#define EXT2_EXTENTS_FL 0x00080000
source

Inode uses extents

#define EXT2_EA_INODE_FL 0x00200000
source

Inode stores extended attributes

#define EXT2_INLINE_DATA_FL 0x10000000
source

Data is stored inline in inode

#define EXT2_PROJINHERIT_FL 0x20000000
source

Project ID inheritance

#define EXT2_RESERVED_FL 0x80000000
source

Reserved for ext3/4

Useful masks

#define EXT2_FL_USER_VISIBLE 0x000BDFFF
source

User-visible flags

#define EXT2_FL_USER_MODIFIABLE
source
#define MAKE_NOP_CALLBACK
source
Expansion
#define MAKE_NOP_CALLBACK \
    static cc_unused bool nop_callback( \
        struct ext2_fs *fs, struct ext2_dir_entry *entry, void *ctx_ptr, \
        uint32_t block_num, uint32_t entry_num, uint32_t entry_offset) { \
        cc_ignore(fs, entry_offset, entry, ctx_ptr, block_num, entry_num); \
        return false; \
    }