/* File: ext2.h Copyright (C) 1998-2004,2006 Christophe GRENIER This software is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef __cplusplus extern "C" { #endif #define EXT2_SUPERBLOCK_SIZE 1024 #define EXT2_SB(sb) (sb) /* * The second extended file system magic number */ #define EXT2_SUPER_MAGIC 0xEF53 #define EXT2_MIN_BLOCK_SIZE 1024 #define EXT2_MAX_BLOCK_SIZE 4096 #define EXT2_MIN_BLOCK_LOG_SIZE 10 #define EXT2_MIN_BLOCK (EXT2_MIN_BLOCK_SIZE/DEFAULT_SECTOR_SIZE) /* * File system states */ #define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */ #define EXT2_ERROR_FS 0x0002 /* Errors detected */ /* * Behaviour when detecting errors */ #define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ #define EXT2_ERRORS_RO 2 /* Remount fs read-only */ #define EXT2_ERRORS_PANIC 3 /* Panic */ #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE /* * Feature set definitions */ #define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ ( le32(EXT2_SB(sb)->s_feature_compat) & (mask) ) #define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ ( le32(EXT2_SB(sb)->s_feature_ro_compat) & (mask) ) #define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ ( le32(EXT2_SB(sb)->s_feature_incompat) & (mask) ) #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 #define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008 #define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010 #define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020 #define EXT2_FEATURE_COMPAT_LAZY_BG 0x0040 #define EXT2_FEATURE_COMPAT_ANY 0xffffffff #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 //#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 #define EXT4_FEATURE_RO_COMPAT_HUGE_FILE 0x0008 #define EXT4_FEATURE_RO_COMPAT_GDT_CSUM 0x0010 #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK 0x0020 #define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE 0x0040 #define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff #define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 #define EXT2_FEATURE_INCOMPAT_META_BG 0x0010 #define EXT3_FEATURE_INCOMPAT_EXTENTS 0x0040 #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 #define EXT4_FEATURE_INCOMPAT_MMP 0x0100 #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff /* * Structure of the super block */ struct ext2_super_block { uint32_t s_inodes_count; /* Inodes count */ uint32_t s_blocks_count; /* Blocks count */ uint32_t s_r_blocks_count; /* Reserved blocks count */ uint32_t s_free_blocks_count; /* Free blocks count */ uint32_t s_free_inodes_count; /* Free inodes count */ uint32_t s_first_data_block; /* First Data Block */ uint32_t s_log_block_size; /* Block size */ int32_t s_log_frag_size; /* Fragment size */ uint32_t s_blocks_per_group; /* # Blocks per group */ uint32_t s_frags_per_group; /* # Fragments per group */ uint32_t s_inodes_per_group; /* # Inodes per group */ uint32_t s_mtime; /* Mount time */ uint32_t s_wtime; /* Write time */ uint16_t s_mnt_count; /* Mount count */ int16_t s_max_mnt_count; /* Maximal mount count */ uint16_t s_magic; /* Magic signature */ uint16_t s_state; /* File system state */ uint16_t s_errors; /* Behaviour when detecting errors */ uint16_t s_minor_rev_level; /* minor revision level */ uint32_t s_lastcheck; /* time of last check */ uint32_t s_checkinterval; /* max. time between checks */ uint32_t s_creator_os; /* OS */ uint32_t s_rev_level; /* Revision level */ uint16_t s_def_resuid; /* Default uid for reserved blocks */ uint16_t 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... */ uint32_t s_first_ino; /* First non-reserved inode */ uint16_t s_inode_size; /* size of inode structure */ uint16_t s_block_group_nr; /* block group # of this superblock */ uint32_t s_feature_compat; /* compatible feature set */ uint32_t s_feature_incompat; /* incompatible feature set */ uint32_t s_feature_ro_compat; /* readonly-compatible feature set */ uint8_t s_uuid[16]; /* 128-bit uuid for volume */ char s_volume_name[16]; /* volume name */ char s_last_mounted[64]; /* directory where last mounted */ uint32_t s_algorithm_usage_bitmap; /* For compression */ /* * Performance hints. Directory preallocation should only * happen if the EXT2_COMPAT_PREALLOC flag is on. */ uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ uint16_t s_padding1; uint32_t s_reserved[204]; /* Padding to the end of the block */ }; int check_EXT2(disk_t *disk_car,partition_t *partition,const int verbose); int recover_EXT2(disk_t *disk_car, const struct ext2_super_block *sb,partition_t *partition,const int verbose, const int dump_ind); #ifdef __cplusplus } /* closing brace for extern "C" */ #endif