e2fsck.h revision 8bf191e8660939687ef35c013066d2082cb16722
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * e2fsck.h
33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993, 1994 Theodore Ts'o.  This file may be
53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * redistributed under the terms of the GNU Public License.
63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h>
103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h>
113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h>
123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h>
13b2da22d14b6ac5aa5080c39cab46b4aa4178f90fTheodore Ts'o#ifdef HAVE_SYS_TYPES_H
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/types.h>
15b2da22d14b6ac5aa5080c39cab46b4aa4178f90fTheodore Ts'o#endif
16b2da22d14b6ac5aa5080c39cab46b4aa4178f90fTheodore Ts'o#ifdef HAVE_SYS_TIME_H
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/time.h>
18b2da22d14b6ac5aa5080c39cab46b4aa4178f90fTheodore Ts'o#endif
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef HAVE_LINUX_FS_H
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <linux/fs.h>
2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <linux/ext2_fs.h>
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ext2fs/ext2fs.h"
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#ifdef __STDC__
283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define NOARGS void
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#else
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define NOARGS
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define const
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Exit codes used by fsck-type programs
363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_OK          0	/* No errors */
383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_NONDESTRUCT 1	/* File system errors corrected */
393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_REBOOT      2	/* System should be rebooted */
403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_UNCORRECTED 4	/* File system errors left uncorrected */
413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_ERROR       8	/* Operational error */
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_USAGE       16	/* Usage or syntax error */
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define FSCK_LIBRARY     128	/* Shared library error */
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
46f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * The last ext2fs revision level that this version of e2fsck is able to
47f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * support
48f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o */
491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define E2FSCK_CURRENT_REV	1
50f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
51f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o/*
523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The directory information structure; stores directory information
533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * collected in earlier passes, to avoid disk i/o in fetching the
5421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * directory information.
553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct dir_info {
573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	ino_t			ino;	/* Inode number */
583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	ino_t			dotdot;	/* Parent according to '..' */
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	ino_t			parent; /* Parent according to treewalk */
603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o};
613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
628bf191e8660939687ef35c013066d2082cb16722Theodore Ts'o#ifdef RESOURCE_TRACK
633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This structure is used for keeping track of how much resources have
653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * been used for a particular pass of e2fsck.
663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct resource_track {
683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	struct timeval time_start;
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	struct timeval user_start;
703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	struct timeval system_start;
713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	void	*brk_start;
723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o};
738bf191e8660939687ef35c013066d2082cb16722Theodore Ts'o#endif
743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
761b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o * E2fsck options
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
781b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_READONLY	0x0001
791b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_PREEN		0x0002
801b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_YES		0x0004
811b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_NO		0x0008
821b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_TIME		0x0010
831b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_TIME2		0x0020
841b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_CHECKBLOCKS	0x0040
851b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o#define E2F_OPT_DEBUG		0x0080
863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
871b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o/*
881b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o * This is the global e2fsck structure.
891b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o */
901b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'ostruct e2fsck_struct {
911b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2_filsys fs;
921b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	const char *program_name;
931b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	const char *filesystem_name;
941b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	const char *device_name;
951b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int	options;
961b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	blk_t	use_superblock;	/* sb requested by user */
971b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	blk_t	superblock;	/* sb used to open fs */
981b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
991b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_inode_bitmap inode_used_map; /* Inodes which are in use */
1001b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_inode_bitmap inode_bad_map; /* Inodes which are bad somehow */
1011b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_inode_bitmap inode_dir_map; /* Inodes which are directories */
1021b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_inode_bitmap inode_bb_map; /* Inodes which are in bad blocks */
1031b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1041b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_block_bitmap block_found_map; /* Blocks which are in use */
1051b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_block_bitmap block_dup_map; /* Blks referenced more than once */
1061b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2fs_block_bitmap block_illegal_map; /* Meta-data blocks */
1071b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1081b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	/*
1091b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 * Inode count arrays
1101b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 */
1111b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2_icount_t	inode_count;
1121b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ext2_icount_t inode_link_info;
1131b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1141b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	/*
1151b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 * Array of flags indicating whether an inode bitmap, block
1161b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 * bitmap, or inode table is invalid
1171b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 */
1181b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int *invalid_inode_bitmap_flag;
1191b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int *invalid_block_bitmap_flag;
1201b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int *invalid_inode_table_flag;
1211b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int invalid_bitmaps;	/* There are invalid bitmaps/itable */
1221b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1231b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	/*
1241b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 * For pass1_check_directory and pass1_get_blocks
1251b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 */
1261b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	ino_t stashed_ino;
1271b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	struct ext2_inode *stashed_inode;
1281b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1291b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	/*
1301b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 * Tuning parameters
1311b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 */
1321b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int process_inode_size;
1331b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int inode_buffer_blocks;
1341b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1358bf191e8660939687ef35c013066d2082cb16722Theodore Ts'o#ifdef RESOURCE_TRACK
1361b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	/*
1371b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 * For timing purposes
1381b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	 */
1391b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	struct resource_track	global_rtrack;
1408bf191e8660939687ef35c013066d2082cb16722Theodore Ts'o#endif
1411b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1421b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	/* File counts */
1431b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_directory_count;
1441b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_regular_count;
1451b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_blockdev_count;
1461b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_chardev_count;
1471b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_links_count;
1481b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_symlinks_count;
1491b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_fast_symlinks_count;
1501b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_fifo_count;
1511b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_total_count;
1521b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_badblocks_count;
1531b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_sockets_count;
1541b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_ind_count;
1551b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_dind_count;
1561b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_tind_count;
1571b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o	int fs_fragmented;
1581b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o};
159f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
1601b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'otypedef struct e2fsck_struct *e2fsck_t;
161f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
1623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
1631b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o * Variables
1641e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
1651b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern int restart_e2fsck;
1661e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1671e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
1683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Procedure declarations
1693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
1703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1711b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void pass1(e2fsck_t ctx);
1721b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void pass1_dupblocks(e2fsck_t ctx, char *block_buf);
1731b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void pass2(e2fsck_t ctx);
1741b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void pass3(e2fsck_t ctx);
1751b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void pass4(e2fsck_t ctx);
1761b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void pass5(e2fsck_t ctx);
1771b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
1781b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o/* e2fsck.c */
1791b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oerrcode_t e2fsck_allocate_context(e2fsck_t *ret);
1801b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oerrcode_t e2fsck_reset_context(e2fsck_t ctx);
1811b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'ovoid e2fsck_free_context(e2fsck_t ctx);
1823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1831e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* pass1.c */
1841e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern errcode_t pass1_check_directory(ext2_filsys fs, ino_t ino);
1851e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern errcode_t pass1_get_blocks(ext2_filsys fs, ino_t ino, blk_t *blocks);
1861e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern errcode_t pass1_read_inode(ext2_filsys fs, ino_t ino,
1871e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				  struct ext2_inode *inode);
1881e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern errcode_t pass1_write_inode(ext2_filsys fs, ino_t ino,
1891e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				   struct ext2_inode *inode);
1907cf73dcd3d173d88ceab26d381f4abac362d8518Theodore Ts'oextern int e2fsck_pass1_check_device_inode(struct ext2_inode *inode);
1911e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
1923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* badblock.c */
1931b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void read_bad_blocks_file(e2fsck_t ctx, const char *bad_blocks_file,
1943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				 int replace_bad_blocks);
1951b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void test_disk(e2fsck_t ctx);
1963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* dirinfo.c */
19821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void add_dir_info(ext2_filsys fs, ino_t ino, ino_t parent);
1993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern struct dir_info *get_dir_info(ino_t ino);
2003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void free_dir_info(ext2_filsys fs);
2013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int get_num_dirs(ext2_filsys fs);
20221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern struct dir_info *dir_info_iter(int *control);
2033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* ehandler.c */
2053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ehandler_operation(const char *op);
2063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ehandler_init(io_channel channel);
2073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2081b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o/* super.c */
2091b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'ovoid check_super_block(e2fsck_t ctx);
2101b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o
2111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* swapfs.c */
2121b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'ovoid swap_filesys(e2fsck_t ctx);
2131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
2143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* util.c */
2153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void *allocate_memory(int size, const char *description);
2161b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern int ask(e2fsck_t ctx, const char * string, int def);
2173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int ask_yn(const char * string, int def);
2183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void fatal_error (const char * fmt_string);
2191b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void read_bitmaps(e2fsck_t ctx);
2201b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void write_bitmaps(e2fsck_t ctx);
2211b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void preenhalt(e2fsck_t ctx);
2228bf191e8660939687ef35c013066d2082cb16722Theodore Ts'o#ifdef RESOURCE_TRACK
2231b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern void print_resource_track(const char *desc,
2241b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'o				 struct resource_track *track);
2253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void init_resource_track(struct resource_track *track);
2268bf191e8660939687ef35c013066d2082cb16722Theodore Ts'o#endif
2273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int inode_has_valid_blocks(struct ext2_inode *inode);
228f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void e2fsck_read_inode(ext2_filsys fs, unsigned long ino,
229f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o			      struct ext2_inode * inode, const char * proc);
230f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void e2fsck_write_inode(ext2_filsys fs, unsigned long ino,
231f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o			       struct ext2_inode * inode, const char * proc);
2323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#ifdef MTRACE
2333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void mtrace_print(char *mesg);
2343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
2351b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern blk_t get_backup_sb(ext2_filsys fs);
2363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define die(str)	fatal_error(str)
2383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
2403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * pass3.c
2413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
2421b6bf1759af884957234b7dce768b785f792abd0Theodore Ts'oextern int reconnect_file(e2fsck_t ctx, ino_t inode);
243