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 EXT2_SB(struct fs_info * fs)283static 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