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