4 * Copyright (C) 1993, 1994 Theodore Ts'o. This file may be
5 * redistributed under the terms of the GNU Public License.
16 #ifdef HAVE_SYS_TYPES_H
17 #include <sys/types.h>
19 #ifdef HAVE_SYS_TIME_H
26 #if EXT2_FLAT_INCLUDES
30 #include <linux/ext2_fs.h>
31 #include "ext2fs/ext2fs.h"
37 #define _(a) (gettext (a))
39 #define N_(a) gettext_noop (a)
44 #define NLS_CAT_NAME "e2fsprogs"
45 #define LOCALEDIR "/usr/share/locale"
53 /* Everything is STDC, these days */
57 * Exit codes used by fsck-type programs
59 #define FSCK_OK 0 /* No errors */
60 #define FSCK_NONDESTRUCT 1 /* File system errors corrected */
61 #define FSCK_REBOOT 2 /* System should be rebooted */
62 #define FSCK_UNCORRECTED 4 /* File system errors left uncorrected */
63 #define FSCK_ERROR 8 /* Operational error */
64 #define FSCK_USAGE 16 /* Usage or syntax error */
65 #define FSCK_LIBRARY 128 /* Shared library error */
68 * The last ext2fs revision level that this version of e2fsck is able to
71 #define E2FSCK_CURRENT_REV 1
74 * The directory information structure; stores directory information
75 * collected in earlier passes, to avoid disk i/o in fetching the
76 * directory information.
79 ino_t ino
; /* Inode number */
80 ino_t dotdot
; /* Parent according to '..' */
81 ino_t parent
; /* Parent according to treewalk */
86 * This structure is used for keeping track of how much resources have
87 * been used for a particular pass of e2fsck.
89 struct resource_track
{
90 struct timeval time_start
;
91 struct timeval user_start
;
92 struct timeval system_start
;
100 #define E2F_OPT_READONLY 0x0001
101 #define E2F_OPT_PREEN 0x0002
102 #define E2F_OPT_YES 0x0004
103 #define E2F_OPT_NO 0x0008
104 #define E2F_OPT_TIME 0x0010
105 #define E2F_OPT_TIME2 0x0020
106 #define E2F_OPT_CHECKBLOCKS 0x0040
107 #define E2F_OPT_DEBUG 0x0080
112 #define E2F_FLAG_ABORT 0x0001 /* Abort signaled */
113 #define E2F_FLAG_CANCEL 0x0002 /* Cancel signaled */
114 #define E2F_FLAG_SIGNAL_MASK 0x0003
115 #define E2F_FLAG_RESTART 0x0004 /* Restart signaled */
117 #define E2F_FLAG_SETJMP_OK 0x0010 /* Setjmp valid for abort */
119 #define E2F_FLAG_PROG_BAR 0x0020 /* Progress bar on screen */
120 #define E2F_FLAG_PROG_SUPPRESS 0x0040 /* Progress suspended */
123 * Defines for indicating the e2fsck pass number
130 #define E2F_PASS_1B 6
133 * This is the global e2fsck structure.
135 typedef struct e2fsck_struct
*e2fsck_t
;
137 struct e2fsck_struct
{
139 const char *program_name
;
140 const char *filesystem_name
;
141 const char *device_name
;
142 int flags
; /* E2fsck internal flags */
144 blk_t use_superblock
; /* sb requested by user */
145 blk_t superblock
; /* sb used to open fs */
146 blk_t num_blocks
; /* Total number of blocks */
151 unsigned long abort_code
;
153 int (*progress
)(e2fsck_t ctx
, int pass
, unsigned long cur
,
156 ext2fs_inode_bitmap inode_used_map
; /* Inodes which are in use */
157 ext2fs_inode_bitmap inode_bad_map
; /* Inodes which are bad somehow */
158 ext2fs_inode_bitmap inode_dir_map
; /* Inodes which are directories */
159 ext2fs_inode_bitmap inode_bb_map
; /* Inodes which are in bad blocks */
160 ext2fs_inode_bitmap inode_imagic_map
; /* AFS inodes */
161 ext2fs_inode_bitmap inode_reg_map
; /* Inodes which are regular files*/
163 ext2fs_block_bitmap block_found_map
; /* Blocks which are in use */
164 ext2fs_block_bitmap block_dup_map
; /* Blks referenced more than once */
165 ext2fs_block_bitmap block_illegal_map
; /* Meta-data blocks */
170 ext2_icount_t inode_count
;
171 ext2_icount_t inode_link_info
;
174 * Array of flags indicating whether an inode bitmap, block
175 * bitmap, or inode table is invalid
177 int *invalid_inode_bitmap_flag
;
178 int *invalid_block_bitmap_flag
;
179 int *invalid_inode_table_flag
;
180 int invalid_bitmaps
; /* There are invalid bitmaps/itable */
188 * For pass1_check_directory and pass1_get_blocks
191 struct ext2_inode
*stashed_inode
;
194 * Directory information
198 struct dir_info
*dir_info
;
203 int process_inode_size
;
204 int inode_buffer_blocks
;
206 #ifdef RESOURCE_TRACK
208 * For timing purposes
210 struct resource_track global_rtrack
;
214 * How we display the progress update (for unix)
218 int progress_last_percent
;
221 int fs_directory_count
;
222 int fs_regular_count
;
223 int fs_blockdev_count
;
224 int fs_chardev_count
;
226 int fs_symlinks_count
;
227 int fs_fast_symlinks_count
;
230 int fs_badblocks_count
;
231 int fs_sockets_count
;
239 * For the use of callers of the e2fsck functions; not used by
240 * e2fsck functions themselves.
247 * Procedure declarations
250 extern void e2fsck_pass1(e2fsck_t ctx
);
251 extern void e2fsck_pass1_dupblocks(e2fsck_t ctx
, char *block_buf
);
252 extern void e2fsck_pass2(e2fsck_t ctx
);
253 extern void e2fsck_pass3(e2fsck_t ctx
);
254 extern void e2fsck_pass4(e2fsck_t ctx
);
255 extern void e2fsck_pass5(e2fsck_t ctx
);
258 extern errcode_t
e2fsck_allocate_context(e2fsck_t
*ret
);
259 extern errcode_t
e2fsck_reset_context(e2fsck_t ctx
);
260 extern void e2fsck_free_context(e2fsck_t ctx
);
261 extern int e2fsck_run(e2fsck_t ctx
);
265 extern void read_bad_blocks_file(e2fsck_t ctx
, const char *bad_blocks_file
,
266 int replace_bad_blocks
);
267 extern void test_disk(e2fsck_t ctx
);
270 extern void e2fsck_add_dir_info(e2fsck_t ctx
, ino_t ino
, ino_t parent
);
271 extern struct dir_info
*e2fsck_get_dir_info(e2fsck_t ctx
, ino_t ino
);
272 extern void e2fsck_free_dir_info(e2fsck_t ctx
);
273 extern int e2fsck_get_num_dirs(e2fsck_t ctx
);
274 extern int e2fsck_get_num_dirinfo(e2fsck_t ctx
);
275 extern struct dir_info
*e2fsck_dir_info_iter(e2fsck_t ctx
, int *control
);
278 extern const char *ehandler_operation(const char *op
);
279 extern void ehandler_init(io_channel channel
);
282 extern void e2fsck_use_inode_shortcuts(e2fsck_t ctx
, int bool);
283 extern int e2fsck_pass1_check_device_inode(struct ext2_inode
*inode
);
286 extern int e2fsck_process_bad_inode(e2fsck_t ctx
, ino_t dir
, ino_t ino
);
289 extern int e2fsck_reconnect_file(e2fsck_t ctx
, ino_t inode
);
292 void check_super_block(e2fsck_t ctx
);
293 errcode_t
e2fsck_get_device_size(e2fsck_t ctx
);
296 void swap_filesys(e2fsck_t ctx
);
299 extern void *e2fsck_allocate_memory(e2fsck_t ctx
, unsigned int size
,
300 const char *description
);
301 extern int ask(e2fsck_t ctx
, const char * string
, int def
);
302 extern int ask_yn(const char * string
, int def
);
303 extern void fatal_error(e2fsck_t ctx
, const char * fmt_string
);
304 extern void e2fsck_read_bitmaps(e2fsck_t ctx
);
305 extern void e2fsck_write_bitmaps(e2fsck_t ctx
);
306 extern void preenhalt(e2fsck_t ctx
);
307 #ifdef RESOURCE_TRACK
308 extern void print_resource_track(const char *desc
,
309 struct resource_track
*track
);
310 extern void init_resource_track(struct resource_track
*track
);
312 extern int inode_has_valid_blocks(struct ext2_inode
*inode
);
313 extern void e2fsck_read_inode(e2fsck_t ctx
, unsigned long ino
,
314 struct ext2_inode
* inode
, const char * proc
);
315 extern void e2fsck_write_inode(e2fsck_t ctx
, unsigned long ino
,
316 struct ext2_inode
* inode
, const char * proc
);
318 extern void mtrace_print(char *mesg
);
320 extern blk_t
get_backup_sb(ext2_filsys fs
);
321 extern int ext2_file_type(unsigned int mode
);
324 extern void e2fsck_clear_progbar(e2fsck_t ctx
);