e2fsck.h revision e72a9ba39471364ad2f9397f645ca547090e3485
1/* 2 * e2fsck.h 3 * 4 * Copyright (C) 1993, 1994 Theodore Ts'o. This file may be 5 * redistributed under the terms of the GNU Public License. 6 * 7 */ 8 9#include <stdio.h> 10#include <string.h> 11#ifdef HAVE_UNISTD_H 12#include <unistd.h> 13#endif 14#include <stdlib.h> 15#include <time.h> 16#ifdef HAVE_SYS_TYPES_H 17#include <sys/types.h> 18#endif 19#ifdef HAVE_SYS_TIME_H 20#include <sys/time.h> 21#endif 22#ifdef HAVE_SETJMP_H 23#include <setjmp.h> 24#endif 25 26#ifdef HAVE_LINUX_FS_H 27#include <linux/fs.h> 28#endif 29 30#if EXT2_FLAT_INCLUDES 31#include "ext2_fs.h" 32#include "ext2fs.h" 33#else 34#include <linux/ext2_fs.h> 35#include "ext2fs/ext2fs.h" 36#endif 37 38 39/* Everything is STDC, these days */ 40#define NOARGS void 41 42/* 43 * Exit codes used by fsck-type programs 44 */ 45#define FSCK_OK 0 /* No errors */ 46#define FSCK_NONDESTRUCT 1 /* File system errors corrected */ 47#define FSCK_REBOOT 2 /* System should be rebooted */ 48#define FSCK_UNCORRECTED 4 /* File system errors left uncorrected */ 49#define FSCK_ERROR 8 /* Operational error */ 50#define FSCK_USAGE 16 /* Usage or syntax error */ 51#define FSCK_LIBRARY 128 /* Shared library error */ 52 53/* 54 * The last ext2fs revision level that this version of e2fsck is able to 55 * support 56 */ 57#define E2FSCK_CURRENT_REV 1 58 59/* 60 * The directory information structure; stores directory information 61 * collected in earlier passes, to avoid disk i/o in fetching the 62 * directory information. 63 */ 64struct dir_info { 65 ino_t ino; /* Inode number */ 66 ino_t dotdot; /* Parent according to '..' */ 67 ino_t parent; /* Parent according to treewalk */ 68}; 69 70#ifdef RESOURCE_TRACK 71/* 72 * This structure is used for keeping track of how much resources have 73 * been used for a particular pass of e2fsck. 74 */ 75struct resource_track { 76 struct timeval time_start; 77 struct timeval user_start; 78 struct timeval system_start; 79 void *brk_start; 80}; 81#endif 82 83/* 84 * E2fsck options 85 */ 86#define E2F_OPT_READONLY 0x0001 87#define E2F_OPT_PREEN 0x0002 88#define E2F_OPT_YES 0x0004 89#define E2F_OPT_NO 0x0008 90#define E2F_OPT_TIME 0x0010 91#define E2F_OPT_TIME2 0x0020 92#define E2F_OPT_CHECKBLOCKS 0x0040 93#define E2F_OPT_DEBUG 0x0080 94 95/* 96 * E2fsck flags 97 */ 98#define E2F_FLAG_ABORT 0x0001 /* Abort signaled */ 99#define E2F_FLAG_CANCEL 0x0002 /* Cancel signaled */ 100#define E2F_FLAG_SIGNAL_MASK 0x0003 101#define E2F_FLAG_RESTART 0x0004 /* Restart signaled */ 102 103#define E2F_FLAG_SETJMP_OK 0x0010 /* Setjmp valid for abort */ 104 105/* 106 * Defines for indicating the e2fsck pass number 107 */ 108#define E2F_PASS_1 1 109#define E2F_PASS_2 2 110#define E2F_PASS_3 3 111#define E2F_PASS_4 4 112#define E2F_PASS_5 5 113#define E2F_PASS_1B 6 114 115/* 116 * This is the global e2fsck structure. 117 */ 118typedef struct e2fsck_struct *e2fsck_t; 119 120struct e2fsck_struct { 121 ext2_filsys fs; 122 const char *program_name; 123 const char *filesystem_name; 124 const char *device_name; 125 int flags; /* E2fsck internal flags */ 126 int options; 127 blk_t use_superblock; /* sb requested by user */ 128 blk_t superblock; /* sb used to open fs */ 129 blk_t num_blocks; /* Total number of blocks */ 130 131#ifdef HAVE_SETJMP_H 132 jmp_buf abort_loc; 133#endif 134 unsigned long abort_code; 135 136 int (*progress)(e2fsck_t ctx, int pass, unsigned long cur, 137 unsigned long max); 138 139 ext2fs_inode_bitmap inode_used_map; /* Inodes which are in use */ 140 ext2fs_inode_bitmap inode_bad_map; /* Inodes which are bad somehow */ 141 ext2fs_inode_bitmap inode_dir_map; /* Inodes which are directories */ 142 ext2fs_inode_bitmap inode_bb_map; /* Inodes which are in bad blocks */ 143 144 ext2fs_block_bitmap block_found_map; /* Blocks which are in use */ 145 ext2fs_block_bitmap block_dup_map; /* Blks referenced more than once */ 146 ext2fs_block_bitmap block_illegal_map; /* Meta-data blocks */ 147 148 /* 149 * Inode count arrays 150 */ 151 ext2_icount_t inode_count; 152 ext2_icount_t inode_link_info; 153 154 /* 155 * Array of flags indicating whether an inode bitmap, block 156 * bitmap, or inode table is invalid 157 */ 158 int *invalid_inode_bitmap_flag; 159 int *invalid_block_bitmap_flag; 160 int *invalid_inode_table_flag; 161 int invalid_bitmaps; /* There are invalid bitmaps/itable */ 162 163 /* 164 * Block buffer 165 */ 166 char *block_buf; 167 168 /* 169 * For pass1_check_directory and pass1_get_blocks 170 */ 171 ino_t stashed_ino; 172 struct ext2_inode *stashed_inode; 173 174 /* 175 * Directory information 176 */ 177 int dir_info_count; 178 int dir_info_size; 179 struct dir_info *dir_info; 180 181 /* 182 * Tuning parameters 183 */ 184 int process_inode_size; 185 int inode_buffer_blocks; 186 187#ifdef RESOURCE_TRACK 188 /* 189 * For timing purposes 190 */ 191 struct resource_track global_rtrack; 192#endif 193 194 /* 195 * How we display the progress update (for unix) 196 */ 197 int progress_fd; 198 int progress_pos; 199 200 /* File counts */ 201 int fs_directory_count; 202 int fs_regular_count; 203 int fs_blockdev_count; 204 int fs_chardev_count; 205 int fs_links_count; 206 int fs_symlinks_count; 207 int fs_fast_symlinks_count; 208 int fs_fifo_count; 209 int fs_total_count; 210 int fs_badblocks_count; 211 int fs_sockets_count; 212 int fs_ind_count; 213 int fs_dind_count; 214 int fs_tind_count; 215 int fs_fragmented; 216 int large_files; 217 218 /* 219 * For the use of callers of the e2fsck functions; not used by 220 * e2fsck functions themselves. 221 */ 222 void *priv_data; 223}; 224 225 226/* 227 * Procedure declarations 228 */ 229 230extern void e2fsck_pass1(e2fsck_t ctx); 231extern void e2fsck_pass1_dupblocks(e2fsck_t ctx, char *block_buf); 232extern void e2fsck_pass2(e2fsck_t ctx); 233extern void e2fsck_pass3(e2fsck_t ctx); 234extern void e2fsck_pass4(e2fsck_t ctx); 235extern void e2fsck_pass5(e2fsck_t ctx); 236 237/* e2fsck.c */ 238extern errcode_t e2fsck_allocate_context(e2fsck_t *ret); 239extern errcode_t e2fsck_reset_context(e2fsck_t ctx); 240extern void e2fsck_free_context(e2fsck_t ctx); 241extern int e2fsck_run(e2fsck_t ctx); 242 243 244/* badblock.c */ 245extern void read_bad_blocks_file(e2fsck_t ctx, const char *bad_blocks_file, 246 int replace_bad_blocks); 247extern void test_disk(e2fsck_t ctx); 248 249/* dirinfo.c */ 250extern void e2fsck_add_dir_info(e2fsck_t ctx, ino_t ino, ino_t parent); 251extern struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ino_t ino); 252extern void e2fsck_free_dir_info(e2fsck_t ctx); 253extern int e2fsck_get_num_dirs(e2fsck_t ctx); 254extern int e2fsck_get_num_dirinfo(e2fsck_t ctx); 255extern struct dir_info *e2fsck_dir_info_iter(e2fsck_t ctx, int *control); 256 257/* ehandler.c */ 258extern const char *ehandler_operation(const char *op); 259extern void ehandler_init(io_channel channel); 260 261/* pass1.c */ 262extern void e2fsck_use_inode_shortcuts(e2fsck_t ctx, int bool); 263extern int e2fsck_pass1_check_device_inode(struct ext2_inode *inode); 264 265/* pass2.c */ 266extern int e2fsck_process_bad_inode(e2fsck_t ctx, ino_t dir, ino_t ino); 267 268/* pass3.c */ 269extern int e2fsck_reconnect_file(e2fsck_t ctx, ino_t inode); 270 271/* super.c */ 272void check_super_block(e2fsck_t ctx); 273errcode_t e2fsck_get_device_size(e2fsck_t ctx); 274 275/* swapfs.c */ 276void swap_filesys(e2fsck_t ctx); 277 278/* util.c */ 279extern void *e2fsck_allocate_memory(e2fsck_t ctx, unsigned int size, 280 const char *description); 281extern int ask(e2fsck_t ctx, const char * string, int def); 282extern int ask_yn(const char * string, int def); 283extern void fatal_error(e2fsck_t ctx, const char * fmt_string); 284extern void e2fsck_read_bitmaps(e2fsck_t ctx); 285extern void e2fsck_write_bitmaps(e2fsck_t ctx); 286extern void preenhalt(e2fsck_t ctx); 287#ifdef RESOURCE_TRACK 288extern void print_resource_track(const char *desc, 289 struct resource_track *track); 290extern void init_resource_track(struct resource_track *track); 291#endif 292extern int inode_has_valid_blocks(struct ext2_inode *inode); 293extern void e2fsck_read_inode(e2fsck_t ctx, unsigned long ino, 294 struct ext2_inode * inode, const char * proc); 295extern void e2fsck_write_inode(e2fsck_t ctx, unsigned long ino, 296 struct ext2_inode * inode, const char * proc); 297#ifdef MTRACE 298extern void mtrace_print(char *mesg); 299#endif 300extern blk_t get_backup_sb(ext2_filsys fs); 301 302