1 /* 2 * linux/include/linux/ext2_fs.h 3 * 4 * Copyright (C) 1992, 1993, 1994, 1995 5 * Remy Card (card@masi.ibp.fr) 6 * Laboratoire MASI - Institut Blaise Pascal 7 * Universite Pierre et Marie Curie (Paris VI) 8 * 9 * from 10 * 11 * linux/include/linux/minix_fs.h 12 * 13 * Copyright (C) 1991, 1992 Linus Torvalds 14 */ 15 16 /* 17 * EXT2_*_*() convienience macros added by Andrew Clausen <clausen@gnu.org> 18 * Copyright (C) 2000 Free Software Foundation, Inc. 19 */ 20 21 #ifndef _EXT2_FS_H 22 #define _EXT2_FS_H 23 24 #include <parted/endian.h> 25 #include <stdint.h> 26 27 /* 28 * The second extended file system constants/structures 29 */ 30 31 #define EXT2_SUPER_MAGIC_CONST 0xEF53 32 #define EXT2_MIN_BLOCK_SIZE 1024 33 #define EXT2_NDIR_BLOCKS 12 34 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS 35 #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) 36 #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) 37 #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) 38 #define EXT2_VALID_FS 0x0001 39 #define EXT2_ERROR_FS 0x0002 40 #define EXT2_RESERVED_INODE_COUNT 11 41 42 /* 43 * Codes for operating systems 44 */ 45 #define EXT2_OS_LINUX 0 46 #define EXT2_OS_HURD 1 47 #define EXT2_OS_MASIX 2 48 #define EXT2_OS_FREEBSD 3 49 #define EXT2_OS_LITES 4 50 51 /* 52 * Feature set definitions 53 */ 54 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 55 #define EXT2_FEATURE_COMPAT_HAS_DIR_INDEX 0x0020 56 57 #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 58 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 59 60 #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 61 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 62 63 /* 64 * Special inodes numbers 65 */ 66 #define EXT2_BAD_INO 1 /* Bad blocks inode */ 67 #define EXT2_ROOT_INO 2 /* Root inode */ 68 #define EXT2_ACL_IDX_INO 3 /* ACL inode */ 69 #define EXT2_ACL_DATA_INO 4 /* ACL inode */ 70 #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ 71 #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ 72 73 /* 74 * Ext2 directory file types. Only the low 3 bits are used. The 75 * other bits are reserved for now. 76 */ 77 #define EXT2_FT_UNKNOWN 0 78 #define EXT2_FT_REG_FILE 1 79 #define EXT2_FT_DIR 2 80 #define EXT2_FT_CHRDEV 3 81 #define EXT2_FT_BLKDEV 4 82 #define EXT2_FT_FIFO 5 83 #define EXT2_FT_SOCK 6 84 #define EXT2_FT_SYMLINK 7 85 86 /* 87 * Behaviour when detecting errors 88 */ 89 #define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ 90 #define EXT2_ERRORS_RO 2 /* Remount fs read-only */ 91 #define EXT2_ERRORS_PANIC 3 /* Panic */ 92 #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE 93 94 struct ext2_dir_entry_2 95 { 96 uint32_t inode; 97 uint16_t rec_len; 98 uint8_t name_len; 99 uint8_t file_type; 100 char name[255]; 101 }; 102 103 struct ext2_group_desc 104 { 105 uint32_t bg_block_bitmap; 106 uint32_t bg_inode_bitmap; 107 uint32_t bg_inode_table; 108 uint16_t bg_free_blocks_count; 109 uint16_t bg_free_inodes_count; 110 uint16_t bg_used_dirs_count; 111 uint16_t bg_pad; 112 uint32_t bg_reserved[3]; 113 }; 114 115 struct ext2_inode 116 { 117 uint16_t i_mode; /* File mode */ 118 uint16_t i_uid; /* Owner Uid */ 119 uint32_t i_size; /* Size in bytes */ 120 uint32_t i_atime; /* Access time */ 121 uint32_t i_ctime; /* Creation time */ 122 uint32_t i_mtime; /* Modification time */ 123 uint32_t i_dtime; /* Deletion Time */ 124 uint16_t i_gid; /* Group Id */ 125 uint16_t i_links_count; /* Links count */ 126 uint32_t i_blocks; /* Blocks count */ 127 uint32_t i_flags; /* File flags */ 128 union { 129 struct { 130 uint32_t l_i_reserved1; 131 } linux1; 132 struct { 133 uint32_t h_i_translator; 134 } hurd1; 135 struct { 136 uint32_t m_i_reserved1; 137 } masix1; 138 } osd1; /* OS dependent 1 */ 139 uint32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ 140 uint32_t i_generation; /* File version (for NFS) */ 141 uint32_t i_file_acl; /* File ACL */ 142 uint32_t i_dir_acl; /* Directory ACL */ 143 uint32_t i_faddr; /* Fragment address */ 144 union { 145 struct { 146 uint8_t l_i_frag; /* Fragment number */ 147 uint8_t l_i_fsize; /* Fragment size */ 148 uint16_t i_pad1; 149 uint32_t l_i_reserved2[2]; 150 } linux2; 151 struct { 152 uint8_t h_i_frag; /* Fragment number */ 153 uint8_t h_i_fsize; /* Fragment size */ 154 uint16_t h_i_mode_high; 155 uint16_t h_i_uid_high; 156 uint16_t h_i_gid_high; 157 uint32_t h_i_author; 158 } hurd2; 159 struct { 160 uint8_t m_i_frag; /* Fragment number */ 161 uint8_t m_i_fsize; /* Fragment size */ 162 uint16_t m_pad1; 163 uint32_t m_i_reserved2[2]; 164 } masix2; 165 } osd2; /* OS dependent 2 */ 166 }; 167 168 #define i_size_high i_dir_acl 169 170 struct ext2_super_block 171 { 172 uint32_t s_inodes_count; /* Inodes count */ 173 uint32_t s_blocks_count; /* Blocks count */ 174 uint32_t s_r_blocks_count; /* Reserved blocks count */ 175 uint32_t s_free_blocks_count; /* Free blocks count */ 176 uint32_t s_free_inodes_count; /* Free inodes count */ 177 uint32_t s_first_data_block; /* First Data Block */ 178 uint32_t s_log_block_size; /* Block size */ 179 int32_t s_log_frag_size; /* Fragment size */ 180 uint32_t s_blocks_per_group; /* # Blocks per group */ 181 uint32_t s_frags_per_group; /* # Fragments per group */ 182 uint32_t s_inodes_per_group; /* # Inodes per group */ 183 uint32_t s_mtime; /* Mount time */ 184 uint32_t s_wtime; /* Write time */ 185 uint16_t s_mnt_count; /* Mount count */ 186 int16_t s_max_mnt_count; /* Maximal mount count */ 187 uint16_t s_magic; /* Magic signature */ 188 uint16_t s_state; /* File system state */ 189 uint16_t s_errors; /* Behaviour when detecting errors */ 190 uint16_t s_minor_rev_level; /* minor revision level */ 191 uint32_t s_lastcheck; /* time of last check */ 192 uint32_t s_checkinterval; /* max. time between checks */ 193 uint32_t s_creator_os; /* OS */ 194 uint32_t s_rev_level; /* Revision level */ 195 uint16_t s_def_resuid; /* Default uid for reserved blocks */ 196 uint16_t s_def_resgid; /* Default gid for reserved blocks */ 197 /* 198 * These fields are for EXT2_DYNAMIC_REV superblocks only. 199 * 200 * Note: the difference between the compatible feature set and 201 * the incompatible feature set is that if there is a bit set 202 * in the incompatible feature set that the kernel doesn't 203 * know about, it should refuse to mount the file system. 204 * 205 * e2fsck's requirements are more strict; if it doesn't know 206 * about a feature in either the compatible or incompatible 207 * feature set, it must abort and not try to meddle with 208 * things it doesn't understand... 209 */ 210 uint32_t s_first_ino; /* First non-reserved inode */ 211 uint16_t s_inode_size; /* size of inode structure */ 212 uint16_t s_block_group_nr; /* block group # of this superblock */ 213 uint32_t s_feature_compat; /* compatible feature set */ 214 uint32_t s_feature_incompat; /* incompatible feature set */ 215 uint32_t s_feature_ro_compat; /* readonly-compatible feature set */ 216 uint8_t s_uuid[16]; /* 128-bit uuid for volume */ 217 char s_volume_name[16]; /* volume name */ 218 char s_last_mounted[64]; /* directory where last mounted */ 219 uint32_t s_algorithm_usage_bitmap; /* For compression */ 220 /* 221 * Performance hints. Directory preallocation should only 222 * happen if the EXT2_COMPAT_PREALLOC flag is on. 223 */ 224 uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ 225 uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ 226 uint16_t s_padding1; 227 /* 228 * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set. 229 */ 230 uint8_t s_journal_uuid[16]; /* uuid of journal superblock */ 231 uint32_t s_journal_inum; /* inode number of journal file */ 232 uint32_t s_journal_dev; /* device number of journal file */ 233 uint32_t s_last_orphan; /* start of list of inodes to delete */ 234 235 uint32_t s_reserved[197]; /* Padding to the end of the block */ 236 }; 237 238 #define EXT2_DIRENT_INODE(dir_ent) (PED_LE32_TO_CPU((dir_ent).inode)) 239 #define EXT2_DIRENT_REC_LEN(dir_ent) (PED_LE16_TO_CPU((dir_ent).rec_len)) 240 #define EXT2_DIRENT_NAME_LEN(dir_ent) ((dir_ent).name_len) 241 #define EXT2_DIRENT_FILE_TYPE(dir_ent) ((dir_ent).file_type) 242 243 #define EXT2_GROUP_BLOCK_BITMAP(gd) (PED_LE32_TO_CPU((gd).bg_block_bitmap)) 244 #define EXT2_GROUP_INODE_BITMAP(gd) (PED_LE32_TO_CPU((gd).bg_inode_bitmap)) 245 #define EXT2_GROUP_INODE_TABLE(gd) (PED_LE32_TO_CPU((gd).bg_inode_table)) 246 #define EXT2_GROUP_FREE_BLOCKS_COUNT(gd) \ 247 (PED_LE16_TO_CPU((gd).bg_free_blocks_count)) 248 #define EXT2_GROUP_FREE_INODES_COUNT(gd) \ 249 (PED_LE16_TO_CPU((gd).bg_free_inodes_count)) 250 #define EXT2_GROUP_USED_DIRS_COUNT(gd) \ 251 (PED_LE16_TO_CPU((gd).bg_used_dirs_count)) 252 253 #define EXT2_INODE_MODE(inode) (PED_LE16_TO_CPU((inode).i_mode)) 254 #define EXT2_INODE_UID(inode) (PED_LE16_TO_CPU((inode).i_uid)) 255 #define EXT2_INODE_SIZE(inode) \ 256 ((uint64_t) PED_LE32_TO_CPU((inode).i_size) \ 257 + ((uint64_t) PED_LE32_TO_CPU((inode).i_size_high) << 32)) 258 #define EXT2_INODE_ATIME(inode) (PED_LE32_TO_CPU((inode).i_atime)) 259 #define EXT2_INODE_CTIME(inode) (PED_LE32_TO_CPU((inode).i_ctime)) 260 #define EXT2_INODE_MTIME(inode) (PED_LE32_TO_CPU((inode).i_mtime)) 261 #define EXT2_INODE_DTIME(inode) (PED_LE32_TO_CPU((inode).i_dtime)) 262 #define EXT2_INODE_GID(inode) (PED_LE16_TO_CPU((inode).i_gid)) 263 #define EXT2_INODE_LINKS_COUNT(inode) (PED_LE16_TO_CPU((inode).i_links_count)) 264 #define EXT2_INODE_BLOCKS(inode) (PED_LE32_TO_CPU((inode).i_blocks)) 265 #define EXT2_INODE_FLAGS(inode) (PED_LE32_TO_CPU((inode).i_flags)) 266 #define EXT2_INODE_TRANSLATOR(inode) (PED_LE32_TO_CPU((inode).osd1.hurd1.h_i_translator)) 267 #define EXT2_INODE_BLOCK(inode, blk) (PED_LE32_TO_CPU((inode).i_block[blk])) 268 269 #define EXT2_SUPER_INODES_COUNT(sb) (PED_LE32_TO_CPU((sb).s_inodes_count)) 270 #define EXT2_SUPER_BLOCKS_COUNT(sb) (PED_LE32_TO_CPU((sb).s_blocks_count)) 271 #define EXT2_SUPER_R_BLOCKS_COUNT(sb) (PED_LE32_TO_CPU((sb).s_r_blocks_count)) 272 #define EXT2_SUPER_FREE_BLOCKS_COUNT(sb) \ 273 (PED_LE32_TO_CPU((sb).s_free_blocks_count)) 274 #define EXT2_SUPER_FREE_INODES_COUNT(sb) \ 275 (PED_LE32_TO_CPU((sb).s_free_inodes_count)) 276 #define EXT2_SUPER_FIRST_DATA_BLOCK(sb) \ 277 (PED_LE32_TO_CPU((sb).s_first_data_block)) 278 #define EXT2_SUPER_LOG_BLOCK_SIZE(sb) (PED_LE32_TO_CPU((sb).s_log_block_size)) 279 #define EXT2_SUPER_LOG_FRAG_SIZE(sb) \ 280 ((int32_t) PED_LE32_TO_CPU((sb).s_log_frag_size)) 281 #define EXT2_SUPER_BLOCKS_PER_GROUP(sb) \ 282 (PED_LE32_TO_CPU((sb).s_blocks_per_group)) 283 #define EXT2_SUPER_FRAGS_PER_GROUP(sb) \ 284 (PED_LE32_TO_CPU((sb).s_frags_per_group)) 285 #define EXT2_SUPER_INODES_PER_GROUP(sb) \ 286 (PED_LE32_TO_CPU((sb).s_inodes_per_group)) 287 #define EXT2_SUPER_MTIME(sb) (PED_LE32_TO_CPU((sb).s_mtime)) 288 #define EXT2_SUPER_WTIME(sb) (PED_LE32_TO_CPU((sb).s_wtime)) 289 #define EXT2_SUPER_MNT_COUNT(sb) (PED_LE16_TO_CPU((sb).s_mnt_count)) 290 #define EXT2_SUPER_MAX_MNT_COUNT(sb) \ 291 ((int16_t) PED_LE16_TO_CPU((sb).s_max_mnt_count)) 292 #define EXT2_SUPER_MAGIC(sb) (PED_LE16_TO_CPU((sb).s_magic)) 293 #define EXT2_SUPER_STATE(sb) (PED_LE16_TO_CPU((sb).s_state)) 294 #define EXT2_SUPER_ERRORS(sb) (PED_LE16_TO_CPU((sb).s_errors)) 295 #define EXT2_SUPER_MINOR_REV_LEVEL(sb) \ 296 (PED_LE16_TO_CPU((sb).s_minor_rev_level)) 297 #define EXT2_SUPER_LASTCHECK(sb) (PED_LE32_TO_CPU((sb).s_lastcheck)) 298 #define EXT2_SUPER_CHECKINTERVAL(sb) (PED_LE32_TO_CPU((sb).s_checkinterval)) 299 #define EXT2_SUPER_CREATOR_OS(sb) (PED_LE32_TO_CPU((sb).s_creator_os)) 300 #define EXT2_SUPER_REV_LEVEL(sb) (PED_LE32_TO_CPU((sb).s_rev_level)) 301 #define EXT2_SUPER_DEF_RESUID(sb) (PED_LE16_TO_CPU((sb).s_def_resuid)) 302 #define EXT2_SUPER_DEF_RESGID(sb) (PED_LE16_TO_CPU((sb).s_def_resgid)) 303 304 #define EXT2_SUPER_FIRST_INO(sb) (PED_LE32_TO_CPU((sb).s_first_ino)) 305 #define EXT2_SUPER_INODE_SIZE(sb) (PED_LE16_TO_CPU((sb).s_inode_size)) 306 #define EXT2_SUPER_BLOCK_GROUP_NR(sb) (PED_LE16_TO_CPU((sb).s_block_group_nr)) 307 #define EXT2_SUPER_FEATURE_COMPAT(sb) (PED_LE32_TO_CPU((sb).s_feature_compat)) 308 #define EXT2_SUPER_FEATURE_INCOMPAT(sb) \ 309 (PED_LE32_TO_CPU((sb).s_feature_incompat)) 310 #define EXT2_SUPER_FEATURE_RO_COMPAT(sb) \ 311 (PED_LE32_TO_CPU((sb).s_feature_ro_compat)) 312 #define EXT2_SUPER_UUID(sb) ((sb).s_uuid) 313 #define EXT2_SUPER_VOLUME_NAME(sb) ((sb).s_volume_name) 314 #define EXT2_SUPER_LAST_MOUNTED(sb) ((sb).s_last_mounted) 315 #define EXT2_SUPER_ALGORITHM_USAGE_BITMAP(sb) \ 316 (PED_LE32_TO_CPU((sb).s_algorithm_usage_bitmap)) 317 318 #define EXT2_SUPER_JOURNAL_UUID(sb) ((sb).s_journal_uuid) 319 #define EXT2_SUPER_JOURNAL_INUM(sb) (PED_LE32_TO_CPU((sb).s_journal_inum)) 320 #define EXT2_SUPER_JOURNAL_DEV(sb) (PED_LE32_TO_CPU((sb).s_journal_dev)) 321 #define EXT2_SUPER_LAST_ORPHAN(sb) (PED_LE32_TO_CPU((sb).s_last_orphan)) 322 323 #endif