A Group Descriptor
struct ext2_group_desc
{
__u32 bg_block_bitmap;
/* Blocks bitmap block */
__u32 bg_inode_bitmap;
/* Inodes bitmap block */
__u32 bg_inode_table;
/* Inodes table block */
__u16 bg_free_blocks_count;
/* Free blocks count */
__u16 bg_free_inodes_count;
/* Free inodes count */
__u16 bg_used_dirs_count;
/* Directories count */
__u16 bg_pad;
__u32 bg_reserved[3];
};
Directory Structure
#define EXT2_NAME_LEN 255
struct ext2_dir_entry {
__u32 inode;
/* Inode number */
__u16 rec_len;
/* Directory entry length */
__u16 name_len;
/* Name length */
char name[EXT2_NAME_LEN];
/* File name */
};
/*
* The new version of the directory entry. Since EXT2 structures
are
* stored in intel byte order, and the name_len field could never
be
* bigger than 255 chars, it's safe to reclaim the extra byte
for the
* file_type field.
*/
struct ext2_dir_entry_2 {
__u32 inode;
/* Inode number */
__u16 rec_len;
/* Directory entry length */
__u8 name_len;
/* Name length */
__u8 file_type;
char name[EXT2_NAME_LEN];
/* File name */
};
Inode on Disk
/*
* Structure of an inode on the disk
*/
struct ext2_inode {
__u16 i_mode;
/* File mode */
__u16 i_uid;
/* Owner Uid */
__u32 i_size;
/* Size in bytes */
__u32 i_atime;
/* Access time */
__u32 i_ctime;
/* Creation time */
__u32 i_mtime;
/* Modification time */
__u32 i_dtime;
/* Deletion Time */
__u16 i_gid;
/* Group Id */
__u16 i_links_count;
/* Links count */
__u32 i_blocks;
/* Blocks count */
__u32 i_flags;
/* File flags */
union {
struct {
__u32 l_i_reserved1;
} linux1;
struct {
__u32 h_i_translator;
} hurd1;
struct {
__u32 m_i_reserved1;
} masix1;
} osd1;
/* OS dependent 1 */
__u32 i_block[EXT2_N_BLOCKS];/*
Pointers to blocks */
__u32 i_version;
/* File version (for NFS) */
__u32 i_file_acl;
/* File ACL */
__u32 i_dir_acl;
/* Directory ACL */
__u32 i_faddr;
/* Fragment address */
union {
struct {
__u8 l_i_frag; /*
Fragment number */
__u8 l_i_fsize; /* Fragment
size */
__u16 i_pad1;
__u32 l_i_reserved2[2];
} linux2;
struct {
__u8 h_i_frag; /*
Fragment number */
__u8 h_i_fsize; /* Fragment
size */
__u16 h_i_mode_high;
__u16 h_i_uid_high;
__u16 h_i_gid_high;
__u32 h_i_author;
} hurd2;
struct {
__u8 m_i_frag; /*
Fragment number */
__u8 m_i_fsize; /* Fragment
size */
__u16 m_pad1;
__u32 m_i_reserved2[2];
} masix2;
} osd2;
/* OS dependent 2 */
};
A Superblock
struct ext2_super_block {
__u32 s_inodes_count;
/* Inodes count */
__u32 s_blocks_count;
/* Blocks count */
__u32 s_r_blocks_count;
/* Reserved blocks count */
__u32 s_free_blocks_count;
/* Free blocks count */
__u32 s_free_inodes_count;
/* Free inodes count */
__u32 s_first_data_block;
/* First Data Block */
__u32 s_log_block_size;
/* Block size */
__s32 s_log_frag_size;
/* Fragment size */
__u32 s_blocks_per_group;
/* # Blocks per group */
__u32 s_frags_per_group;
/* # Fragments per group */
__u32 s_inodes_per_group;
/* # Inodes per group */
__u32 s_mtime;
/* Mount time */
__u32 s_wtime;
/* Write time */
__u16 s_mnt_count;
/* Mount count */
__s16 s_max_mnt_count;
/* Maximal mount count */
__u16 s_magic;
/* Magic signature */
__u16 s_state;
/* File system state */
__u16 s_errors;
/* Behaviour when detecting errors */
__u16 s_minor_rev_level;
/* minor revision level */
__u32 s_lastcheck;
/* time of last check */
__u32 s_checkinterval;
/* max. time between checks */
__u32 s_creator_os;
/* OS */
__u32 s_rev_level;
/* Revision level */
__u16 s_def_resuid;
/* Default uid for reserved blocks */
__u16 s_def_resgid;
/* Default gid for reserved blocks */
/*
* These fields are
for EXT2_DYNAMIC_REV superblocks only.
*
* Note: the difference
between the compatible feature set and
* the incompatible
feature set is that if there is a bit set
* in the incompatible
feature set that the kernel doesn't
* know about, it should
refuse to mount the filesystem.
*
* e2fsck's requirements
are more strict; if it doesn't know
* about a feature
in either the compatible or incompatible
* feature set, it
must abort and not try to meddle with
* things it doesn't
understand...
*/
__u32 s_first_ino;
/* First non-reserved inode */
__u16 s_inode_size;
/* size of inode structure */
__u16 s_block_group_nr;
/* block group # of this superblock */
__u32 s_feature_compat;
/* compatible feature set */
__u32 s_feature_incompat;
/* incompatible feature set */
__u32 s_feature_ro_compat;
/* readonly-compatible feature set */
__u8 s_uuid[16];
/* 128-bit uuid for volume */
char s_volume_name[16];
/* volume name */
char s_last_mounted[64];
/* directory where last mounted */
__u32 s_algorithm_usage_bitmap;
/* For compression */
/*
* Performance hints.
Directory preallocation should only
* happen if the EXT2_COMPAT_PREALLOC
flag is on.
*/
__u8 s_prealloc_blocks;
/* Nr of blocks to try to preallocate*/
__u8 s_prealloc_dir_blocks;
/* Nr to preallocate for dirs */
__u16 s_padding1;
__u32 s_reserved[204];
/* Padding to the end of the block */
};