e2fsck.h revision b7a00563b22b0ea47ddc7117508c0b8e0d65df43
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#if EXT2_FLAT_INCLUDES
27#include "ext2_fs.h"
28#include "ext2fs.h"
29#else
30#include "ext2fs/ext2_fs.h"
31#include "ext2fs/ext2fs.h"
32#endif
33
34#ifdef ENABLE_NLS
35#include <libintl.h>
36#include <locale.h>
37#define _(a) (gettext (a))
38#ifdef gettext_noop
39#define N_(a) gettext_noop (a)
40#else
41#define N_(a) (a)
42#endif
43/* FIXME */
44#define NLS_CAT_NAME "e2fsprogs"
45#define LOCALEDIR "/usr/share/locale"
46/* FIXME */
47#else
48#define _(a) (a)
49#define N_(a) a
50#endif
51
52/*
53 * Exit codes used by fsck-type programs
54 */
55#define FSCK_OK          0	/* No errors */
56#define FSCK_NONDESTRUCT 1	/* File system errors corrected */
57#define FSCK_REBOOT      2	/* System should be rebooted */
58#define FSCK_UNCORRECTED 4	/* File system errors left uncorrected */
59#define FSCK_ERROR       8	/* Operational error */
60#define FSCK_USAGE       16	/* Usage or syntax error */
61#define FSCK_LIBRARY     128	/* Shared library error */
62
63/*
64 * The last ext2fs revision level that this version of e2fsck is able to
65 * support
66 */
67#define E2FSCK_CURRENT_REV	1
68
69/*
70 * The directory information structure; stores directory information
71 * collected in earlier passes, to avoid disk i/o in fetching the
72 * directory information.
73 */
74struct dir_info {
75	ext2_ino_t		ino;	/* Inode number */
76	ext2_ino_t		dotdot;	/* Parent according to '..' */
77	ext2_ino_t		parent; /* Parent according to treewalk */
78};
79
80
81/*
82 * The indexed directory information structure; stores information for
83 * directories which contain a hash tree index.
84 */
85struct dx_dir_info {
86	ext2_ino_t		ino; 		/* Inode number */
87	int			numblocks;	/* number of blocks */
88	int			hashversion;
89	struct dx_dirblock_info	*dx_block; 	/* Array of size numblocks */
90};
91
92#define DX_DIRBLOCK_ROOT	1
93#define DX_DIRBLOCK_LEAF	2
94#define DX_DIRBLOCK_NODE	3
95#define DX_DIRBLOCK_CORRUPT	4
96#define DX_DIRBLOCK_CLEARED	8
97
98struct dx_dirblock_info {
99	int		type;
100	blk_t		phys;
101	int		flags;
102	blk_t		parent;
103	ext2_dirhash_t	min_hash;
104	ext2_dirhash_t	max_hash;
105	ext2_dirhash_t	node_min_hash;
106	ext2_dirhash_t	node_max_hash;
107};
108
109#define DX_FLAG_REFERENCED	1
110#define DX_FLAG_DUP_REF		2
111#define DX_FLAG_FIRST		4
112#define DX_FLAG_LAST		8
113
114#ifdef RESOURCE_TRACK
115/*
116 * This structure is used for keeping track of how much resources have
117 * been used for a particular pass of e2fsck.
118 */
119struct resource_track {
120	struct timeval time_start;
121	struct timeval user_start;
122	struct timeval system_start;
123	void	*brk_start;
124};
125#endif
126
127/*
128 * E2fsck options
129 */
130#define E2F_OPT_READONLY	0x0001
131#define E2F_OPT_PREEN		0x0002
132#define E2F_OPT_YES		0x0004
133#define E2F_OPT_NO		0x0008
134#define E2F_OPT_TIME		0x0010
135#define E2F_OPT_TIME2		0x0020
136#define E2F_OPT_CHECKBLOCKS	0x0040
137#define E2F_OPT_DEBUG		0x0080
138#define E2F_OPT_FORCE		0x0100
139#define E2F_OPT_WRITECHECK	0x0200
140
141/*
142 * E2fsck flags
143 */
144#define E2F_FLAG_ABORT		0x0001 /* Abort signaled */
145#define E2F_FLAG_CANCEL		0x0002 /* Cancel signaled */
146#define E2F_FLAG_SIGNAL_MASK	0x0003
147#define E2F_FLAG_RESTART	0x0004 /* Restart signaled */
148
149#define E2F_FLAG_SETJMP_OK	0x0010 /* Setjmp valid for abort */
150
151#define E2F_FLAG_PROG_BAR	0x0020 /* Progress bar on screen */
152#define E2F_FLAG_PROG_SUPPRESS	0x0040 /* Progress suspended */
153#define E2F_FLAG_JOURNAL_INODE	0x0080 /* Create a new ext3 journal inode */
154#define E2F_FLAG_SB_SPECIFIED	0x0100 /* The superblock was explicitly
155					* specified by the user */
156
157/*
158 * Defines for indicating the e2fsck pass number
159 */
160#define E2F_PASS_1	1
161#define E2F_PASS_2	2
162#define E2F_PASS_3	3
163#define E2F_PASS_4	4
164#define E2F_PASS_5	5
165#define E2F_PASS_1B	6
166
167/*
168 * Define the extended attribute refcount structure
169 */
170typedef struct ea_refcount *ext2_refcount_t;
171
172/*
173 * This is the global e2fsck structure.
174 */
175typedef struct e2fsck_struct *e2fsck_t;
176
177struct e2fsck_struct {
178	ext2_filsys fs;
179	const char *program_name;
180	const char *filesystem_name;
181	const char *device_name;
182	int	flags;		/* E2fsck internal flags */
183	int	options;
184	blk_t	use_superblock;	/* sb requested by user */
185	blk_t	superblock;	/* sb used to open fs */
186	int	blocksize;	/* blocksize */
187	blk_t	num_blocks;	/* Total number of blocks */
188
189#ifdef HAVE_SETJMP_H
190	jmp_buf	abort_loc;
191#endif
192	unsigned long abort_code;
193
194	int (*progress)(e2fsck_t ctx, int pass, unsigned long cur,
195			unsigned long max);
196
197	ext2fs_inode_bitmap inode_used_map; /* Inodes which are in use */
198	ext2fs_inode_bitmap inode_bad_map; /* Inodes which are bad somehow */
199	ext2fs_inode_bitmap inode_dir_map; /* Inodes which are directories */
200	ext2fs_inode_bitmap inode_bb_map; /* Inodes which are in bad blocks */
201	ext2fs_inode_bitmap inode_imagic_map; /* AFS inodes */
202	ext2fs_inode_bitmap inode_reg_map; /* Inodes which are regular files*/
203
204	ext2fs_block_bitmap block_found_map; /* Blocks which are in use */
205	ext2fs_block_bitmap block_dup_map; /* Blks referenced more than once */
206	ext2fs_block_bitmap block_ea_map; /* Blocks which are used by EA's */
207
208	/*
209	 * Inode count arrays
210	 */
211	ext2_icount_t	inode_count;
212	ext2_icount_t inode_link_info;
213
214	ext2_refcount_t	refcount;
215	ext2_refcount_t refcount_extra;
216
217	/*
218	 * Array of flags indicating whether an inode bitmap, block
219	 * bitmap, or inode table is invalid
220	 */
221	int *invalid_inode_bitmap_flag;
222	int *invalid_block_bitmap_flag;
223	int *invalid_inode_table_flag;
224	int invalid_bitmaps;	/* There are invalid bitmaps/itable */
225
226	/*
227	 * Block buffer
228	 */
229	char *block_buf;
230
231	/*
232	 * For pass1_check_directory and pass1_get_blocks
233	 */
234	ext2_ino_t stashed_ino;
235	struct ext2_inode *stashed_inode;
236
237	/*
238	 * Directory information
239	 */
240	int		dir_info_count;
241	int		dir_info_size;
242	struct dir_info	*dir_info;
243
244	/*
245	 * Indexed directory information
246	 */
247	int		dx_dir_info_count;
248	int		dx_dir_info_size;
249	struct dx_dir_info *dx_dir_info;
250
251	/*
252	 * Directories to hash
253	 */
254	ext2_u32_list	dirs_to_hash;
255
256	/*
257	 * Tuning parameters
258	 */
259	int process_inode_size;
260	int inode_buffer_blocks;
261
262	/*
263	 * ext3 journal support
264	 */
265	io_channel	journal_io;
266	const char	*journal_name;
267
268#ifdef RESOURCE_TRACK
269	/*
270	 * For timing purposes
271	 */
272	struct resource_track	global_rtrack;
273#endif
274
275	/*
276	 * How we display the progress update (for unix)
277	 */
278	int progress_fd;
279	int progress_pos;
280	int progress_last_percent;
281	unsigned int progress_last_time;
282
283	/* File counts */
284	int fs_directory_count;
285	int fs_regular_count;
286	int fs_blockdev_count;
287	int fs_chardev_count;
288	int fs_links_count;
289	int fs_symlinks_count;
290	int fs_fast_symlinks_count;
291	int fs_fifo_count;
292	int fs_total_count;
293	int fs_badblocks_count;
294	int fs_sockets_count;
295	int fs_ind_count;
296	int fs_dind_count;
297	int fs_tind_count;
298	int fs_fragmented;
299	int large_files;
300	int fs_ext_attr_inodes;
301	int fs_ext_attr_blocks;
302
303	/*
304	 * For the use of callers of the e2fsck functions; not used by
305	 * e2fsck functions themselves.
306	 */
307	void *priv_data;
308};
309
310/* Used by the region allocation code */
311typedef __u32 region_addr_t;
312typedef struct region_struct *region_t;
313
314/*
315 * Procedure declarations
316 */
317
318extern void e2fsck_pass1(e2fsck_t ctx);
319extern void e2fsck_pass1_dupblocks(e2fsck_t ctx, char *block_buf);
320extern void e2fsck_pass2(e2fsck_t ctx);
321extern void e2fsck_pass3(e2fsck_t ctx);
322extern void e2fsck_pass4(e2fsck_t ctx);
323extern void e2fsck_pass5(e2fsck_t ctx);
324
325/* e2fsck.c */
326extern errcode_t e2fsck_allocate_context(e2fsck_t *ret);
327extern errcode_t e2fsck_reset_context(e2fsck_t ctx);
328extern void e2fsck_free_context(e2fsck_t ctx);
329extern int e2fsck_run(e2fsck_t ctx);
330
331
332/* badblock.c */
333extern void read_bad_blocks_file(e2fsck_t ctx, const char *bad_blocks_file,
334				 int replace_bad_blocks);
335extern void test_disk(e2fsck_t ctx);
336
337/* dirinfo.c */
338extern void e2fsck_add_dir_info(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t parent);
339extern struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ext2_ino_t ino);
340extern void e2fsck_free_dir_info(e2fsck_t ctx);
341extern int e2fsck_get_num_dirinfo(e2fsck_t ctx);
342extern struct dir_info *e2fsck_dir_info_iter(e2fsck_t ctx, int *control);
343
344/* dx_dirinfo.c */
345extern void e2fsck_add_dx_dir(e2fsck_t ctx, ext2_ino_t ino, int num_blocks);
346extern struct dx_dir_info *e2fsck_get_dx_dir_info(e2fsck_t ctx, ext2_ino_t ino);
347extern void e2fsck_free_dx_dir_info(e2fsck_t ctx);
348extern int e2fsck_get_num_dx_dirinfo(e2fsck_t ctx);
349extern struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx, int *control);
350
351/* ea_refcount.c */
352extern errcode_t ea_refcount_create(int size, ext2_refcount_t *ret);
353extern void ea_refcount_free(ext2_refcount_t refcount);
354extern errcode_t ea_refcount_fetch(ext2_refcount_t refcount, blk_t blk,
355				   int *ret);
356extern errcode_t ea_refcount_increment(ext2_refcount_t refcount,
357				       blk_t blk, int *ret);
358extern errcode_t ea_refcount_decrement(ext2_refcount_t refcount,
359				       blk_t blk, int *ret);
360extern errcode_t ea_refcount_store(ext2_refcount_t refcount,
361				   blk_t blk, int count);
362extern blk_t ext2fs_get_refcount_size(ext2_refcount_t refcount);
363extern void ea_refcount_intr_begin(ext2_refcount_t refcount);
364extern blk_t ea_refcount_intr_next(ext2_refcount_t refcount, int *ret);
365
366/* ehandler.c */
367extern const char *ehandler_operation(const char *op);
368extern void ehandler_init(io_channel channel);
369
370/* journal.c */
371extern int e2fsck_check_ext3_journal(e2fsck_t ctx);
372extern int e2fsck_run_ext3_journal(e2fsck_t ctx);
373extern void e2fsck_move_ext3_journal(e2fsck_t ctx);
374
375/* pass1.c */
376extern void e2fsck_use_inode_shortcuts(e2fsck_t ctx, int bool);
377extern int e2fsck_pass1_check_device_inode(struct ext2_inode *inode);
378extern int e2fsck_pass1_check_symlink(ext2_filsys fs,
379				      struct ext2_inode *inode, char *buf);
380
381/* pass2.c */
382extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
383				    ext2_ino_t ino, char *buf);
384
385/* pass3.c */
386extern int e2fsck_reconnect_file(e2fsck_t ctx, ext2_ino_t inode);
387extern errcode_t e2fsck_expand_directory(e2fsck_t ctx, ext2_ino_t dir,
388					 int num, int gauranteed_size);
389
390
391/* region.c */
392extern region_t region_create(region_addr_t min, region_addr_t max);
393extern void region_free(region_t region);
394extern int region_allocate(region_t region, region_addr_t start, int n);
395
396/* rehash.c */
397errcode_t e2fsck_rehash_dir(e2fsck_t ctx, ext2_ino_t ino);
398void e2fsck_rehash_directories(e2fsck_t ctx);
399
400/* super.c */
401void check_super_block(e2fsck_t ctx);
402errcode_t e2fsck_get_device_size(e2fsck_t ctx);
403
404/* swapfs.c */
405void swap_filesys(e2fsck_t ctx);
406
407/* util.c */
408extern void *e2fsck_allocate_memory(e2fsck_t ctx, unsigned int size,
409				    const char *description);
410extern int ask(e2fsck_t ctx, const char * string, int def);
411extern int ask_yn(const char * string, int def);
412extern void fatal_error(e2fsck_t ctx, const char * fmt_string);
413extern void e2fsck_read_bitmaps(e2fsck_t ctx);
414extern void e2fsck_write_bitmaps(e2fsck_t ctx);
415extern void preenhalt(e2fsck_t ctx);
416#ifdef RESOURCE_TRACK
417extern void print_resource_track(const char *desc,
418				 struct resource_track *track);
419extern void init_resource_track(struct resource_track *track);
420#endif
421extern int inode_has_valid_blocks(struct ext2_inode *inode);
422extern void e2fsck_read_inode(e2fsck_t ctx, unsigned long ino,
423			      struct ext2_inode * inode, const char * proc);
424extern void e2fsck_write_inode(e2fsck_t ctx, unsigned long ino,
425			       struct ext2_inode * inode, const char * proc);
426#ifdef MTRACE
427extern void mtrace_print(char *mesg);
428#endif
429extern blk_t get_backup_sb(e2fsck_t ctx, ext2_filsys fs,
430			   const char *name, io_manager manager);
431extern int ext2_file_type(unsigned int mode);
432
433/* unix.c */
434extern void e2fsck_clear_progbar(e2fsck_t ctx);
435