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