Home | History | Annotate | Download | only in ext2
      1 #ifndef __EXT2_FS_H
      2 #define __EXT2_FS_H
      3 
      4 #include <stdint.h>
      5 
      6 #define	EXT2_SUPER_MAGIC	0xEF53
      7 
      8 #define EXT2_GOOD_OLD_REV       0       // The good old (original) format
      9 #define EXT2_DYNAMIC_REV        1       // V2 format w/ dynamic inode sizes
     10 #define EXT2_GOOD_OLD_INODE_SIZE 128
     11 
     12 // Special inode numbers
     13 #define	EXT2_BAD_INO		 1	// Bad blocks inode
     14 #define EXT2_ROOT_INO		 2	// Root inode
     15 #define EXT2_BOOT_LOADER_INO	 5	// Boot loader inode
     16 #define EXT2_UNDEL_DIR_INO	 6	// Undelete directory inode
     17 #define EXT3_RESIZE_INO		 7	// Reserved group descriptors inode
     18 #define EXT3_JOURNAL_INO	 8	// Journal inode
     19 
     20 // We're readonly, so we only care about incompat features.
     21 #define EXT2_FEATURE_INCOMPAT_COMPRESSION	0x0001
     22 #define EXT2_FEATURE_INCOMPAT_FILETYPE		0x0002
     23 #define EXT3_FEATURE_INCOMPAT_RECOVER		0x0004
     24 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV	0x0008
     25 #define EXT2_FEATURE_INCOMPAT_META_BG		0x0010
     26 #define EXT2_FEATURE_INCOMPAT_ANY		0xffffffff
     27 
     28 #define EXT2_NDIR_BLOCKS	12
     29 #define	EXT2_IND_BLOCK		EXT2_NDIR_BLOCKS
     30 #define EXT2_DIND_BLOCK		(EXT2_IND_BLOCK+1)
     31 #define	EXT2_TIND_BLOCK		(EXT2_DIND_BLOCK+1)
     32 #define	EXT2_N_BLOCKS		(EXT2_TIND_BLOCK+1)
     33 
     34 
     35 /* for EXT4 extent */
     36 #define EXT4_EXT_MAGIC     0xf30a
     37 #define EXT4_EXTENTS_FLAG  0x00080000
     38 
     39 /*
     40  * File types and file modes
     41  */
     42 #define S_IFDIR		0040000	        // Directory
     43 #define S_IFCHR		0020000	        // Character device
     44 #define S_IFBLK		0060000		// Block device
     45 #define S_IFREG		0100000	        // Regular file
     46 #define S_IFIFO		0010000	        // FIFO
     47 #define S_IFLNK		0120000		// Symbolic link
     48 #define S_IFSOCK	0140000		// Socket
     49 
     50 #define S_IFSHIFT	12
     51 
     52 #define T_IFDIR		(S_IFDIR >> S_IFSHIFT)
     53 #define T_IFCHR		(S_IFCHR >> S_IFSHIFT)
     54 #define T_IFBLK		(S_IFBLK >> S_IFSHIFT)
     55 #define T_IFREG		(S_IFREG >> S_IFSHIFT)
     56 #define T_IFIFO		(S_IFIFO >> S_IFSHIFT)
     57 #define T_IFLNK		(S_IFLNK >> S_IFSHIFT)
     58 #define T_IFSOCK	(S_IFSOCK >> S_IFSHIFT)
     59 
     60 
     61 #define ext2_group_desc_lg2size 5
     62 
     63 
     64 
     65 /*
     66  * super block structure:
     67  * include/linux/ext2_fs.h
     68  */
     69 struct ext2_super_block {
     70     uint32_t s_inodes_count;	        /* Inodes count */
     71     uint32_t s_blocks_count;	        /* Blocks count */
     72     uint32_t s_r_blocks_count;	        /* Reserved blocks count */
     73     uint32_t s_free_blocks_count;	/* Free blocks count */
     74     uint32_t s_free_inodes_count;	/* Free inodes count */
     75     uint32_t s_first_data_block;	/* First Data Block */
     76     uint32_t s_log_block_size;	        /* Block size */
     77     uint32_t s_log_frag_size;	        /* Fragment size */
     78     uint32_t s_blocks_per_group;	/* # Blocks per group */
     79     uint32_t s_frags_per_group;	        /* # Fragments per group */
     80     uint32_t s_inodes_per_group;	/* # Inodes per group */
     81     uint32_t s_mtime;		        /* Mount time */
     82     uint32_t s_wtime;		        /* Write time */
     83     uint16_t s_mnt_count;		/* Mount count */
     84     int16_t  s_max_mnt_count;	        /* Maximal mount count */
     85     uint16_t s_magic;		        /* Magic signature */
     86     uint16_t s_state;		        /* File system state */
     87     uint16_t s_errors;		        /* Behaviour when detecting errors */
     88     uint16_t s_minor_rev_level;
     89     uint32_t s_lastcheck;		/* time of last check */
     90     uint32_t s_checkinterval;	        /* max. time between checks */
     91     uint32_t s_creator_os;		/* OS */
     92     uint32_t s_rev_level;		/* Revision level */
     93     uint16_t s_def_resuid;		/* Default uid for reserved blocks */
     94     uint16_t s_def_resgid;		/* Default gid for reserved blocks */
     95 
     96     uint32_t s_first_ino;		/* First non-reserved inode */
     97     uint16_t s_inode_size;		/* size of inode structure */
     98     uint16_t s_block_group_nr;	        /* block group # of this superblock */
     99     uint32_t s_feature_compat;	        /* compatible feature set */
    100     uint32_t s_feature_incompat;	/* incompatible feature set */
    101     uint32_t s_feature_ro_compat;	/* readonly-compatible feature set */
    102     uint8_t  s_uuid[16];		/* 128-bit uuid for volume */
    103     char  s_volume_name[16];	        /* volume name */
    104     char  s_last_mounted[64];	        /* directory where last mounted */
    105     uint32_t s_algorithm_usage_bitmap;  /* For compression */
    106     uint8_t  s_prealloc_blocks;	        /* Nr of blocks to try to preallocate*/
    107     uint8_t  s_prealloc_dir_blocks;
    108     uint16_t s_reserved_gdt_blocks;	/* Per group desc for online growth */
    109     /*
    110      * Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set.
    111      */
    112     uint8_t  s_journal_uuid[16];	/* uuid of journal superblock */
    113     uint32_t s_journal_inum;	/* inode number of journal file */
    114     uint32_t s_journal_dev;		/* device number of journal file */
    115     uint32_t s_last_orphan;		/* start of list of inodes to delete */
    116     uint32_t s_hash_seed[4];	/* HTREE hash seed */
    117     uint8_t  s_def_hash_version;	/* Default hash version to use */
    118     uint8_t  s_reserved_char_pad;
    119     uint16_t s_desc_size;		/* size of group descriptor */
    120     uint32_t s_default_mount_opts;
    121     uint32_t s_first_meta_bg;	/* First metablock block group */
    122     uint32_t s_mkfs_time;		/* When the filesystem was created */
    123     uint32_t s_jnl_blocks[17];	/* Backup of the journal inode */
    124     /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
    125     uint32_t s_blocks_count_hi;	/* Blocks count */
    126     uint32_t s_r_blocks_count_hi;	/* Reserved blocks count */
    127     uint32_t s_free_blocks_count_hi;/* Free blocks count */
    128     uint16_t s_min_extra_isize;	/* All inodes have at least # bytes */
    129     uint16_t s_want_extra_isize;	/* New inodes should reserve # bytes */
    130     uint32_t s_flags;		/* Miscellaneous flags */
    131     uint16_t s_raid_stride;		/* RAID stride */
    132     uint16_t s_mmp_interval;        /* # seconds to wait in MMP checking */
    133     uint64_t s_mmp_block;           /* Block for multi-mount protection */
    134     uint32_t s_raid_stripe_width;   /* blocks on all data disks (N*stride)*/
    135     uint8_t  s_log_groups_per_flex; /* FLEX_BG group size */
    136     uint8_t  s_reserved_char_pad2;
    137     uint16_t s_reserved_pad;
    138     uint32_t s_reserved[162];        /* Padding to the end of the block */
    139 };
    140 
    141 /*******************************************************************************
    142 #ifndef DEPEND
    143 #if ext2_super_block_size != 1024
    144 #error ext2_super_block definition bogus
    145 #endif
    146 #endif
    147 *******************************************************************************/
    148 
    149 /*
    150  *  ext2 group desc structure:
    151  */
    152 struct ext2_group_desc {
    153     uint32_t bg_block_bitmap;	/* Blocks bitmap block */
    154     uint32_t bg_inode_bitmap;	/* Inodes bitmap block */
    155     uint32_t bg_inode_table;	/* Inodes table block */
    156     uint16_t bg_free_blocks_count;	/* Free blocks count */
    157     uint16_t bg_free_inodes_count;	/* Free inodes count */
    158     uint16_t bg_used_dirs_count;	/* Directories count */
    159     uint16_t bg_pad;
    160     uint32_t bg_reserved[3];
    161 };
    162 
    163 /*******************************************************************************
    164 #ifndef DEPEND
    165 #if ext2_group_desc_size != 32
    166 #error ext2_group_desc definition bogus
    167 #endif
    168 #endif
    169 *******************************************************************************/
    170 
    171 
    172 /*
    173  * ext2 inode structure:
    174  */
    175 struct ext2_inode {
    176     uint16_t i_mode;		/* File mode */
    177     uint16_t i_uid;		/* Owner Uid */
    178     uint32_t i_size;		/* 4: Size in bytes */
    179     uint32_t i_atime;		/* Access time */
    180     uint32_t i_ctime;		/* 12: Creation time */
    181     uint32_t i_mtime;		/* Modification time */
    182     uint32_t i_dtime;		/* 20: Deletion Time */
    183     uint16_t i_gid;		/* Group Id */
    184     uint16_t i_links_count;	/* 24: Links count */
    185     uint32_t i_blocks;		/* Blocks count */
    186     uint32_t i_flags;		/* 32: File flags */
    187     uint32_t l_i_reserved1;
    188     uint32_t i_block[EXT2_N_BLOCKS];	/* 40: Pointers to blocks */
    189     uint32_t i_version;		/* File version (for NFS) */
    190     uint32_t i_file_acl;	/* File ACL */
    191     uint32_t i_dir_acl;		/* Directory ACL */
    192     uint32_t i_faddr;		/* Fragment address */
    193     uint8_t  l_i_frag;	        /* Fragment number */
    194     uint8_t  l_i_fsize;	        /* Fragment size */
    195     uint16_t i_pad1;
    196     uint32_t l_i_reserved2[2];
    197 };
    198 
    199 /*******************************************************************************
    200 #ifndef DEPEND
    201 #if ext2_inode_size != 128
    202 #error ext2_inode definition bogus
    203 #endif
    204 #endif
    205 *******************************************************************************/
    206 
    207 
    208 #define EXT2_NAME_LEN 255
    209 struct ext2_dir_entry {
    210     unsigned int	d_inode;		/* Inode number */
    211     unsigned short	d_rec_len;		/* Directory entry length */
    212     unsigned char	d_name_len;		/* Name length */
    213     unsigned char	d_file_type;
    214     char	d_name[EXT2_NAME_LEN];	        /* File name */
    215 };
    216 
    217 /*******************************************************************************
    218 #define EXT2_DIR_PAD	 4
    219 #define EXT2_DIR_ROUND	(EXT2_DIR_PAD - 1)
    220 #define EXT2_DIR_REC_LEN(name_len)	(((name_len) + 8 + EXT2_DIR_ROUND) & \
    221 					 ~EXT2_DIR_ROUND)
    222 *******************************************************************************/
    223 
    224 
    225 
    226 
    227 
    228 
    229 /*
    230  * This is the extent on-disk structure.
    231  * It's used at the bottom of the tree.
    232  */
    233 struct ext4_extent {
    234     uint32_t ee_block;	        /* first logical block extent covers */
    235     uint16_t ee_len;	        /* number of blocks covered by extent */
    236     uint16_t ee_start_hi;	/* high 16 bits of physical block */
    237     uint32_t ee_start_lo;	/* low 32 bits of physical block */
    238 };
    239 
    240 /*
    241  * This is index on-disk structure.
    242  * It's used at all the levels except the bottom.
    243  */
    244 struct ext4_extent_idx {
    245     uint32_t ei_block;	        /* index covers logical blocks from 'block' */
    246     uint32_t ei_leaf_lo;	/* pointer to the physical block of the next *
    247 				 * level. leaf or next index could be there */
    248     uint16_t ei_leaf_hi;	/* high 16 bits of physical block */
    249     uint16_t ei_unused;
    250 };
    251 
    252 /*
    253  * Each block (leaves and indexes), even inode-stored has header.
    254  */
    255 struct ext4_extent_header {
    256     uint16_t eh_magic;	        /* probably will support different formats */
    257     uint16_t eh_entries;	/* number of valid entries */
    258     uint16_t eh_max;	        /* capacity of store in entries */
    259     uint16_t eh_depth;	        /* has tree real underlying blocks? */
    260     uint32_t eh_generation;	/* generation of the tree */
    261 };
    262 
    263 
    264 
    265 #define EXT4_FIRST_EXTENT(header) ( (struct ext4_extent *)(header + 1) )
    266 #define EXT4_FIRST_INDEX(header)  ( (struct ext4_extent_idx *) (header + 1) )
    267 
    268 
    269 /*
    270  * The ext2 super block information in memory
    271  */
    272 struct ext2_sb_info {
    273     uint32_t s_inodes_per_block;/* Number of inodes per block */
    274     uint32_t s_inodes_per_group;/* Number of inodes in a group */
    275     uint32_t s_blocks_per_group;/* Number of blocks in a group */
    276     uint32_t s_desc_per_block;  /* Number of group descriptors per block */
    277     uint32_t s_groups_count;    /* Number of groups in the fs */
    278     uint32_t s_first_data_block;	/* First Data Block */
    279     int      s_inode_size;
    280     uint8_t  s_uuid[16];	/* 128-bit uuid for volume */
    281 };
    282 
    283 static inline struct ext2_sb_info *EXT2_SB(struct fs_info *fs)
    284 {
    285     return fs->fs_info;
    286 }
    287 
    288 #define EXT2_BLOCKS_PER_GROUP(fs)      (EXT2_SB(fs)->s_blocks_per_group)
    289 #define EXT2_INODES_PER_GROUP(fs)      (EXT2_SB(fs)->s_inodes_per_group)
    290 #define EXT2_INODES_PER_BLOCK(fs)      (EXT2_SB(fs)->s_inodes_per_block)
    291 #define EXT2_DESC_PER_BLOCK(fs)        (EXT2_SB(fs)->s_desc_per_block)
    292 
    293 /*
    294  * ext2 private inode information
    295  */
    296 struct ext2_pvt_inode {
    297     union {
    298 	uint32_t i_block[EXT2_N_BLOCKS];
    299 	struct ext4_extent_header i_extent_hdr;
    300     };
    301 };
    302 
    303 #define PVT(i) ((struct ext2_pvt_inode *)((i)->pvt))
    304 
    305 /*
    306  * functions
    307  */
    308 block_t ext2_bmap(struct inode *, block_t, size_t *);
    309 int ext2_next_extent(struct inode *, uint32_t);
    310 
    311 #endif /* ext2_fs.h */
    312