pass1.c revision e3507739e4185bdb2394928eb6479e48f4e690a8
1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/*
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * pass1.c -- pass #1 of e2fsck: sequential scan of the inode table
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Copyright (C) 1993, 1994, 1995, 1996, 1997 Theodore Ts'o.
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * %Begin-Header%
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * This file may be redistributed under the terms of the GNU Public
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * License.
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * %End-Header%
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Pass 1 of e2fsck iterates over all the inodes in the filesystems,
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * and applies the following tests to each inode:
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- The mode field of the inode must be legal.
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- The size and block count fields of the inode are correct.
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A data block must not be used by another inode
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Pass 1 also gathers the collects the following information:
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which inodes are in use.		(inode_used_map)
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which inodes are directories.	(inode_dir_map)
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which inodes are regular files.	(inode_reg_map)
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which inodes have bad fields.	(inode_bad_map)
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which inodes are in bad blocks.	(inode_bb_map)
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which inodes are imagic inodes.	(inode_imagic_map)
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which blocks are in use.		(block_found_map)
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- A bitmap of which blocks are in use by two inodes	(block_dup_map)
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 	- The data blocks of the directory inodes.	(dir_map)
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Pass 1 is designed to stash away enough information so that the
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * other passes should not need to read in the inode information
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * during the normal course of a filesystem check.  (Althogh if an
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * inconsistency is detected, other passes may need to read in an
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * inode to fix it.)
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Note that pass 1B will be invoked if there are any duplicate blocks
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * found.
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch */
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define _GNU_SOURCE 1 /* get strnlen() */
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "config.h"
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string.h>
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <time.h>
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifdef HAVE_ERRNO_H
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <errno.h>
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "e2fsck.h"
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <ext2fs/ext2_ext_attr.h>
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "problem.h"
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifdef NO_INLINE_FUNCS
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define _INLINE_
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define _INLINE_ inline
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic int process_block(ext2_filsys fs, blk64_t	*blocknr,
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch			 e2_blkcnt_t blockcnt, blk64_t ref_blk,
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch			 int ref_offset, void *priv_data);
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstatic int process_bad_block(ext2_filsys fs, blk64_t *block_nr,
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch			     e2_blkcnt_t blockcnt, blk64_t ref_blk,
64			     int ref_offset, void *priv_data);
65static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
66			 char *block_buf);
67static void mark_table_blocks(e2fsck_t ctx);
68static void alloc_bb_map(e2fsck_t ctx);
69static void alloc_imagic_map(e2fsck_t ctx);
70static void mark_inode_bad(e2fsck_t ctx, ino_t ino);
71static void handle_fs_bad_blocks(e2fsck_t ctx);
72static void process_inodes(e2fsck_t ctx, char *block_buf);
73static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b);
74static errcode_t scan_callback(ext2_filsys fs, ext2_inode_scan scan,
75				  dgrp_t group, void * priv_data);
76static void adjust_extattr_refcount(e2fsck_t ctx, ext2_refcount_t refcount,
77				    char *block_buf, int adjust_sign);
78/* static char *describe_illegal_block(ext2_filsys fs, blk64_t block); */
79
80struct process_block_struct {
81	ext2_ino_t	ino;
82	unsigned	is_dir:1, is_reg:1, clear:1, suppress:1,
83				fragmented:1, compressed:1, bbcheck:1;
84	blk64_t		num_blocks;
85	blk64_t		max_blocks;
86	e2_blkcnt_t	last_block;
87	e2_blkcnt_t	last_init_lblock;
88	e2_blkcnt_t	last_db_block;
89	int		num_illegal_blocks;
90	blk64_t		previous_block;
91	struct ext2_inode *inode;
92	struct problem_context *pctx;
93	ext2fs_block_bitmap fs_meta_blocks;
94	e2fsck_t	ctx;
95};
96
97struct process_inode_block {
98	ext2_ino_t ino;
99	struct ext2_inode inode;
100};
101
102struct scan_callback_struct {
103	e2fsck_t	ctx;
104	char		*block_buf;
105};
106
107/*
108 * For the inodes to process list.
109 */
110static struct process_inode_block *inodes_to_process;
111static int process_inode_count;
112
113static __u64 ext2_max_sizes[EXT2_MAX_BLOCK_LOG_SIZE -
114			    EXT2_MIN_BLOCK_LOG_SIZE + 1];
115
116/*
117 * Free all memory allocated by pass1 in preparation for restarting
118 * things.
119 */
120static void unwind_pass1(ext2_filsys fs EXT2FS_ATTR((unused)))
121{
122	ext2fs_free_mem(&inodes_to_process);
123	inodes_to_process = 0;
124}
125
126/*
127 * Check to make sure a device inode is real.  Returns 1 if the device
128 * checks out, 0 if not.
129 *
130 * Note: this routine is now also used to check FIFO's and Sockets,
131 * since they have the same requirement; the i_block fields should be
132 * zero.
133 */
134int e2fsck_pass1_check_device_inode(ext2_filsys fs EXT2FS_ATTR((unused)),
135				    struct ext2_inode *inode)
136{
137	int	i;
138
139	/*
140	 * If the index flag is set, then this is a bogus
141	 * device/fifo/socket
142	 */
143	if (inode->i_flags & EXT2_INDEX_FL)
144		return 0;
145
146	/*
147	 * We should be able to do the test below all the time, but
148	 * because the kernel doesn't forcibly clear the device
149	 * inode's additional i_block fields, there are some rare
150	 * occasions when a legitimate device inode will have non-zero
151	 * additional i_block fields.  So for now, we only complain
152	 * when the immutable flag is set, which should never happen
153	 * for devices.  (And that's when the problem is caused, since
154	 * you can't set or clear immutable flags for devices.)  Once
155	 * the kernel has been fixed we can change this...
156	 */
157	if (inode->i_flags & (EXT2_IMMUTABLE_FL | EXT2_APPEND_FL)) {
158		for (i=4; i < EXT2_N_BLOCKS; i++)
159			if (inode->i_block[i])
160				return 0;
161	}
162	return 1;
163}
164
165/*
166 * Check to make sure a symlink inode is real.  Returns 1 if the symlink
167 * checks out, 0 if not.
168 */
169int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino,
170			       struct ext2_inode *inode, char *buf)
171{
172	unsigned int len;
173	int i;
174	blk64_t	blocks;
175	ext2_extent_handle_t	handle;
176	struct ext2_extent_info	info;
177	struct ext2fs_extent	extent;
178
179	if ((inode->i_size_high || inode->i_size == 0) ||
180	    (inode->i_flags & EXT2_INDEX_FL))
181		return 0;
182
183	if (inode->i_flags & EXT4_EXTENTS_FL) {
184		if (inode->i_size > fs->blocksize)
185			return 0;
186		if (ext2fs_extent_open2(fs, ino, inode, &handle))
187			return 0;
188		i = 0;
189		if (ext2fs_extent_get_info(handle, &info) ||
190		    (info.num_entries != 1) ||
191		    (info.max_depth != 0))
192			goto exit_extent;
193		if (ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent) ||
194		    (extent.e_lblk != 0) ||
195		    (extent.e_len != 1) ||
196		    (extent.e_pblk < fs->super->s_first_data_block) ||
197		    (extent.e_pblk >= ext2fs_blocks_count(fs->super)))
198			goto exit_extent;
199		i = 1;
200	exit_extent:
201		ext2fs_extent_free(handle);
202		return i;
203	}
204
205	blocks = ext2fs_inode_data_blocks2(fs, inode);
206	if (blocks) {
207		if ((inode->i_size >= fs->blocksize) ||
208		    (blocks != fs->blocksize >> 9) ||
209		    (inode->i_block[0] < fs->super->s_first_data_block) ||
210		    (inode->i_block[0] >= ext2fs_blocks_count(fs->super)))
211			return 0;
212
213		for (i = 1; i < EXT2_N_BLOCKS; i++)
214			if (inode->i_block[i])
215				return 0;
216
217		if (io_channel_read_blk64(fs->io, inode->i_block[0], 1, buf))
218			return 0;
219
220		len = strnlen(buf, fs->blocksize);
221		if (len == fs->blocksize)
222			return 0;
223	} else {
224		if (inode->i_size >= sizeof(inode->i_block))
225			return 0;
226
227		len = strnlen((char *)inode->i_block, sizeof(inode->i_block));
228		if (len == sizeof(inode->i_block))
229			return 0;
230	}
231	if (len != inode->i_size)
232		return 0;
233	return 1;
234}
235
236/*
237 * If the immutable (or append-only) flag is set on the inode, offer
238 * to clear it.
239 */
240#define BAD_SPECIAL_FLAGS (EXT2_IMMUTABLE_FL | EXT2_APPEND_FL)
241static void check_immutable(e2fsck_t ctx, struct problem_context *pctx)
242{
243	if (!(pctx->inode->i_flags & BAD_SPECIAL_FLAGS))
244		return;
245
246	if (!fix_problem(ctx, PR_1_SET_IMMUTABLE, pctx))
247		return;
248
249	pctx->inode->i_flags &= ~BAD_SPECIAL_FLAGS;
250	e2fsck_write_inode(ctx, pctx->ino, pctx->inode, "pass1");
251}
252
253/*
254 * If device, fifo or socket, check size is zero -- if not offer to
255 * clear it
256 */
257static void check_size(e2fsck_t ctx, struct problem_context *pctx)
258{
259	struct ext2_inode *inode = pctx->inode;
260
261	if (EXT2_I_SIZE(inode) == 0)
262		return;
263
264	if (!fix_problem(ctx, PR_1_SET_NONZSIZE, pctx))
265		return;
266
267	inode->i_size = 0;
268	inode->i_size_high = 0;
269	e2fsck_write_inode(ctx, pctx->ino, pctx->inode, "pass1");
270}
271
272static void check_ea_in_inode(e2fsck_t ctx, struct problem_context *pctx)
273{
274	struct ext2_super_block *sb = ctx->fs->super;
275	struct ext2_inode_large *inode;
276	struct ext2_ext_attr_entry *entry;
277	char *start;
278	unsigned int storage_size, remain;
279	int problem = 0;
280
281	inode = (struct ext2_inode_large *) pctx->inode;
282	storage_size = EXT2_INODE_SIZE(ctx->fs->super) - EXT2_GOOD_OLD_INODE_SIZE -
283		inode->i_extra_isize;
284	start = ((char *) inode) + EXT2_GOOD_OLD_INODE_SIZE +
285		inode->i_extra_isize + sizeof(__u32);
286	entry = (struct ext2_ext_attr_entry *) start;
287
288	/* scan all entry's headers first */
289
290	/* take finish entry 0UL into account */
291	remain = storage_size - sizeof(__u32);
292
293	while (!EXT2_EXT_IS_LAST_ENTRY(entry)) {
294		__u32 hash;
295
296		/* header eats this space */
297		remain -= sizeof(struct ext2_ext_attr_entry);
298
299		/* is attribute name valid? */
300		if (EXT2_EXT_ATTR_SIZE(entry->e_name_len) > remain) {
301			pctx->num = entry->e_name_len;
302			problem = PR_1_ATTR_NAME_LEN;
303			goto fix;
304		}
305
306		/* attribute len eats this space */
307		remain -= EXT2_EXT_ATTR_SIZE(entry->e_name_len);
308
309		/* check value size */
310		if (entry->e_value_size == 0 || entry->e_value_size > remain) {
311			pctx->num = entry->e_value_size;
312			problem = PR_1_ATTR_VALUE_SIZE;
313			goto fix;
314		}
315
316		/* e_value_block must be 0 in inode's ea */
317		if (entry->e_value_block != 0) {
318			pctx->num = entry->e_value_block;
319			problem = PR_1_ATTR_VALUE_BLOCK;
320			goto fix;
321		}
322
323		hash = ext2fs_ext_attr_hash_entry(entry,
324						  start + entry->e_value_offs);
325
326		/* e_hash may be 0 in older inode's ea */
327		if (entry->e_hash != 0 && entry->e_hash != hash) {
328			pctx->num = entry->e_hash;
329			problem = PR_1_ATTR_HASH;
330			goto fix;
331		}
332
333		remain -= entry->e_value_size;
334
335		entry = EXT2_EXT_ATTR_NEXT(entry);
336	}
337fix:
338	/*
339	 * it seems like a corruption. it's very unlikely we could repair
340	 * EA(s) in automatic fashion -bzzz
341	 */
342	if (problem == 0 || !fix_problem(ctx, problem, pctx))
343		return;
344
345	/* simply remove all possible EA(s) */
346	*((__u32 *)start) = 0UL;
347	e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode,
348				EXT2_INODE_SIZE(sb), "pass1");
349}
350
351static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx)
352{
353	struct ext2_super_block *sb = ctx->fs->super;
354	struct ext2_inode_large *inode;
355	__u32 *eamagic;
356	int min, max;
357
358	inode = (struct ext2_inode_large *) pctx->inode;
359	if (EXT2_INODE_SIZE(sb) == EXT2_GOOD_OLD_INODE_SIZE) {
360		/* this isn't large inode. so, nothing to check */
361		return;
362	}
363
364#if 0
365	printf("inode #%u, i_extra_size %d\n", pctx->ino,
366			inode->i_extra_isize);
367#endif
368	/* i_extra_isize must cover i_extra_isize + i_checksum_hi at least */
369	min = sizeof(inode->i_extra_isize) + sizeof(inode->i_checksum_hi);
370	max = EXT2_INODE_SIZE(sb) - EXT2_GOOD_OLD_INODE_SIZE;
371	/*
372	 * For now we will allow i_extra_isize to be 0, but really
373	 * implementations should never allow i_extra_isize to be 0
374	 */
375	if (inode->i_extra_isize &&
376	    (inode->i_extra_isize < min || inode->i_extra_isize > max)) {
377		if (!fix_problem(ctx, PR_1_EXTRA_ISIZE, pctx))
378			return;
379		inode->i_extra_isize = min;
380		e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode,
381					EXT2_INODE_SIZE(sb), "pass1");
382		return;
383	}
384
385	eamagic = (__u32 *) (((char *) inode) + EXT2_GOOD_OLD_INODE_SIZE +
386			inode->i_extra_isize);
387	if (*eamagic == EXT2_EXT_ATTR_MAGIC) {
388		/* it seems inode has an extended attribute(s) in body */
389		check_ea_in_inode(ctx, pctx);
390	}
391}
392
393/*
394 * Check to see if the inode might really be a directory, despite i_mode
395 *
396 * This is a lot of complexity for something for which I'm not really
397 * convinced happens frequently in the wild.  If for any reason this
398 * causes any problems, take this code out.
399 * [tytso:20070331.0827EDT]
400 */
401static void check_is_really_dir(e2fsck_t ctx, struct problem_context *pctx,
402				char *buf)
403{
404	struct ext2_inode *inode = pctx->inode;
405	struct ext2_dir_entry 	*dirent;
406	errcode_t		retval;
407	blk64_t			blk;
408	unsigned int		i, rec_len, not_device = 0;
409	int			extent_fs;
410
411	/*
412	 * If the mode looks OK, we believe it.  If the first block in
413	 * the i_block array is 0, this cannot be a directory. If the
414	 * inode is extent-mapped, it is still the case that the latter
415	 * cannot be 0 - the magic number in the extent header would make
416	 * it nonzero.
417	 */
418	if (LINUX_S_ISDIR(inode->i_mode) || LINUX_S_ISREG(inode->i_mode) ||
419	    LINUX_S_ISLNK(inode->i_mode) || inode->i_block[0] == 0)
420		return;
421
422	/*
423	 * Check the block numbers in the i_block array for validity:
424	 * zero blocks are skipped (but the first one cannot be zero -
425	 * see above), other blocks are checked against the first and
426	 * max data blocks (from the the superblock) and against the
427	 * block bitmap. Any invalid block found means this cannot be
428	 * a directory.
429	 *
430	 * If there are non-zero blocks past the fourth entry, then
431	 * this cannot be a device file: we remember that for the next
432	 * check.
433	 *
434	 * For extent mapped files, we don't do any sanity checking:
435	 * just try to get the phys block of logical block 0 and run
436	 * with it.
437	 */
438
439	extent_fs = (ctx->fs->super->s_feature_incompat &
440		     EXT3_FEATURE_INCOMPAT_EXTENTS);
441	if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) {
442		/* extent mapped */
443		if  (ext2fs_bmap2(ctx->fs, pctx->ino, inode, 0, 0, 0, 0,
444				 &blk))
445			return;
446		/* device files are never extent mapped */
447		not_device++;
448	} else {
449		for (i=0; i < EXT2_N_BLOCKS; i++) {
450			blk = inode->i_block[i];
451			if (!blk)
452				continue;
453			if (i >= 4)
454				not_device++;
455
456			if (blk < ctx->fs->super->s_first_data_block ||
457			    blk >= ext2fs_blocks_count(ctx->fs->super) ||
458			    ext2fs_fast_test_block_bitmap2(ctx->block_found_map,
459							   blk))
460				return;	/* Invalid block, can't be dir */
461		}
462		blk = inode->i_block[0];
463	}
464
465	/*
466	 * If the mode says this is a device file and the i_links_count field
467	 * is sane and we have not ruled it out as a device file previously,
468	 * we declare it a device file, not a directory.
469	 */
470	if ((LINUX_S_ISCHR(inode->i_mode) || LINUX_S_ISBLK(inode->i_mode)) &&
471	    (inode->i_links_count == 1) && !not_device)
472		return;
473
474	/* read the first block */
475	ehandler_operation(_("reading directory block"));
476	retval = ext2fs_read_dir_block3(ctx->fs, blk, buf, 0);
477	ehandler_operation(0);
478	if (retval)
479		return;
480
481	dirent = (struct ext2_dir_entry *) buf;
482	retval = ext2fs_get_rec_len(ctx->fs, dirent, &rec_len);
483	if (retval)
484		return;
485	if (((dirent->name_len & 0xFF) != 1) ||
486	    (dirent->name[0] != '.') ||
487	    (dirent->inode != pctx->ino) ||
488	    (rec_len < 12) ||
489	    (rec_len % 4) ||
490	    (rec_len >= ctx->fs->blocksize - 12))
491		return;
492
493	dirent = (struct ext2_dir_entry *) (buf + rec_len);
494	retval = ext2fs_get_rec_len(ctx->fs, dirent, &rec_len);
495	if (retval)
496		return;
497	if (((dirent->name_len & 0xFF) != 2) ||
498	    (dirent->name[0] != '.') ||
499	    (dirent->name[1] != '.') ||
500	    (rec_len < 12) ||
501	    (rec_len % 4))
502		return;
503
504	if (fix_problem(ctx, PR_1_TREAT_AS_DIRECTORY, pctx)) {
505		inode->i_mode = (inode->i_mode & 07777) | LINUX_S_IFDIR;
506		e2fsck_write_inode_full(ctx, pctx->ino, inode,
507					EXT2_INODE_SIZE(ctx->fs->super),
508					"check_is_really_dir");
509	}
510}
511
512extern void e2fsck_setup_tdb_icount(e2fsck_t ctx, int flags,
513				    ext2_icount_t *ret)
514{
515	unsigned int		threshold;
516	ext2_ino_t		num_dirs;
517	errcode_t		retval;
518	char			*tdb_dir;
519	int			enable;
520
521	*ret = 0;
522
523	profile_get_string(ctx->profile, "scratch_files", "directory", 0, 0,
524			   &tdb_dir);
525	profile_get_uint(ctx->profile, "scratch_files",
526			 "numdirs_threshold", 0, 0, &threshold);
527	profile_get_boolean(ctx->profile, "scratch_files",
528			    "icount", 0, 1, &enable);
529
530	retval = ext2fs_get_num_dirs(ctx->fs, &num_dirs);
531	if (retval)
532		num_dirs = 1024;	/* Guess */
533
534	if (!enable || !tdb_dir || access(tdb_dir, W_OK) ||
535	    (threshold && num_dirs <= threshold))
536		return;
537
538	retval = ext2fs_create_icount_tdb(ctx->fs, tdb_dir, flags, ret);
539	if (retval)
540		*ret = 0;
541}
542
543void e2fsck_pass1(e2fsck_t ctx)
544{
545	int	i;
546	__u64	max_sizes;
547	ext2_filsys fs = ctx->fs;
548	ext2_ino_t	ino = 0;
549	struct ext2_inode *inode;
550	ext2_inode_scan	scan;
551	char		*block_buf;
552#ifdef RESOURCE_TRACK
553	struct resource_track	rtrack;
554#endif
555	unsigned char	frag, fsize;
556	struct		problem_context pctx;
557	struct		scan_callback_struct scan_struct;
558	struct ext2_super_block *sb = ctx->fs->super;
559	const char	*old_op;
560	unsigned int	save_type;
561	int		imagic_fs, extent_fs;
562	int		busted_fs_time = 0;
563	int		inode_size;
564
565	init_resource_track(&rtrack, ctx->fs->io);
566	clear_problem_context(&pctx);
567
568	if (!(ctx->options & E2F_OPT_PREEN))
569		fix_problem(ctx, PR_1_PASS_HEADER, &pctx);
570
571	if ((fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_DIR_INDEX) &&
572	    !(ctx->options & E2F_OPT_NO)) {
573		if (ext2fs_u32_list_create(&ctx->dirs_to_hash, 50))
574			ctx->dirs_to_hash = 0;
575	}
576
577#ifdef MTRACE
578	mtrace_print("Pass 1");
579#endif
580
581#define EXT2_BPP(bits) (1ULL << ((bits) - 2))
582
583	for (i = EXT2_MIN_BLOCK_LOG_SIZE; i <= EXT2_MAX_BLOCK_LOG_SIZE; i++) {
584		max_sizes = EXT2_NDIR_BLOCKS + EXT2_BPP(i);
585		max_sizes = max_sizes + EXT2_BPP(i) * EXT2_BPP(i);
586		max_sizes = max_sizes + EXT2_BPP(i) * EXT2_BPP(i) * EXT2_BPP(i);
587		max_sizes = (max_sizes * (1UL << i));
588		ext2_max_sizes[i - EXT2_MIN_BLOCK_LOG_SIZE] = max_sizes;
589	}
590#undef EXT2_BPP
591
592	imagic_fs = (sb->s_feature_compat & EXT2_FEATURE_COMPAT_IMAGIC_INODES);
593	extent_fs = (sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS);
594
595	/*
596	 * Allocate bitmaps structures
597	 */
598	pctx.errcode = e2fsck_allocate_inode_bitmap(fs, _("in-use inode map"),
599						    EXT2FS_BMAP64_RBTREE,
600						    "inode_used_map",
601						    &ctx->inode_used_map);
602	if (pctx.errcode) {
603		pctx.num = 1;
604		fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
605		ctx->flags |= E2F_FLAG_ABORT;
606		return;
607	}
608	pctx.errcode = e2fsck_allocate_inode_bitmap(fs,
609			_("directory inode map"),
610			EXT2FS_BMAP64_AUTODIR,
611			"inode_dir_map", &ctx->inode_dir_map);
612	if (pctx.errcode) {
613		pctx.num = 2;
614		fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
615		ctx->flags |= E2F_FLAG_ABORT;
616		return;
617	}
618	pctx.errcode = e2fsck_allocate_inode_bitmap(fs,
619			_("regular file inode map"), EXT2FS_BMAP64_RBTREE,
620			"inode_reg_map", &ctx->inode_reg_map);
621	if (pctx.errcode) {
622		pctx.num = 6;
623		fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
624		ctx->flags |= E2F_FLAG_ABORT;
625		return;
626	}
627	pctx.errcode = e2fsck_allocate_subcluster_bitmap(fs,
628			_("in-use block map"), EXT2FS_BMAP64_RBTREE,
629			"block_found_map", &ctx->block_found_map);
630	if (pctx.errcode) {
631		pctx.num = 1;
632		fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx);
633		ctx->flags |= E2F_FLAG_ABORT;
634		return;
635	}
636	e2fsck_setup_tdb_icount(ctx, 0, &ctx->inode_link_info);
637	if (!ctx->inode_link_info) {
638		e2fsck_set_bitmap_type(fs, EXT2FS_BMAP64_RBTREE,
639				       "inode_link_info", &save_type);
640		pctx.errcode = ext2fs_create_icount2(fs, 0, 0, 0,
641						     &ctx->inode_link_info);
642		fs->default_bitmap_type = save_type;
643	}
644
645	if (pctx.errcode) {
646		fix_problem(ctx, PR_1_ALLOCATE_ICOUNT, &pctx);
647		ctx->flags |= E2F_FLAG_ABORT;
648		return;
649	}
650	inode_size = EXT2_INODE_SIZE(fs->super);
651	inode = (struct ext2_inode *)
652		e2fsck_allocate_memory(ctx, inode_size, "scratch inode");
653
654	inodes_to_process = (struct process_inode_block *)
655		e2fsck_allocate_memory(ctx,
656				       (ctx->process_inode_size *
657					sizeof(struct process_inode_block)),
658				       "array of inodes to process");
659	process_inode_count = 0;
660
661	pctx.errcode = ext2fs_init_dblist(fs, 0);
662	if (pctx.errcode) {
663		fix_problem(ctx, PR_1_ALLOCATE_DBCOUNT, &pctx);
664		ctx->flags |= E2F_FLAG_ABORT;
665		ext2fs_free_mem(&inode);
666		return;
667	}
668
669	/*
670	 * If the last orphan field is set, clear it, since the pass1
671	 * processing will automatically find and clear the orphans.
672	 * In the future, we may want to try using the last_orphan
673	 * linked list ourselves, but for now, we clear it so that the
674	 * ext3 mount code won't get confused.
675	 */
676	if (!(ctx->options & E2F_OPT_READONLY)) {
677		if (fs->super->s_last_orphan) {
678			fs->super->s_last_orphan = 0;
679			ext2fs_mark_super_dirty(fs);
680		}
681	}
682
683	mark_table_blocks(ctx);
684	pctx.errcode = ext2fs_convert_subcluster_bitmap(fs,
685						&ctx->block_found_map);
686	if (pctx.errcode) {
687		fix_problem(ctx, PR_1_CONVERT_SUBCLUSTER, &pctx);
688		ctx->flags |= E2F_FLAG_ABORT;
689		ext2fs_free_mem(&inode);
690		return;
691	}
692	block_buf = (char *) e2fsck_allocate_memory(ctx, fs->blocksize * 3,
693						    "block interate buffer");
694	e2fsck_use_inode_shortcuts(ctx, 1);
695	old_op = ehandler_operation(_("opening inode scan"));
696	pctx.errcode = ext2fs_open_inode_scan(fs, ctx->inode_buffer_blocks,
697					      &scan);
698	ehandler_operation(old_op);
699	if (pctx.errcode) {
700		fix_problem(ctx, PR_1_ISCAN_ERROR, &pctx);
701		ctx->flags |= E2F_FLAG_ABORT;
702		ext2fs_free_mem(&block_buf);
703		ext2fs_free_mem(&inode);
704		return;
705	}
706	ext2fs_inode_scan_flags(scan, EXT2_SF_SKIP_MISSING_ITABLE, 0);
707	ctx->stashed_inode = inode;
708	scan_struct.ctx = ctx;
709	scan_struct.block_buf = block_buf;
710	ext2fs_set_inode_callback(scan, scan_callback, &scan_struct);
711	if (ctx->progress)
712		if ((ctx->progress)(ctx, 1, 0, ctx->fs->group_desc_count))
713			return;
714	if ((fs->super->s_wtime < fs->super->s_inodes_count) ||
715	    (fs->super->s_mtime < fs->super->s_inodes_count))
716		busted_fs_time = 1;
717
718	if ((fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_MMP) &&
719	    !(fs->super->s_mmp_block <= fs->super->s_first_data_block ||
720	      fs->super->s_mmp_block >= fs->super->s_blocks_count))
721		ext2fs_mark_block_bitmap2(ctx->block_found_map,
722					  fs->super->s_mmp_block);
723
724	while (1) {
725		if (ino % (fs->super->s_inodes_per_group * 4) == 1) {
726			if (e2fsck_mmp_update(fs))
727				fatal_error(ctx, 0);
728		}
729		old_op = ehandler_operation(_("getting next inode from scan"));
730		pctx.errcode = ext2fs_get_next_inode_full(scan, &ino,
731							  inode, inode_size);
732		ehandler_operation(old_op);
733		if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
734			return;
735		if (pctx.errcode == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE) {
736			if (!ctx->inode_bb_map)
737				alloc_bb_map(ctx);
738			ext2fs_mark_inode_bitmap2(ctx->inode_bb_map, ino);
739			ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
740			continue;
741		}
742		if (pctx.errcode) {
743			fix_problem(ctx, PR_1_ISCAN_ERROR, &pctx);
744			ctx->flags |= E2F_FLAG_ABORT;
745			return;
746		}
747		if (!ino)
748			break;
749		pctx.ino = ino;
750		pctx.inode = inode;
751		ctx->stashed_ino = ino;
752		if (inode->i_links_count) {
753			pctx.errcode = ext2fs_icount_store(ctx->inode_link_info,
754					   ino, inode->i_links_count);
755			if (pctx.errcode) {
756				pctx.num = inode->i_links_count;
757				fix_problem(ctx, PR_1_ICOUNT_STORE, &pctx);
758				ctx->flags |= E2F_FLAG_ABORT;
759				return;
760			}
761		}
762
763		/*
764		 * Test for incorrect extent flag settings.
765		 *
766		 * On big-endian machines we must be careful:
767		 * When the inode is read, the i_block array is not swapped
768		 * if the extent flag is set.  Therefore if we are testing
769		 * for or fixing a wrongly-set flag, we must potentially
770		 * (un)swap before testing, or after fixing.
771		 */
772
773		/*
774		 * In this case the extents flag was set when read, so
775		 * extent_header_verify is ok.  If the inode is cleared,
776		 * no need to swap... so no extra swapping here.
777		 */
778		if ((inode->i_flags & EXT4_EXTENTS_FL) && !extent_fs &&
779		    (inode->i_links_count || (ino == EXT2_BAD_INO) ||
780		     (ino == EXT2_ROOT_INO) || (ino == EXT2_JOURNAL_INO))) {
781			if ((ext2fs_extent_header_verify(inode->i_block,
782						 sizeof(inode->i_block)) == 0) &&
783			    fix_problem(ctx, PR_1_EXTENT_FEATURE, &pctx)) {
784				sb->s_feature_incompat |= EXT3_FEATURE_INCOMPAT_EXTENTS;
785				ext2fs_mark_super_dirty(fs);
786				extent_fs = 1;
787			} else if (fix_problem(ctx, PR_1_EXTENTS_SET, &pctx)) {
788			clear_inode:
789				e2fsck_clear_inode(ctx, ino, inode, 0, "pass1");
790				if (ino == EXT2_BAD_INO)
791					ext2fs_mark_inode_bitmap2(ctx->inode_used_map,
792								 ino);
793				continue;
794			}
795		}
796
797		/*
798		 * For big-endian machines:
799		 * If the inode didn't have the extents flag set when it
800		 * was read, then the i_blocks array was swapped.  To test
801		 * as an extents header, we must swap it back first.
802		 * IF we then set the extents flag, the entire i_block
803		 * array must be un/re-swapped to make it proper extents data.
804		 */
805		if (extent_fs && !(inode->i_flags & EXT4_EXTENTS_FL) &&
806		    (inode->i_links_count || (ino == EXT2_BAD_INO) ||
807		     (ino == EXT2_ROOT_INO) || (ino == EXT2_JOURNAL_INO)) &&
808		    (LINUX_S_ISREG(inode->i_mode) ||
809		     LINUX_S_ISDIR(inode->i_mode))) {
810			void *ehp;
811#ifdef WORDS_BIGENDIAN
812			__u32 tmp_block[EXT2_N_BLOCKS];
813
814			for (i = 0; i < EXT2_N_BLOCKS; i++)
815				tmp_block[i] = ext2fs_swab32(inode->i_block[i]);
816			ehp = tmp_block;
817#else
818			ehp = inode->i_block;
819#endif
820			if ((ext2fs_extent_header_verify(ehp,
821					 sizeof(inode->i_block)) == 0) &&
822			    (fix_problem(ctx, PR_1_UNSET_EXTENT_FL, &pctx))) {
823				inode->i_flags |= EXT4_EXTENTS_FL;
824#ifdef WORDS_BIGENDIAN
825				memcpy(inode->i_block, tmp_block,
826				       sizeof(inode->i_block));
827#endif
828				e2fsck_write_inode(ctx, ino, inode, "pass1");
829			}
830		}
831
832		if (ino == EXT2_BAD_INO) {
833			struct process_block_struct pb;
834
835			if ((inode->i_mode || inode->i_uid || inode->i_gid ||
836			     inode->i_links_count || inode->i_file_acl) &&
837			    fix_problem(ctx, PR_1_INVALID_BAD_INODE, &pctx)) {
838				memset(inode, 0, sizeof(struct ext2_inode));
839				e2fsck_write_inode(ctx, ino, inode,
840						   "clear bad inode");
841			}
842
843			pctx.errcode = ext2fs_copy_bitmap(ctx->block_found_map,
844							  &pb.fs_meta_blocks);
845			if (pctx.errcode) {
846				pctx.num = 4;
847				fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx);
848				ctx->flags |= E2F_FLAG_ABORT;
849				return;
850			}
851			pb.ino = EXT2_BAD_INO;
852			pb.num_blocks = pb.last_block = 0;
853			pb.last_db_block = -1;
854			pb.num_illegal_blocks = 0;
855			pb.suppress = 0; pb.clear = 0; pb.is_dir = 0;
856			pb.is_reg = 0; pb.fragmented = 0; pb.bbcheck = 0;
857			pb.inode = inode;
858			pb.pctx = &pctx;
859			pb.ctx = ctx;
860			pctx.errcode = ext2fs_block_iterate3(fs, ino, 0,
861				     block_buf, process_bad_block, &pb);
862			ext2fs_free_block_bitmap(pb.fs_meta_blocks);
863			if (pctx.errcode) {
864				fix_problem(ctx, PR_1_BLOCK_ITERATE, &pctx);
865				ctx->flags |= E2F_FLAG_ABORT;
866				return;
867			}
868			if (pb.bbcheck)
869				if (!fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK_PROMPT, &pctx)) {
870				ctx->flags |= E2F_FLAG_ABORT;
871				return;
872			}
873			ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
874			clear_problem_context(&pctx);
875			continue;
876		} else if (ino == EXT2_ROOT_INO) {
877			/*
878			 * Make sure the root inode is a directory; if
879			 * not, offer to clear it.  It will be
880			 * regnerated in pass #3.
881			 */
882			if (!LINUX_S_ISDIR(inode->i_mode)) {
883				if (fix_problem(ctx, PR_1_ROOT_NO_DIR, &pctx))
884					goto clear_inode;
885			}
886			/*
887			 * If dtime is set, offer to clear it.  mke2fs
888			 * version 0.2b created filesystems with the
889			 * dtime field set for the root and lost+found
890			 * directories.  We won't worry about
891			 * /lost+found, since that can be regenerated
892			 * easily.  But we will fix the root directory
893			 * as a special case.
894			 */
895			if (inode->i_dtime && inode->i_links_count) {
896				if (fix_problem(ctx, PR_1_ROOT_DTIME, &pctx)) {
897					inode->i_dtime = 0;
898					e2fsck_write_inode(ctx, ino, inode,
899							   "pass1");
900				}
901			}
902		} else if (ino == EXT2_JOURNAL_INO) {
903			ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
904			if (fs->super->s_journal_inum == EXT2_JOURNAL_INO) {
905				if (!LINUX_S_ISREG(inode->i_mode) &&
906				    fix_problem(ctx, PR_1_JOURNAL_BAD_MODE,
907						&pctx)) {
908					inode->i_mode = LINUX_S_IFREG;
909					e2fsck_write_inode(ctx, ino, inode,
910							   "pass1");
911				}
912				check_blocks(ctx, &pctx, block_buf);
913				continue;
914			}
915			if ((inode->i_links_count ||
916			     inode->i_blocks || inode->i_block[0]) &&
917			    fix_problem(ctx, PR_1_JOURNAL_INODE_NOT_CLEAR,
918					&pctx)) {
919				memset(inode, 0, inode_size);
920				ext2fs_icount_store(ctx->inode_link_info,
921						    ino, 0);
922				e2fsck_write_inode_full(ctx, ino, inode,
923							inode_size, "pass1");
924			}
925		} else if ((ino == EXT4_USR_QUOTA_INO) ||
926			   (ino == EXT4_GRP_QUOTA_INO)) {
927			ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
928			if ((fs->super->s_feature_ro_compat &
929					EXT4_FEATURE_RO_COMPAT_QUOTA) &&
930			    ((fs->super->s_usr_quota_inum == ino) ||
931			     (fs->super->s_grp_quota_inum == ino))) {
932				if (!LINUX_S_ISREG(inode->i_mode) &&
933				    fix_problem(ctx, PR_1_QUOTA_BAD_MODE,
934							&pctx)) {
935					inode->i_mode = LINUX_S_IFREG;
936					e2fsck_write_inode(ctx, ino, inode,
937							"pass1");
938				}
939				check_blocks(ctx, &pctx, block_buf);
940				continue;
941			}
942			if ((inode->i_links_count ||
943			     inode->i_blocks || inode->i_block[0]) &&
944			    fix_problem(ctx, PR_1_QUOTA_INODE_NOT_CLEAR,
945					&pctx)) {
946				memset(inode, 0, inode_size);
947				ext2fs_icount_store(ctx->inode_link_info,
948						    ino, 0);
949				e2fsck_write_inode_full(ctx, ino, inode,
950							inode_size, "pass1");
951			}
952		} else if (ino < EXT2_FIRST_INODE(fs->super)) {
953			int	problem = 0;
954
955			ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
956			if (ino == EXT2_BOOT_LOADER_INO) {
957				if (LINUX_S_ISDIR(inode->i_mode))
958					problem = PR_1_RESERVED_BAD_MODE;
959			} else if (ino == EXT2_RESIZE_INO) {
960				if (inode->i_mode &&
961				    !LINUX_S_ISREG(inode->i_mode))
962					problem = PR_1_RESERVED_BAD_MODE;
963			} else {
964				if (inode->i_mode != 0)
965					problem = PR_1_RESERVED_BAD_MODE;
966			}
967			if (problem) {
968				if (fix_problem(ctx, problem, &pctx)) {
969					inode->i_mode = 0;
970					e2fsck_write_inode(ctx, ino, inode,
971							   "pass1");
972				}
973			}
974			check_blocks(ctx, &pctx, block_buf);
975			continue;
976		}
977
978		/*
979		 * Check for inodes who might have been part of the
980		 * orphaned list linked list.  They should have gotten
981		 * dealt with by now, unless the list had somehow been
982		 * corrupted.
983		 *
984		 * FIXME: In the future, inodes which are still in use
985		 * (and which are therefore) pending truncation should
986		 * be handled specially.  Right now we just clear the
987		 * dtime field, and the normal e2fsck handling of
988		 * inodes where i_size and the inode blocks are
989		 * inconsistent is to fix i_size, instead of releasing
990		 * the extra blocks.  This won't catch the inodes that
991		 * was at the end of the orphan list, but it's better
992		 * than nothing.  The right answer is that there
993		 * shouldn't be any bugs in the orphan list handling.  :-)
994		 */
995		if (inode->i_dtime && !busted_fs_time &&
996		    inode->i_dtime < ctx->fs->super->s_inodes_count) {
997			if (fix_problem(ctx, PR_1_LOW_DTIME, &pctx)) {
998				inode->i_dtime = inode->i_links_count ?
999					0 : ctx->now;
1000				e2fsck_write_inode(ctx, ino, inode,
1001						   "pass1");
1002			}
1003		}
1004
1005		/*
1006		 * This code assumes that deleted inodes have
1007		 * i_links_count set to 0.
1008		 */
1009		if (!inode->i_links_count) {
1010			if (!inode->i_dtime && inode->i_mode) {
1011				if (fix_problem(ctx,
1012					    PR_1_ZERO_DTIME, &pctx)) {
1013					inode->i_dtime = ctx->now;
1014					e2fsck_write_inode(ctx, ino, inode,
1015							   "pass1");
1016				}
1017			}
1018			continue;
1019		}
1020		/*
1021		 * n.b.  0.3c ext2fs code didn't clear i_links_count for
1022		 * deleted files.  Oops.
1023		 *
1024		 * Since all new ext2 implementations get this right,
1025		 * we now assume that the case of non-zero
1026		 * i_links_count and non-zero dtime means that we
1027		 * should keep the file, not delete it.
1028		 *
1029		 */
1030		if (inode->i_dtime) {
1031			if (fix_problem(ctx, PR_1_SET_DTIME, &pctx)) {
1032				inode->i_dtime = 0;
1033				e2fsck_write_inode(ctx, ino, inode, "pass1");
1034			}
1035		}
1036
1037		ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
1038		switch (fs->super->s_creator_os) {
1039		    case EXT2_OS_HURD:
1040			frag = inode->osd2.hurd2.h_i_frag;
1041			fsize = inode->osd2.hurd2.h_i_fsize;
1042			break;
1043		    default:
1044			frag = fsize = 0;
1045		}
1046
1047		if (inode->i_faddr || frag || fsize ||
1048		    (LINUX_S_ISDIR(inode->i_mode) && inode->i_dir_acl))
1049			mark_inode_bad(ctx, ino);
1050		if (!(fs->super->s_feature_incompat &
1051		      EXT4_FEATURE_INCOMPAT_64BIT) &&
1052		    inode->osd2.linux2.l_i_file_acl_high != 0)
1053			mark_inode_bad(ctx, ino);
1054		if ((fs->super->s_creator_os == EXT2_OS_LINUX) &&
1055		    !(fs->super->s_feature_ro_compat &
1056		      EXT4_FEATURE_RO_COMPAT_HUGE_FILE) &&
1057		    (inode->osd2.linux2.l_i_blocks_hi != 0))
1058			mark_inode_bad(ctx, ino);
1059		if (inode->i_flags & EXT2_IMAGIC_FL) {
1060			if (imagic_fs) {
1061				if (!ctx->inode_imagic_map)
1062					alloc_imagic_map(ctx);
1063				ext2fs_mark_inode_bitmap2(ctx->inode_imagic_map,
1064							 ino);
1065			} else {
1066				if (fix_problem(ctx, PR_1_SET_IMAGIC, &pctx)) {
1067					inode->i_flags &= ~EXT2_IMAGIC_FL;
1068					e2fsck_write_inode(ctx, ino,
1069							   inode, "pass1");
1070				}
1071			}
1072		}
1073
1074		check_inode_extra_space(ctx, &pctx);
1075		check_is_really_dir(ctx, &pctx, block_buf);
1076
1077		/*
1078		 * ext2fs_inode_has_valid_blocks2 does not actually look
1079		 * at i_block[] values, so not endian-sensitive here.
1080		 */
1081		if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL) &&
1082		    LINUX_S_ISLNK(inode->i_mode) &&
1083		    !ext2fs_inode_has_valid_blocks2(fs, inode) &&
1084		    fix_problem(ctx, PR_1_FAST_SYMLINK_EXTENT_FL, &pctx)) {
1085			inode->i_flags &= ~EXT4_EXTENTS_FL;
1086			e2fsck_write_inode(ctx, ino, inode, "pass1");
1087		}
1088
1089		if (LINUX_S_ISDIR(inode->i_mode)) {
1090			ext2fs_mark_inode_bitmap2(ctx->inode_dir_map, ino);
1091			e2fsck_add_dir_info(ctx, ino, 0);
1092			ctx->fs_directory_count++;
1093		} else if (LINUX_S_ISREG (inode->i_mode)) {
1094			ext2fs_mark_inode_bitmap2(ctx->inode_reg_map, ino);
1095			ctx->fs_regular_count++;
1096		} else if (LINUX_S_ISCHR (inode->i_mode) &&
1097			   e2fsck_pass1_check_device_inode(fs, inode)) {
1098			check_immutable(ctx, &pctx);
1099			check_size(ctx, &pctx);
1100			ctx->fs_chardev_count++;
1101		} else if (LINUX_S_ISBLK (inode->i_mode) &&
1102			   e2fsck_pass1_check_device_inode(fs, inode)) {
1103			check_immutable(ctx, &pctx);
1104			check_size(ctx, &pctx);
1105			ctx->fs_blockdev_count++;
1106		} else if (LINUX_S_ISLNK (inode->i_mode) &&
1107			   e2fsck_pass1_check_symlink(fs, ino, inode,
1108						      block_buf)) {
1109			check_immutable(ctx, &pctx);
1110			ctx->fs_symlinks_count++;
1111			if (ext2fs_inode_data_blocks(fs, inode) == 0) {
1112				ctx->fs_fast_symlinks_count++;
1113				check_blocks(ctx, &pctx, block_buf);
1114				continue;
1115			}
1116		}
1117		else if (LINUX_S_ISFIFO (inode->i_mode) &&
1118			 e2fsck_pass1_check_device_inode(fs, inode)) {
1119			check_immutable(ctx, &pctx);
1120			check_size(ctx, &pctx);
1121			ctx->fs_fifo_count++;
1122		} else if ((LINUX_S_ISSOCK (inode->i_mode)) &&
1123			   e2fsck_pass1_check_device_inode(fs, inode)) {
1124			check_immutable(ctx, &pctx);
1125			check_size(ctx, &pctx);
1126			ctx->fs_sockets_count++;
1127		} else
1128			mark_inode_bad(ctx, ino);
1129		if (!(inode->i_flags & EXT4_EXTENTS_FL)) {
1130			if (inode->i_block[EXT2_IND_BLOCK])
1131				ctx->fs_ind_count++;
1132			if (inode->i_block[EXT2_DIND_BLOCK])
1133				ctx->fs_dind_count++;
1134			if (inode->i_block[EXT2_TIND_BLOCK])
1135				ctx->fs_tind_count++;
1136		}
1137		if (!(inode->i_flags & EXT4_EXTENTS_FL) &&
1138		    (inode->i_block[EXT2_IND_BLOCK] ||
1139		     inode->i_block[EXT2_DIND_BLOCK] ||
1140		     inode->i_block[EXT2_TIND_BLOCK] ||
1141		     ext2fs_file_acl_block(fs, inode))) {
1142			inodes_to_process[process_inode_count].ino = ino;
1143			inodes_to_process[process_inode_count].inode = *inode;
1144			process_inode_count++;
1145		} else
1146			check_blocks(ctx, &pctx, block_buf);
1147
1148		if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1149			return;
1150
1151		if (process_inode_count >= ctx->process_inode_size) {
1152			process_inodes(ctx, block_buf);
1153
1154			if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1155				return;
1156		}
1157	}
1158	process_inodes(ctx, block_buf);
1159	ext2fs_close_inode_scan(scan);
1160
1161	/*
1162	 * If any extended attribute blocks' reference counts need to
1163	 * be adjusted, either up (ctx->refcount_extra), or down
1164	 * (ctx->refcount), then fix them.
1165	 */
1166	if (ctx->refcount) {
1167		adjust_extattr_refcount(ctx, ctx->refcount, block_buf, -1);
1168		ea_refcount_free(ctx->refcount);
1169		ctx->refcount = 0;
1170	}
1171	if (ctx->refcount_extra) {
1172		adjust_extattr_refcount(ctx, ctx->refcount_extra,
1173					block_buf, +1);
1174		ea_refcount_free(ctx->refcount_extra);
1175		ctx->refcount_extra = 0;
1176	}
1177
1178	if (ctx->invalid_bitmaps)
1179		handle_fs_bad_blocks(ctx);
1180
1181	/* We don't need the block_ea_map any more */
1182	if (ctx->block_ea_map) {
1183		ext2fs_free_block_bitmap(ctx->block_ea_map);
1184		ctx->block_ea_map = 0;
1185	}
1186
1187	if (ctx->flags & E2F_FLAG_RESIZE_INODE) {
1188		ext2fs_block_bitmap save_bmap;
1189
1190		save_bmap = fs->block_map;
1191		fs->block_map = ctx->block_found_map;
1192		clear_problem_context(&pctx);
1193		pctx.errcode = ext2fs_create_resize_inode(fs);
1194		if (pctx.errcode) {
1195			if (!fix_problem(ctx, PR_1_RESIZE_INODE_CREATE,
1196					 &pctx)) {
1197				ctx->flags |= E2F_FLAG_ABORT;
1198				return;
1199			}
1200			pctx.errcode = 0;
1201		}
1202		if (!pctx.errcode) {
1203			e2fsck_read_inode(ctx, EXT2_RESIZE_INO, inode,
1204					  "recreate inode");
1205			inode->i_mtime = ctx->now;
1206			e2fsck_write_inode(ctx, EXT2_RESIZE_INO, inode,
1207					   "recreate inode");
1208		}
1209		fs->block_map = save_bmap;
1210		ctx->flags &= ~E2F_FLAG_RESIZE_INODE;
1211	}
1212
1213	if (ctx->flags & E2F_FLAG_RESTART) {
1214		/*
1215		 * Only the master copy of the superblock and block
1216		 * group descriptors are going to be written during a
1217		 * restart, so set the superblock to be used to be the
1218		 * master superblock.
1219		 */
1220		ctx->use_superblock = 0;
1221		unwind_pass1(fs);
1222		goto endit;
1223	}
1224
1225	if (ctx->block_dup_map) {
1226		if (ctx->options & E2F_OPT_PREEN) {
1227			clear_problem_context(&pctx);
1228			fix_problem(ctx, PR_1_DUP_BLOCKS_PREENSTOP, &pctx);
1229		}
1230		e2fsck_pass1_dupblocks(ctx, block_buf);
1231	}
1232	ext2fs_free_mem(&inodes_to_process);
1233endit:
1234	e2fsck_use_inode_shortcuts(ctx, 0);
1235
1236	ext2fs_free_mem(&block_buf);
1237	ext2fs_free_mem(&inode);
1238
1239	print_resource_track(ctx, _("Pass 1"), &rtrack, ctx->fs->io);
1240}
1241
1242/*
1243 * When the inode_scan routines call this callback at the end of the
1244 * glock group, call process_inodes.
1245 */
1246static errcode_t scan_callback(ext2_filsys fs,
1247			       ext2_inode_scan scan EXT2FS_ATTR((unused)),
1248			       dgrp_t group, void * priv_data)
1249{
1250	struct scan_callback_struct *scan_struct;
1251	e2fsck_t ctx;
1252
1253	scan_struct = (struct scan_callback_struct *) priv_data;
1254	ctx = scan_struct->ctx;
1255
1256	process_inodes((e2fsck_t) fs->priv_data, scan_struct->block_buf);
1257
1258	if (ctx->progress)
1259		if ((ctx->progress)(ctx, 1, group+1,
1260				    ctx->fs->group_desc_count))
1261			return EXT2_ET_CANCEL_REQUESTED;
1262
1263	return 0;
1264}
1265
1266/*
1267 * Process the inodes in the "inodes to process" list.
1268 */
1269static void process_inodes(e2fsck_t ctx, char *block_buf)
1270{
1271	int			i;
1272	struct ext2_inode	*old_stashed_inode;
1273	ext2_ino_t		old_stashed_ino;
1274	const char		*old_operation;
1275	char			buf[80];
1276	struct problem_context	pctx;
1277
1278#if 0
1279	printf("begin process_inodes: ");
1280#endif
1281	if (process_inode_count == 0)
1282		return;
1283	old_operation = ehandler_operation(0);
1284	old_stashed_inode = ctx->stashed_inode;
1285	old_stashed_ino = ctx->stashed_ino;
1286	qsort(inodes_to_process, process_inode_count,
1287		      sizeof(struct process_inode_block), process_inode_cmp);
1288	clear_problem_context(&pctx);
1289	for (i=0; i < process_inode_count; i++) {
1290		pctx.inode = ctx->stashed_inode = &inodes_to_process[i].inode;
1291		pctx.ino = ctx->stashed_ino = inodes_to_process[i].ino;
1292
1293#if 0
1294		printf("%u ", pctx.ino);
1295#endif
1296		sprintf(buf, _("reading indirect blocks of inode %u"),
1297			pctx.ino);
1298		ehandler_operation(buf);
1299		check_blocks(ctx, &pctx, block_buf);
1300		if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1301			break;
1302	}
1303	ctx->stashed_inode = old_stashed_inode;
1304	ctx->stashed_ino = old_stashed_ino;
1305	process_inode_count = 0;
1306#if 0
1307	printf("end process inodes\n");
1308#endif
1309	ehandler_operation(old_operation);
1310}
1311
1312static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b)
1313{
1314	const struct process_inode_block *ib_a =
1315		(const struct process_inode_block *) a;
1316	const struct process_inode_block *ib_b =
1317		(const struct process_inode_block *) b;
1318	int	ret;
1319
1320	ret = (ib_a->inode.i_block[EXT2_IND_BLOCK] -
1321	       ib_b->inode.i_block[EXT2_IND_BLOCK]);
1322	if (ret == 0)
1323		/*
1324		 * We only call process_inodes() for non-extent
1325		 * inodes, so it's OK to pass NULL to
1326		 * ext2fs_file_acl_block() here.
1327		 */
1328		ret = ext2fs_file_acl_block(0, &(ib_a->inode)) -
1329			ext2fs_file_acl_block(0, &(ib_b->inode));
1330	if (ret == 0)
1331		ret = ib_a->ino - ib_b->ino;
1332	return ret;
1333}
1334
1335/*
1336 * Mark an inode as being bad in some what
1337 */
1338static void mark_inode_bad(e2fsck_t ctx, ino_t ino)
1339{
1340	struct		problem_context pctx;
1341
1342	if (!ctx->inode_bad_map) {
1343		clear_problem_context(&pctx);
1344
1345		pctx.errcode = e2fsck_allocate_inode_bitmap(ctx->fs,
1346				_("bad inode map"), EXT2FS_BMAP64_RBTREE,
1347				"inode_bad_map", &ctx->inode_bad_map);
1348		if (pctx.errcode) {
1349			pctx.num = 3;
1350			fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
1351			/* Should never get here */
1352			ctx->flags |= E2F_FLAG_ABORT;
1353			return;
1354		}
1355	}
1356	ext2fs_mark_inode_bitmap2(ctx->inode_bad_map, ino);
1357}
1358
1359
1360/*
1361 * This procedure will allocate the inode "bb" (badblock) map table
1362 */
1363static void alloc_bb_map(e2fsck_t ctx)
1364{
1365	struct		problem_context pctx;
1366
1367	clear_problem_context(&pctx);
1368	pctx.errcode = e2fsck_allocate_inode_bitmap(ctx->fs,
1369			_("inode in bad block map"), EXT2FS_BMAP64_RBTREE,
1370			"inode_bb_map", &ctx->inode_bb_map);
1371	if (pctx.errcode) {
1372		pctx.num = 4;
1373		fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
1374		/* Should never get here */
1375		ctx->flags |= E2F_FLAG_ABORT;
1376		return;
1377	}
1378}
1379
1380/*
1381 * This procedure will allocate the inode imagic table
1382 */
1383static void alloc_imagic_map(e2fsck_t ctx)
1384{
1385	struct		problem_context pctx;
1386
1387	clear_problem_context(&pctx);
1388	pctx.errcode = e2fsck_allocate_inode_bitmap(ctx->fs,
1389			_("imagic inode map"), EXT2FS_BMAP64_RBTREE,
1390			"inode_imagic_map", &ctx->inode_imagic_map);
1391	if (pctx.errcode) {
1392		pctx.num = 5;
1393		fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
1394		/* Should never get here */
1395		ctx->flags |= E2F_FLAG_ABORT;
1396		return;
1397	}
1398}
1399
1400/*
1401 * Marks a block as in use, setting the dup_map if it's been set
1402 * already.  Called by process_block and process_bad_block.
1403 *
1404 * WARNING: Assumes checks have already been done to make sure block
1405 * is valid.  This is true in both process_block and process_bad_block.
1406 */
1407static _INLINE_ void mark_block_used(e2fsck_t ctx, blk64_t block)
1408{
1409	struct		problem_context pctx;
1410
1411	clear_problem_context(&pctx);
1412
1413	if (ext2fs_fast_test_block_bitmap2(ctx->block_found_map, block)) {
1414		if (!ctx->block_dup_map) {
1415			pctx.errcode = e2fsck_allocate_block_bitmap(ctx->fs,
1416					_("multiply claimed block map"),
1417					EXT2FS_BMAP64_RBTREE, "block_dup_map",
1418					&ctx->block_dup_map);
1419			if (pctx.errcode) {
1420				pctx.num = 3;
1421				fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR,
1422					    &pctx);
1423				/* Should never get here */
1424				ctx->flags |= E2F_FLAG_ABORT;
1425				return;
1426			}
1427		}
1428		ext2fs_fast_mark_block_bitmap2(ctx->block_dup_map, block);
1429	} else {
1430		ext2fs_fast_mark_block_bitmap2(ctx->block_found_map, block);
1431	}
1432}
1433
1434static _INLINE_ void mark_blocks_used(e2fsck_t ctx, blk64_t block,
1435				      unsigned int num)
1436{
1437	if (ext2fs_test_block_bitmap_range2(ctx->block_found_map, block, num))
1438		ext2fs_mark_block_bitmap_range2(ctx->block_found_map, block, num);
1439	else
1440		while (num--)
1441			mark_block_used(ctx, block++);
1442}
1443
1444/*
1445 * Adjust the extended attribute block's reference counts at the end
1446 * of pass 1, either by subtracting out references for EA blocks that
1447 * are still referenced in ctx->refcount, or by adding references for
1448 * EA blocks that had extra references as accounted for in
1449 * ctx->refcount_extra.
1450 */
1451static void adjust_extattr_refcount(e2fsck_t ctx, ext2_refcount_t refcount,
1452				    char *block_buf, int adjust_sign)
1453{
1454	struct ext2_ext_attr_header 	*header;
1455	struct problem_context		pctx;
1456	ext2_filsys			fs = ctx->fs;
1457	blk64_t				blk;
1458	__u32				should_be;
1459	int				count;
1460
1461	clear_problem_context(&pctx);
1462
1463	ea_refcount_intr_begin(refcount);
1464	while (1) {
1465		if ((blk = ea_refcount_intr_next(refcount, &count)) == 0)
1466			break;
1467		pctx.blk = blk;
1468		pctx.errcode = ext2fs_read_ext_attr2(fs, blk, block_buf);
1469		if (pctx.errcode) {
1470			fix_problem(ctx, PR_1_EXTATTR_READ_ABORT, &pctx);
1471			return;
1472		}
1473		header = (struct ext2_ext_attr_header *) block_buf;
1474		pctx.blkcount = header->h_refcount;
1475		should_be = header->h_refcount + adjust_sign * count;
1476		pctx.num = should_be;
1477		if (fix_problem(ctx, PR_1_EXTATTR_REFCOUNT, &pctx)) {
1478			header->h_refcount = should_be;
1479			pctx.errcode = ext2fs_write_ext_attr2(fs, blk,
1480							     block_buf);
1481			if (pctx.errcode) {
1482				fix_problem(ctx, PR_1_EXTATTR_WRITE_ABORT,
1483					    &pctx);
1484				continue;
1485			}
1486		}
1487	}
1488}
1489
1490/*
1491 * Handle processing the extended attribute blocks
1492 */
1493static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
1494			   char *block_buf)
1495{
1496	ext2_filsys fs = ctx->fs;
1497	ext2_ino_t	ino = pctx->ino;
1498	struct ext2_inode *inode = pctx->inode;
1499	blk64_t		blk;
1500	char *		end;
1501	struct ext2_ext_attr_header *header;
1502	struct ext2_ext_attr_entry *entry;
1503	int		count;
1504	region_t	region = 0;
1505
1506	blk = ext2fs_file_acl_block(fs, inode);
1507	if (blk == 0)
1508		return 0;
1509
1510	/*
1511	 * If the Extended attribute flag isn't set, then a non-zero
1512	 * file acl means that the inode is corrupted.
1513	 *
1514	 * Or if the extended attribute block is an invalid block,
1515	 * then the inode is also corrupted.
1516	 */
1517	if (!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR) ||
1518	    (blk < fs->super->s_first_data_block) ||
1519	    (blk >= ext2fs_blocks_count(fs->super))) {
1520		mark_inode_bad(ctx, ino);
1521		return 0;
1522	}
1523
1524	/* If ea bitmap hasn't been allocated, create it */
1525	if (!ctx->block_ea_map) {
1526		pctx->errcode = e2fsck_allocate_block_bitmap(fs,
1527					_("ext attr block map"),
1528					EXT2FS_BMAP64_RBTREE, "block_ea_map",
1529					&ctx->block_ea_map);
1530		if (pctx->errcode) {
1531			pctx->num = 2;
1532			fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, pctx);
1533			ctx->flags |= E2F_FLAG_ABORT;
1534			return 0;
1535		}
1536	}
1537
1538	/* Create the EA refcount structure if necessary */
1539	if (!ctx->refcount) {
1540		pctx->errcode = ea_refcount_create(0, &ctx->refcount);
1541		if (pctx->errcode) {
1542			pctx->num = 1;
1543			fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
1544			ctx->flags |= E2F_FLAG_ABORT;
1545			return 0;
1546		}
1547	}
1548
1549#if 0
1550	/* Debugging text */
1551	printf("Inode %u has EA block %u\n", ino, blk);
1552#endif
1553
1554	/* Have we seen this EA block before? */
1555	if (ext2fs_fast_test_block_bitmap2(ctx->block_ea_map, blk)) {
1556		if (ea_refcount_decrement(ctx->refcount, blk, 0) == 0)
1557			return 1;
1558		/* Ooops, this EA was referenced more than it stated */
1559		if (!ctx->refcount_extra) {
1560			pctx->errcode = ea_refcount_create(0,
1561					   &ctx->refcount_extra);
1562			if (pctx->errcode) {
1563				pctx->num = 2;
1564				fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
1565				ctx->flags |= E2F_FLAG_ABORT;
1566				return 0;
1567			}
1568		}
1569		ea_refcount_increment(ctx->refcount_extra, blk, 0);
1570		return 1;
1571	}
1572
1573	/*
1574	 * OK, we haven't seen this EA block yet.  So we need to
1575	 * validate it
1576	 */
1577	pctx->blk = blk;
1578	pctx->errcode = ext2fs_read_ext_attr2(fs, blk, block_buf);
1579	if (pctx->errcode && fix_problem(ctx, PR_1_READ_EA_BLOCK, pctx))
1580		goto clear_extattr;
1581	header = (struct ext2_ext_attr_header *) block_buf;
1582	pctx->blk = ext2fs_file_acl_block(fs, inode);
1583	if (((ctx->ext_attr_ver == 1) &&
1584	     (header->h_magic != EXT2_EXT_ATTR_MAGIC_v1)) ||
1585	    ((ctx->ext_attr_ver == 2) &&
1586	     (header->h_magic != EXT2_EXT_ATTR_MAGIC))) {
1587		if (fix_problem(ctx, PR_1_BAD_EA_BLOCK, pctx))
1588			goto clear_extattr;
1589	}
1590
1591	if (header->h_blocks != 1) {
1592		if (fix_problem(ctx, PR_1_EA_MULTI_BLOCK, pctx))
1593			goto clear_extattr;
1594	}
1595
1596	region = region_create(0, fs->blocksize);
1597	if (!region) {
1598		fix_problem(ctx, PR_1_EA_ALLOC_REGION_ABORT, pctx);
1599		ctx->flags |= E2F_FLAG_ABORT;
1600		return 0;
1601	}
1602	if (region_allocate(region, 0, sizeof(struct ext2_ext_attr_header))) {
1603		if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1604			goto clear_extattr;
1605	}
1606
1607	entry = (struct ext2_ext_attr_entry *)(header+1);
1608	end = block_buf + fs->blocksize;
1609	while ((char *)entry < end && *(__u32 *)entry) {
1610		__u32 hash;
1611
1612		if (region_allocate(region, (char *)entry - (char *)header,
1613			           EXT2_EXT_ATTR_LEN(entry->e_name_len))) {
1614			if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1615				goto clear_extattr;
1616			break;
1617		}
1618		if ((ctx->ext_attr_ver == 1 &&
1619		     (entry->e_name_len == 0 || entry->e_name_index != 0)) ||
1620		    (ctx->ext_attr_ver == 2 &&
1621		     entry->e_name_index == 0)) {
1622			if (fix_problem(ctx, PR_1_EA_BAD_NAME, pctx))
1623				goto clear_extattr;
1624			break;
1625		}
1626		if (entry->e_value_block != 0) {
1627			if (fix_problem(ctx, PR_1_EA_BAD_VALUE, pctx))
1628				goto clear_extattr;
1629		}
1630		if (entry->e_value_offs + entry->e_value_size > fs->blocksize) {
1631			if (fix_problem(ctx, PR_1_EA_BAD_VALUE, pctx))
1632				goto clear_extattr;
1633			break;
1634		}
1635		if (entry->e_value_size &&
1636		    region_allocate(region, entry->e_value_offs,
1637				    EXT2_EXT_ATTR_SIZE(entry->e_value_size))) {
1638			if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1639				goto clear_extattr;
1640		}
1641
1642		hash = ext2fs_ext_attr_hash_entry(entry, block_buf +
1643							 entry->e_value_offs);
1644
1645		if (entry->e_hash != hash) {
1646			pctx->num = entry->e_hash;
1647			if (fix_problem(ctx, PR_1_ATTR_HASH, pctx))
1648				goto clear_extattr;
1649			entry->e_hash = hash;
1650		}
1651
1652		entry = EXT2_EXT_ATTR_NEXT(entry);
1653	}
1654	if (region_allocate(region, (char *)entry - (char *)header, 4)) {
1655		if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1656			goto clear_extattr;
1657	}
1658	region_free(region);
1659
1660	count = header->h_refcount - 1;
1661	if (count)
1662		ea_refcount_store(ctx->refcount, blk, count);
1663	mark_block_used(ctx, blk);
1664	ext2fs_fast_mark_block_bitmap2(ctx->block_ea_map, blk);
1665	return 1;
1666
1667clear_extattr:
1668	if (region)
1669		region_free(region);
1670	ext2fs_file_acl_block_set(fs, inode, 0);
1671	e2fsck_write_inode(ctx, ino, inode, "check_ext_attr");
1672	return 0;
1673}
1674
1675/* Returns 1 if bad htree, 0 if OK */
1676static int handle_htree(e2fsck_t ctx, struct problem_context *pctx,
1677			ext2_ino_t ino, struct ext2_inode *inode,
1678			char *block_buf)
1679{
1680	struct ext2_dx_root_info	*root;
1681	ext2_filsys			fs = ctx->fs;
1682	errcode_t			retval;
1683	blk64_t				blk;
1684
1685	if ((!LINUX_S_ISDIR(inode->i_mode) &&
1686	     fix_problem(ctx, PR_1_HTREE_NODIR, pctx)) ||
1687	    (!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_DIR_INDEX) &&
1688	     fix_problem(ctx, PR_1_HTREE_SET, pctx)))
1689		return 1;
1690
1691	pctx->errcode = ext2fs_bmap2(fs, ino, inode, 0, 0, 0, 0, &blk);
1692
1693	if ((pctx->errcode) ||
1694	    (blk == 0) ||
1695	    (blk < fs->super->s_first_data_block) ||
1696	    (blk >= ext2fs_blocks_count(fs->super))) {
1697		if (fix_problem(ctx, PR_1_HTREE_BADROOT, pctx))
1698			return 1;
1699		else
1700			return 0;
1701	}
1702
1703	retval = io_channel_read_blk64(fs->io, blk, 1, block_buf);
1704	if (retval && fix_problem(ctx, PR_1_HTREE_BADROOT, pctx))
1705		return 1;
1706
1707	/* XXX should check that beginning matches a directory */
1708	root = (struct ext2_dx_root_info *) (block_buf + 24);
1709
1710	if ((root->reserved_zero || root->info_length < 8) &&
1711	    fix_problem(ctx, PR_1_HTREE_BADROOT, pctx))
1712		return 1;
1713
1714	pctx->num = root->hash_version;
1715	if ((root->hash_version != EXT2_HASH_LEGACY) &&
1716	    (root->hash_version != EXT2_HASH_HALF_MD4) &&
1717	    (root->hash_version != EXT2_HASH_TEA) &&
1718	    fix_problem(ctx, PR_1_HTREE_HASHV, pctx))
1719		return 1;
1720
1721	if ((root->unused_flags & EXT2_HASH_FLAG_INCOMPAT) &&
1722	    fix_problem(ctx, PR_1_HTREE_INCOMPAT, pctx))
1723		return 1;
1724
1725	pctx->num = root->indirect_levels;
1726	if ((root->indirect_levels > 1) &&
1727	    fix_problem(ctx, PR_1_HTREE_DEPTH, pctx))
1728		return 1;
1729
1730	return 0;
1731}
1732
1733void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino,
1734			struct ext2_inode *inode, int restart_flag,
1735			const char *source)
1736{
1737	inode->i_flags = 0;
1738	inode->i_links_count = 0;
1739	ext2fs_icount_store(ctx->inode_link_info, ino, 0);
1740	inode->i_dtime = ctx->now;
1741
1742	ext2fs_unmark_inode_bitmap2(ctx->inode_dir_map, ino);
1743	ext2fs_unmark_inode_bitmap2(ctx->inode_used_map, ino);
1744	if (ctx->inode_reg_map)
1745		ext2fs_unmark_inode_bitmap2(ctx->inode_reg_map, ino);
1746	if (ctx->inode_bad_map)
1747		ext2fs_unmark_inode_bitmap2(ctx->inode_bad_map, ino);
1748
1749	/*
1750	 * If the inode was partially accounted for before processing
1751	 * was aborted, we need to restart the pass 1 scan.
1752	 */
1753	ctx->flags |= restart_flag;
1754
1755	if (ino == EXT2_BAD_INO)
1756		memset(inode, 0, sizeof(struct ext2_inode));
1757
1758	e2fsck_write_inode(ctx, ino, inode, source);
1759}
1760
1761static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx,
1762			     struct process_block_struct *pb,
1763			     blk64_t start_block,
1764			     ext2_extent_handle_t ehandle)
1765{
1766	struct ext2fs_extent	extent;
1767	blk64_t			blk;
1768	e2_blkcnt_t		blockcnt;
1769	unsigned int		i;
1770	int			is_dir, is_leaf;
1771	errcode_t		problem;
1772	struct ext2_extent_info	info;
1773
1774	pctx->errcode = ext2fs_extent_get_info(ehandle, &info);
1775	if (pctx->errcode)
1776		return;
1777
1778	pctx->errcode = ext2fs_extent_get(ehandle, EXT2_EXTENT_FIRST_SIB,
1779					  &extent);
1780	while (!pctx->errcode && info.num_entries-- > 0) {
1781		is_leaf = extent.e_flags & EXT2_EXTENT_FLAGS_LEAF;
1782		is_dir = LINUX_S_ISDIR(pctx->inode->i_mode);
1783
1784		problem = 0;
1785		if (extent.e_pblk == 0 ||
1786		    extent.e_pblk < ctx->fs->super->s_first_data_block ||
1787		    extent.e_pblk >= ext2fs_blocks_count(ctx->fs->super))
1788			problem = PR_1_EXTENT_BAD_START_BLK;
1789		else if (extent.e_lblk < start_block)
1790			problem = PR_1_OUT_OF_ORDER_EXTENTS;
1791		else if (is_leaf && extent.e_len == 0)
1792			problem = PR_1_EXTENT_LENGTH_ZERO;
1793		else if (is_leaf &&
1794			 (extent.e_pblk + extent.e_len) >
1795			 ext2fs_blocks_count(ctx->fs->super))
1796			problem = PR_1_EXTENT_ENDS_BEYOND;
1797
1798		if (problem) {
1799report_problem:
1800			pctx->blk = extent.e_pblk;
1801			pctx->blk2 = extent.e_lblk;
1802			pctx->num = extent.e_len;
1803			if (fix_problem(ctx, problem, pctx)) {
1804				e2fsck_read_bitmaps(ctx);
1805				pctx->errcode =
1806					ext2fs_extent_delete(ehandle, 0);
1807				if (pctx->errcode) {
1808					pctx->str = "ext2fs_extent_delete";
1809					return;
1810				}
1811				ext2fs_extent_fix_parents(ehandle);
1812				pctx->errcode = ext2fs_extent_get(ehandle,
1813								  EXT2_EXTENT_CURRENT,
1814								  &extent);
1815				if (pctx->errcode == EXT2_ET_NO_CURRENT_NODE) {
1816					pctx->errcode = 0;
1817					break;
1818				}
1819				continue;
1820			}
1821			goto next;
1822		}
1823
1824		if (!is_leaf) {
1825			blk64_t lblk;
1826
1827			blk = extent.e_pblk;
1828			lblk = extent.e_lblk;
1829			pctx->errcode = ext2fs_extent_get(ehandle,
1830						  EXT2_EXTENT_DOWN, &extent);
1831			if (pctx->errcode) {
1832				pctx->str = "EXT2_EXTENT_DOWN";
1833				problem = PR_1_EXTENT_HEADER_INVALID;
1834				if (pctx->errcode == EXT2_ET_EXTENT_HEADER_BAD)
1835					goto report_problem;
1836				return;
1837			}
1838			/* The next extent should match this index's logical start */
1839			if (extent.e_lblk != lblk) {
1840				struct ext2_extent_info info;
1841
1842				ext2fs_extent_get_info(ehandle, &info);
1843				pctx->blk = lblk;
1844				pctx->blk2 = extent.e_lblk;
1845				pctx->num = info.curr_level - 1;
1846				problem = PR_1_EXTENT_INDEX_START_INVALID;
1847				if (fix_problem(ctx, problem, pctx))
1848					ext2fs_extent_fix_parents(ehandle);
1849			}
1850			scan_extent_node(ctx, pctx, pb, extent.e_lblk, ehandle);
1851			if (pctx->errcode)
1852				return;
1853			pctx->errcode = ext2fs_extent_get(ehandle,
1854						  EXT2_EXTENT_UP, &extent);
1855			if (pctx->errcode) {
1856				pctx->str = "EXT2_EXTENT_UP";
1857				return;
1858			}
1859			mark_block_used(ctx, blk);
1860			pb->num_blocks++;
1861			goto next;
1862		}
1863
1864		if ((pb->previous_block != 0) &&
1865		    (pb->previous_block+1 != extent.e_pblk)) {
1866			if (ctx->options & E2F_OPT_FRAGCHECK) {
1867				char type = '?';
1868
1869				if (pb->is_dir)
1870					type = 'd';
1871				else if (pb->is_reg)
1872					type = 'f';
1873
1874				printf(("%6lu(%c): expecting %6lu "
1875					"actual extent "
1876					"phys %6lu log %lu len %lu\n"),
1877				       (unsigned long) pctx->ino, type,
1878				       (unsigned long) pb->previous_block+1,
1879				       (unsigned long) extent.e_pblk,
1880				       (unsigned long) extent.e_lblk,
1881				       (unsigned long) extent.e_len);
1882			}
1883			pb->fragmented = 1;
1884		}
1885		while (is_dir && ++pb->last_db_block < extent.e_lblk) {
1886			pctx->errcode = ext2fs_add_dir_block2(ctx->fs->dblist,
1887							      pb->ino, 0,
1888							      pb->last_db_block);
1889			if (pctx->errcode) {
1890				pctx->blk = 0;
1891				pctx->num = pb->last_db_block;
1892				goto failed_add_dir_block;
1893			}
1894		}
1895		if (!ctx->fs->cluster_ratio_bits) {
1896			mark_blocks_used(ctx, extent.e_pblk, extent.e_len);
1897			pb->num_blocks += extent.e_len;
1898		}
1899		for (blk = extent.e_pblk, blockcnt = extent.e_lblk, i = 0;
1900		     i < extent.e_len;
1901		     blk++, blockcnt++, i++) {
1902			if (ctx->fs->cluster_ratio_bits &&
1903			    !(pb->previous_block &&
1904			      (EXT2FS_B2C(ctx->fs, blk) ==
1905			       EXT2FS_B2C(ctx->fs, pb->previous_block)) &&
1906			      (blk & EXT2FS_CLUSTER_MASK(ctx->fs)) ==
1907			      (blockcnt & EXT2FS_CLUSTER_MASK(ctx->fs)))) {
1908				mark_block_used(ctx, blk);
1909				pb->num_blocks++;
1910			}
1911
1912			pb->previous_block = blk;
1913
1914			if (is_dir) {
1915				pctx->errcode = ext2fs_add_dir_block2(ctx->fs->dblist, pctx->ino, blk, blockcnt);
1916				if (pctx->errcode) {
1917					pctx->blk = blk;
1918					pctx->num = blockcnt;
1919				failed_add_dir_block:
1920					fix_problem(ctx, PR_1_ADD_DBLOCK, pctx);
1921					/* Should never get here */
1922					ctx->flags |= E2F_FLAG_ABORT;
1923					return;
1924				}
1925			}
1926		}
1927		if (is_dir && extent.e_len > 0)
1928			pb->last_db_block = blockcnt - 1;
1929		pb->previous_block = extent.e_pblk + extent.e_len - 1;
1930		start_block = pb->last_block = extent.e_lblk + extent.e_len - 1;
1931		if (is_leaf && !is_dir &&
1932		    !(extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT))
1933			pb->last_init_lblock = extent.e_lblk + extent.e_len - 1;
1934	next:
1935		pctx->errcode = ext2fs_extent_get(ehandle,
1936						  EXT2_EXTENT_NEXT_SIB,
1937						  &extent);
1938	}
1939	if (pctx->errcode == EXT2_ET_EXTENT_NO_NEXT)
1940		pctx->errcode = 0;
1941}
1942
1943static void check_blocks_extents(e2fsck_t ctx, struct problem_context *pctx,
1944				 struct process_block_struct *pb)
1945{
1946	struct ext2_extent_info info;
1947	struct ext2_inode	*inode = pctx->inode;
1948	ext2_extent_handle_t	ehandle;
1949	ext2_filsys		fs = ctx->fs;
1950	ext2_ino_t		ino = pctx->ino;
1951	errcode_t		retval;
1952
1953	pctx->errcode = ext2fs_extent_open2(fs, ino, inode, &ehandle);
1954	if (pctx->errcode) {
1955		if (fix_problem(ctx, PR_1_READ_EXTENT, pctx))
1956			e2fsck_clear_inode(ctx, ino, inode, 0,
1957					   "check_blocks_extents");
1958		pctx->errcode = 0;
1959		return;
1960	}
1961
1962	retval = ext2fs_extent_get_info(ehandle, &info);
1963	if (retval == 0) {
1964		if (info.max_depth >= MAX_EXTENT_DEPTH_COUNT)
1965			info.max_depth = MAX_EXTENT_DEPTH_COUNT-1;
1966		ctx->extent_depth_count[info.max_depth]++;
1967	}
1968
1969	scan_extent_node(ctx, pctx, pb, 0, ehandle);
1970	if (pctx->errcode &&
1971	    fix_problem(ctx, PR_1_EXTENT_ITERATE_FAILURE, pctx)) {
1972		pb->num_blocks = 0;
1973		inode->i_blocks = 0;
1974		e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART,
1975				   "check_blocks_extents");
1976		pctx->errcode = 0;
1977	}
1978	ext2fs_extent_free(ehandle);
1979}
1980
1981/*
1982 * This subroutine is called on each inode to account for all of the
1983 * blocks used by that inode.
1984 */
1985static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
1986			 char *block_buf)
1987{
1988	ext2_filsys fs = ctx->fs;
1989	struct process_block_struct pb;
1990	ext2_ino_t	ino = pctx->ino;
1991	struct ext2_inode *inode = pctx->inode;
1992	int		bad_size = 0;
1993	int		dirty_inode = 0;
1994	int		extent_fs;
1995	__u64		size;
1996
1997	pb.ino = ino;
1998	pb.num_blocks = 0;
1999	pb.last_block = -1;
2000	pb.last_init_lblock = -1;
2001	pb.last_db_block = -1;
2002	pb.num_illegal_blocks = 0;
2003	pb.suppress = 0; pb.clear = 0;
2004	pb.fragmented = 0;
2005	pb.compressed = 0;
2006	pb.previous_block = 0;
2007	pb.is_dir = LINUX_S_ISDIR(inode->i_mode);
2008	pb.is_reg = LINUX_S_ISREG(inode->i_mode);
2009	pb.max_blocks = 1 << (31 - fs->super->s_log_block_size);
2010	pb.inode = inode;
2011	pb.pctx = pctx;
2012	pb.ctx = ctx;
2013	pctx->ino = ino;
2014	pctx->errcode = 0;
2015
2016	extent_fs = (ctx->fs->super->s_feature_incompat &
2017                     EXT3_FEATURE_INCOMPAT_EXTENTS);
2018
2019	if (inode->i_flags & EXT2_COMPRBLK_FL) {
2020		if (fs->super->s_feature_incompat &
2021		    EXT2_FEATURE_INCOMPAT_COMPRESSION)
2022			pb.compressed = 1;
2023		else {
2024			if (fix_problem(ctx, PR_1_COMPR_SET, pctx)) {
2025				inode->i_flags &= ~EXT2_COMPRBLK_FL;
2026				dirty_inode++;
2027			}
2028		}
2029	}
2030
2031	if (ext2fs_file_acl_block(fs, inode) &&
2032	    check_ext_attr(ctx, pctx, block_buf)) {
2033		if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
2034			goto out;
2035		pb.num_blocks++;
2036	}
2037
2038	if (ext2fs_inode_has_valid_blocks2(fs, inode)) {
2039		if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL))
2040			check_blocks_extents(ctx, pctx, &pb);
2041		else {
2042			pctx->errcode = ext2fs_block_iterate3(fs, ino,
2043						pb.is_dir ? BLOCK_FLAG_HOLE : 0,
2044						block_buf, process_block, &pb);
2045			/*
2046			 * We do not have uninitialized extents in non extent
2047			 * files.
2048			 */
2049			pb.last_init_lblock = pb.last_block;
2050		}
2051	}
2052	end_problem_latch(ctx, PR_LATCH_BLOCK);
2053	end_problem_latch(ctx, PR_LATCH_TOOBIG);
2054	if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
2055		goto out;
2056	if (pctx->errcode)
2057		fix_problem(ctx, PR_1_BLOCK_ITERATE, pctx);
2058
2059	if (pb.fragmented && pb.num_blocks < fs->super->s_blocks_per_group) {
2060		if (LINUX_S_ISDIR(inode->i_mode))
2061			ctx->fs_fragmented_dir++;
2062		else
2063			ctx->fs_fragmented++;
2064	}
2065
2066	if (pb.clear) {
2067		e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART,
2068				   "check_blocks");
2069		return;
2070	}
2071
2072	if (inode->i_flags & EXT2_INDEX_FL) {
2073		if (handle_htree(ctx, pctx, ino, inode, block_buf)) {
2074			inode->i_flags &= ~EXT2_INDEX_FL;
2075			dirty_inode++;
2076		} else {
2077#ifdef ENABLE_HTREE
2078			e2fsck_add_dx_dir(ctx, ino, pb.last_block+1);
2079#endif
2080		}
2081	}
2082
2083	if (!pb.num_blocks && pb.is_dir) {
2084		if (fix_problem(ctx, PR_1_ZERO_LENGTH_DIR, pctx)) {
2085			e2fsck_clear_inode(ctx, ino, inode, 0, "check_blocks");
2086			ctx->fs_directory_count--;
2087			return;
2088		}
2089	}
2090
2091	if (ino == EXT2_ROOT_INO || ino >= EXT2_FIRST_INODE(ctx->fs->super)) {
2092		quota_data_add(ctx->qctx, inode, ino,
2093			       pb.num_blocks * fs->blocksize);
2094		quota_data_inodes(ctx->qctx, inode, ino, +1);
2095	}
2096
2097	if (!(fs->super->s_feature_ro_compat &
2098	      EXT4_FEATURE_RO_COMPAT_HUGE_FILE) ||
2099	    !(inode->i_flags & EXT4_HUGE_FILE_FL))
2100		pb.num_blocks *= (fs->blocksize / 512);
2101	pb.num_blocks *= EXT2FS_CLUSTER_RATIO(fs);
2102#if 0
2103	printf("inode %u, i_size = %u, last_block = %lld, i_blocks=%llu, num_blocks = %llu\n",
2104	       ino, inode->i_size, pb.last_block, ext2fs_inode_i_blocks(fs, inode),
2105	       pb.num_blocks);
2106#endif
2107	if (pb.is_dir) {
2108		int nblock = inode->i_size >> EXT2_BLOCK_SIZE_BITS(fs->super);
2109		if (inode->i_size & (fs->blocksize - 1))
2110			bad_size = 5;
2111		else if (nblock > (pb.last_block + 1))
2112			bad_size = 1;
2113		else if (nblock < (pb.last_block + 1)) {
2114			if (((pb.last_block + 1) - nblock) >
2115			    fs->super->s_prealloc_dir_blocks)
2116				bad_size = 2;
2117		}
2118	} else {
2119		e2_blkcnt_t blkpg = ctx->blocks_per_page;
2120
2121		size = EXT2_I_SIZE(inode);
2122		if ((pb.last_init_lblock >= 0) &&
2123		    /* allow allocated blocks to end of PAGE_SIZE */
2124		    (size < (__u64)pb.last_init_lblock * fs->blocksize) &&
2125		    (pb.last_init_lblock / blkpg * blkpg != pb.last_init_lblock ||
2126		     size < (__u64)(pb.last_init_lblock & ~(blkpg-1)) *
2127		     fs->blocksize))
2128			bad_size = 3;
2129		else if (!(extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) &&
2130			 size > ext2_max_sizes[fs->super->s_log_block_size])
2131			/* too big for a direct/indirect-mapped file */
2132			bad_size = 4;
2133		else if ((extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) &&
2134			 size >
2135			 ((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1))
2136			/* too big for an extent-based file - 32bit ee_block */
2137			bad_size = 6;
2138	}
2139	/* i_size for symlinks is checked elsewhere */
2140	if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {
2141		pctx->num = (pb.last_block+1) * fs->blocksize;
2142		pctx->group = bad_size;
2143		if (fix_problem(ctx, PR_1_BAD_I_SIZE, pctx)) {
2144			inode->i_size = pctx->num;
2145			if (!LINUX_S_ISDIR(inode->i_mode))
2146				inode->i_size_high = pctx->num >> 32;
2147			dirty_inode++;
2148		}
2149		pctx->num = 0;
2150	}
2151	if (LINUX_S_ISREG(inode->i_mode) && EXT2_I_SIZE(inode) >= 0x80000000UL)
2152		ctx->large_files++;
2153	if ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) ||
2154	    ((fs->super->s_feature_ro_compat &
2155	      EXT4_FEATURE_RO_COMPAT_HUGE_FILE) &&
2156	     (inode->i_flags & EXT4_HUGE_FILE_FL) &&
2157	     (inode->osd2.linux2.l_i_blocks_hi != 0))) {
2158		pctx->num = pb.num_blocks;
2159		if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) {
2160			inode->i_blocks = pb.num_blocks;
2161			inode->osd2.linux2.l_i_blocks_hi = pb.num_blocks >> 32;
2162			dirty_inode++;
2163		}
2164		pctx->num = 0;
2165	}
2166
2167	if (ctx->dirs_to_hash && pb.is_dir &&
2168	    !(inode->i_flags & EXT2_INDEX_FL) &&
2169	    ((inode->i_size / fs->blocksize) >= 3))
2170		ext2fs_u32_list_add(ctx->dirs_to_hash, ino);
2171
2172out:
2173	if (dirty_inode)
2174		e2fsck_write_inode(ctx, ino, inode, "check_blocks");
2175}
2176
2177#if 0
2178/*
2179 * Helper function called by process block when an illegal block is
2180 * found.  It returns a description about why the block is illegal
2181 */
2182static char *describe_illegal_block(ext2_filsys fs, blk64_t block)
2183{
2184	blk64_t	super;
2185	int	i;
2186	static char	problem[80];
2187
2188	super = fs->super->s_first_data_block;
2189	strcpy(problem, "PROGRAMMING ERROR: Unknown reason for illegal block");
2190	if (block < super) {
2191		sprintf(problem, "< FIRSTBLOCK (%u)", super);
2192		return(problem);
2193	} else if (block >= ext2fs_blocks_count(fs->super)) {
2194		sprintf(problem, "> BLOCKS (%u)", ext2fs_blocks_count(fs->super));
2195		return(problem);
2196	}
2197	for (i = 0; i < fs->group_desc_count; i++) {
2198		if (block == super) {
2199			sprintf(problem, "is the superblock in group %d", i);
2200			break;
2201		}
2202		if (block > super &&
2203		    block <= (super + fs->desc_blocks)) {
2204			sprintf(problem, "is in the group descriptors "
2205				"of group %d", i);
2206			break;
2207		}
2208		if (block == ext2fs_block_bitmap_loc(fs, i)) {
2209			sprintf(problem, "is the block bitmap of group %d", i);
2210			break;
2211		}
2212		if (block == ext2fs_inode_bitmap_loc(fs, i)) {
2213			sprintf(problem, "is the inode bitmap of group %d", i);
2214			break;
2215		}
2216		if (block >= ext2fs_inode_table_loc(fs, i) &&
2217		    (block < ext2fs_inode_table_loc(fs, i)
2218		     + fs->inode_blocks_per_group)) {
2219			sprintf(problem, "is in the inode table of group %d",
2220				i);
2221			break;
2222		}
2223		super += fs->super->s_blocks_per_group;
2224	}
2225	return(problem);
2226}
2227#endif
2228
2229/*
2230 * This is a helper function for check_blocks().
2231 */
2232static int process_block(ext2_filsys fs,
2233		  blk64_t	*block_nr,
2234		  e2_blkcnt_t blockcnt,
2235		  blk64_t ref_block EXT2FS_ATTR((unused)),
2236		  int ref_offset EXT2FS_ATTR((unused)),
2237		  void *priv_data)
2238{
2239	struct process_block_struct *p;
2240	struct problem_context *pctx;
2241	blk64_t	blk = *block_nr;
2242	int	ret_code = 0;
2243	int	problem = 0;
2244	e2fsck_t	ctx;
2245
2246	p = (struct process_block_struct *) priv_data;
2247	pctx = p->pctx;
2248	ctx = p->ctx;
2249
2250	if (p->compressed && (blk == EXT2FS_COMPRESSED_BLKADDR)) {
2251		/* todo: Check that the comprblk_fl is high, that the
2252		   blkaddr pattern looks right (all non-holes up to
2253		   first EXT2FS_COMPRESSED_BLKADDR, then all
2254		   EXT2FS_COMPRESSED_BLKADDR up to end of cluster),
2255		   that the feature_incompat bit is high, and that the
2256		   inode is a regular file.  If we're doing a "full
2257		   check" (a concept introduced to e2fsck by e2compr,
2258		   meaning that we look at data blocks as well as
2259		   metadata) then call some library routine that
2260		   checks the compressed data.  I'll have to think
2261		   about this, because one particularly important
2262		   problem to be able to fix is to recalculate the
2263		   cluster size if necessary.  I think that perhaps
2264		   we'd better do most/all e2compr-specific checks
2265		   separately, after the non-e2compr checks.  If not
2266		   doing a full check, it may be useful to test that
2267		   the personality is linux; e.g. if it isn't then
2268		   perhaps this really is just an illegal block. */
2269		return 0;
2270	}
2271
2272	if (blk == 0)
2273		return 0;
2274
2275#if 0
2276	printf("Process_block, inode %lu, block %u, #%d\n", p->ino, blk,
2277	       blockcnt);
2278#endif
2279
2280	/*
2281	 * Simplistic fragmentation check.  We merely require that the
2282	 * file be contiguous.  (Which can never be true for really
2283	 * big files that are greater than a block group.)
2284	 */
2285	if (!HOLE_BLKADDR(p->previous_block) && p->ino != EXT2_RESIZE_INO) {
2286		if (p->previous_block+1 != blk) {
2287			if (ctx->options & E2F_OPT_FRAGCHECK) {
2288				char type = '?';
2289
2290				if (p->is_dir)
2291					type = 'd';
2292				else if (p->is_reg)
2293					type = 'f';
2294
2295				printf(_("%6lu(%c): expecting %6lu "
2296					 "got phys %6lu (blkcnt %lld)\n"),
2297				       (unsigned long) pctx->ino, type,
2298				       (unsigned long) p->previous_block+1,
2299				       (unsigned long) blk,
2300				       blockcnt);
2301			}
2302			p->fragmented = 1;
2303		}
2304	}
2305
2306	if (p->is_dir && blockcnt > (1 << (21 - fs->super->s_log_block_size)))
2307		problem = PR_1_TOOBIG_DIR;
2308	if (p->is_reg && p->num_blocks+1 >= p->max_blocks)
2309		problem = PR_1_TOOBIG_REG;
2310	if (!p->is_dir && !p->is_reg && blockcnt > 0)
2311		problem = PR_1_TOOBIG_SYMLINK;
2312
2313	if (blk < fs->super->s_first_data_block ||
2314	    blk >= ext2fs_blocks_count(fs->super))
2315		problem = PR_1_ILLEGAL_BLOCK_NUM;
2316
2317	if (problem) {
2318		p->num_illegal_blocks++;
2319		if (!p->suppress && (p->num_illegal_blocks % 12) == 0) {
2320			if (fix_problem(ctx, PR_1_TOO_MANY_BAD_BLOCKS, pctx)) {
2321				p->clear = 1;
2322				return BLOCK_ABORT;
2323			}
2324			if (fix_problem(ctx, PR_1_SUPPRESS_MESSAGES, pctx)) {
2325				p->suppress = 1;
2326				set_latch_flags(PR_LATCH_BLOCK,
2327						PRL_SUPPRESS, 0);
2328			}
2329		}
2330		pctx->blk = blk;
2331		pctx->blkcount = blockcnt;
2332		if (fix_problem(ctx, problem, pctx)) {
2333			blk = *block_nr = 0;
2334			ret_code = BLOCK_CHANGED;
2335			goto mark_dir;
2336		} else
2337			return 0;
2338	}
2339
2340	if (p->ino == EXT2_RESIZE_INO) {
2341		/*
2342		 * The resize inode has already be sanity checked
2343		 * during pass #0 (the superblock checks).  All we
2344		 * have to do is mark the double indirect block as
2345		 * being in use; all of the other blocks are handled
2346		 * by mark_table_blocks()).
2347		 */
2348		if (blockcnt == BLOCK_COUNT_DIND)
2349			mark_block_used(ctx, blk);
2350		p->num_blocks++;
2351	} else if (!(ctx->fs->cluster_ratio_bits &&
2352		     p->previous_block &&
2353		     (EXT2FS_B2C(ctx->fs, blk) ==
2354		      EXT2FS_B2C(ctx->fs, p->previous_block)) &&
2355		     (blk & EXT2FS_CLUSTER_MASK(ctx->fs)) ==
2356		     (blockcnt & EXT2FS_CLUSTER_MASK(ctx->fs)))) {
2357		mark_block_used(ctx, blk);
2358		p->num_blocks++;
2359	}
2360	if (blockcnt >= 0)
2361		p->last_block = blockcnt;
2362	p->previous_block = blk;
2363mark_dir:
2364	if (p->is_dir && (blockcnt >= 0)) {
2365		while (++p->last_db_block < blockcnt) {
2366			pctx->errcode = ext2fs_add_dir_block2(fs->dblist,
2367							      p->ino, 0,
2368							      p->last_db_block);
2369			if (pctx->errcode) {
2370				pctx->blk = 0;
2371				pctx->num = p->last_db_block;
2372				goto failed_add_dir_block;
2373			}
2374		}
2375		pctx->errcode = ext2fs_add_dir_block2(fs->dblist, p->ino,
2376						      blk, blockcnt);
2377		if (pctx->errcode) {
2378			pctx->blk = blk;
2379			pctx->num = blockcnt;
2380		failed_add_dir_block:
2381			fix_problem(ctx, PR_1_ADD_DBLOCK, pctx);
2382			/* Should never get here */
2383			ctx->flags |= E2F_FLAG_ABORT;
2384			return BLOCK_ABORT;
2385		}
2386	}
2387	return ret_code;
2388}
2389
2390static int process_bad_block(ext2_filsys fs,
2391		      blk64_t *block_nr,
2392		      e2_blkcnt_t blockcnt,
2393		      blk64_t ref_block EXT2FS_ATTR((unused)),
2394		      int ref_offset EXT2FS_ATTR((unused)),
2395		      void *priv_data)
2396{
2397	struct process_block_struct *p;
2398	blk64_t		blk = *block_nr;
2399	blk64_t		first_block;
2400	dgrp_t		i;
2401	struct problem_context *pctx;
2402	e2fsck_t	ctx;
2403
2404	/*
2405	 * Note: This function processes blocks for the bad blocks
2406	 * inode, which is never compressed.  So we don't use HOLE_BLKADDR().
2407	 */
2408
2409	if (!blk)
2410		return 0;
2411
2412	p = (struct process_block_struct *) priv_data;
2413	ctx = p->ctx;
2414	pctx = p->pctx;
2415
2416	pctx->ino = EXT2_BAD_INO;
2417	pctx->blk = blk;
2418	pctx->blkcount = blockcnt;
2419
2420	if ((blk < fs->super->s_first_data_block) ||
2421	    (blk >= ext2fs_blocks_count(fs->super))) {
2422		if (fix_problem(ctx, PR_1_BB_ILLEGAL_BLOCK_NUM, pctx)) {
2423			*block_nr = 0;
2424			return BLOCK_CHANGED;
2425		} else
2426			return 0;
2427	}
2428
2429	if (blockcnt < 0) {
2430		if (ext2fs_test_block_bitmap2(p->fs_meta_blocks, blk)) {
2431			p->bbcheck = 1;
2432			if (fix_problem(ctx, PR_1_BB_FS_BLOCK, pctx)) {
2433				*block_nr = 0;
2434				return BLOCK_CHANGED;
2435			}
2436		} else if (ext2fs_test_block_bitmap2(ctx->block_found_map,
2437						    blk)) {
2438			p->bbcheck = 1;
2439			if (fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK,
2440					pctx)) {
2441				*block_nr = 0;
2442				return BLOCK_CHANGED;
2443			}
2444			if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
2445				return BLOCK_ABORT;
2446		} else
2447			mark_block_used(ctx, blk);
2448		return 0;
2449	}
2450#if 0
2451	printf ("DEBUG: Marking %u as bad.\n", blk);
2452#endif
2453	ctx->fs_badblocks_count++;
2454	/*
2455	 * If the block is not used, then mark it as used and return.
2456	 * If it is already marked as found, this must mean that
2457	 * there's an overlap between the filesystem table blocks
2458	 * (bitmaps and inode table) and the bad block list.
2459	 */
2460	if (!ext2fs_test_block_bitmap2(ctx->block_found_map, blk)) {
2461		ext2fs_mark_block_bitmap2(ctx->block_found_map, blk);
2462		return 0;
2463	}
2464	/*
2465	 * Try to find the where the filesystem block was used...
2466	 */
2467	first_block = fs->super->s_first_data_block;
2468
2469	for (i = 0; i < fs->group_desc_count; i++ ) {
2470		pctx->group = i;
2471		pctx->blk = blk;
2472		if (!ext2fs_bg_has_super(fs, i))
2473			goto skip_super;
2474		if (blk == first_block) {
2475			if (i == 0) {
2476				if (fix_problem(ctx,
2477						PR_1_BAD_PRIMARY_SUPERBLOCK,
2478						pctx)) {
2479					*block_nr = 0;
2480					return BLOCK_CHANGED;
2481				}
2482				return 0;
2483			}
2484			fix_problem(ctx, PR_1_BAD_SUPERBLOCK, pctx);
2485			return 0;
2486		}
2487		if ((blk > first_block) &&
2488		    (blk <= first_block + fs->desc_blocks)) {
2489			if (i == 0) {
2490				pctx->blk = *block_nr;
2491				if (fix_problem(ctx,
2492			PR_1_BAD_PRIMARY_GROUP_DESCRIPTOR, pctx)) {
2493					*block_nr = 0;
2494					return BLOCK_CHANGED;
2495				}
2496				return 0;
2497			}
2498			fix_problem(ctx, PR_1_BAD_GROUP_DESCRIPTORS, pctx);
2499			return 0;
2500		}
2501	skip_super:
2502		if (blk == ext2fs_block_bitmap_loc(fs, i)) {
2503			if (fix_problem(ctx, PR_1_BB_BAD_BLOCK, pctx)) {
2504				ctx->invalid_block_bitmap_flag[i]++;
2505				ctx->invalid_bitmaps++;
2506			}
2507			return 0;
2508		}
2509		if (blk == ext2fs_inode_bitmap_loc(fs, i)) {
2510			if (fix_problem(ctx, PR_1_IB_BAD_BLOCK, pctx)) {
2511				ctx->invalid_inode_bitmap_flag[i]++;
2512				ctx->invalid_bitmaps++;
2513			}
2514			return 0;
2515		}
2516		if ((blk >= ext2fs_inode_table_loc(fs, i)) &&
2517		    (blk < (ext2fs_inode_table_loc(fs, i) +
2518			    fs->inode_blocks_per_group))) {
2519			/*
2520			 * If there are bad blocks in the inode table,
2521			 * the inode scan code will try to do
2522			 * something reasonable automatically.
2523			 */
2524			return 0;
2525		}
2526		first_block += fs->super->s_blocks_per_group;
2527	}
2528	/*
2529	 * If we've gotten to this point, then the only
2530	 * possibility is that the bad block inode meta data
2531	 * is using a bad block.
2532	 */
2533	if ((blk == p->inode->i_block[EXT2_IND_BLOCK]) ||
2534	    (blk == p->inode->i_block[EXT2_DIND_BLOCK]) ||
2535	    (blk == p->inode->i_block[EXT2_TIND_BLOCK])) {
2536		p->bbcheck = 1;
2537		if (fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK, pctx)) {
2538			*block_nr = 0;
2539			return BLOCK_CHANGED;
2540		}
2541		if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
2542			return BLOCK_ABORT;
2543		return 0;
2544	}
2545
2546	pctx->group = -1;
2547
2548	/* Warn user that the block wasn't claimed */
2549	fix_problem(ctx, PR_1_PROGERR_CLAIMED_BLOCK, pctx);
2550
2551	return 0;
2552}
2553
2554static void new_table_block(e2fsck_t ctx, blk_t first_block, int group,
2555			    const char *name, int num, blk64_t *new_block)
2556{
2557	ext2_filsys fs = ctx->fs;
2558	dgrp_t		last_grp;
2559	blk64_t		old_block = *new_block;
2560	blk64_t		last_block;
2561	int		i, is_flexbg, flexbg, flexbg_size;
2562	char		*buf;
2563	struct problem_context	pctx;
2564
2565	clear_problem_context(&pctx);
2566
2567	pctx.group = group;
2568	pctx.blk = old_block;
2569	pctx.str = name;
2570
2571	/*
2572	 * For flex_bg filesystems, first try to allocate the metadata
2573	 * within the flex_bg, and if that fails then try finding the
2574	 * space anywhere in the filesystem.
2575	 */
2576	is_flexbg = EXT2_HAS_INCOMPAT_FEATURE(fs->super,
2577					      EXT4_FEATURE_INCOMPAT_FLEX_BG);
2578	if (is_flexbg) {
2579		flexbg_size = 1 << fs->super->s_log_groups_per_flex;
2580		flexbg = group / flexbg_size;
2581		first_block = ext2fs_group_first_block2(fs,
2582							flexbg_size * flexbg);
2583		last_grp = group | (flexbg_size - 1);
2584		if (last_grp > fs->group_desc_count)
2585			last_grp = fs->group_desc_count;
2586		last_block = ext2fs_group_last_block2(fs, last_grp);
2587	} else
2588		last_block = ext2fs_group_last_block2(fs, group);
2589	pctx.errcode = ext2fs_get_free_blocks2(fs, first_block, last_block,
2590					       num, ctx->block_found_map,
2591					       new_block);
2592	if (is_flexbg && (pctx.errcode == EXT2_ET_BLOCK_ALLOC_FAIL))
2593		pctx.errcode = ext2fs_get_free_blocks2(fs,
2594				fs->super->s_first_data_block,
2595				ext2fs_blocks_count(fs->super),
2596				num, ctx->block_found_map, new_block);
2597	if (pctx.errcode) {
2598		pctx.num = num;
2599		fix_problem(ctx, PR_1_RELOC_BLOCK_ALLOCATE, &pctx);
2600		ext2fs_unmark_valid(fs);
2601		ctx->flags |= E2F_FLAG_ABORT;
2602		return;
2603	}
2604	pctx.errcode = ext2fs_get_mem(fs->blocksize, &buf);
2605	if (pctx.errcode) {
2606		fix_problem(ctx, PR_1_RELOC_MEMORY_ALLOCATE, &pctx);
2607		ext2fs_unmark_valid(fs);
2608		ctx->flags |= E2F_FLAG_ABORT;
2609		return;
2610	}
2611	ext2fs_mark_super_dirty(fs);
2612	fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
2613	pctx.blk2 = *new_block;
2614	fix_problem(ctx, (old_block ? PR_1_RELOC_FROM_TO :
2615			  PR_1_RELOC_TO), &pctx);
2616	pctx.blk2 = 0;
2617	for (i = 0; i < num; i++) {
2618		pctx.blk = i;
2619		ext2fs_mark_block_bitmap2(ctx->block_found_map, (*new_block)+i);
2620		if (old_block) {
2621			pctx.errcode = io_channel_read_blk64(fs->io,
2622				   old_block + i, 1, buf);
2623			if (pctx.errcode)
2624				fix_problem(ctx, PR_1_RELOC_READ_ERR, &pctx);
2625		} else
2626			memset(buf, 0, fs->blocksize);
2627
2628		pctx.blk = (*new_block) + i;
2629		pctx.errcode = io_channel_write_blk64(fs->io, pctx.blk,
2630					      1, buf);
2631		if (pctx.errcode)
2632			fix_problem(ctx, PR_1_RELOC_WRITE_ERR, &pctx);
2633	}
2634	ext2fs_free_mem(&buf);
2635}
2636
2637/*
2638 * This routine gets called at the end of pass 1 if bad blocks are
2639 * detected in the superblock, group descriptors, inode_bitmaps, or
2640 * block bitmaps.  At this point, all of the blocks have been mapped
2641 * out, so we can try to allocate new block(s) to replace the bad
2642 * blocks.
2643 */
2644static void handle_fs_bad_blocks(e2fsck_t ctx)
2645{
2646	ext2_filsys fs = ctx->fs;
2647	dgrp_t		i;
2648	blk64_t		first_block;
2649	blk64_t		new_blk;
2650
2651	for (i = 0; i < fs->group_desc_count; i++) {
2652		first_block = ext2fs_group_first_block2(fs, i);
2653
2654		if (ctx->invalid_block_bitmap_flag[i]) {
2655			new_blk = ext2fs_block_bitmap_loc(fs, i);
2656			new_table_block(ctx, first_block, i, _("block bitmap"),
2657					1, &new_blk);
2658			ext2fs_block_bitmap_loc_set(fs, i, new_blk);
2659		}
2660		if (ctx->invalid_inode_bitmap_flag[i]) {
2661			new_blk = ext2fs_inode_bitmap_loc(fs, i);
2662			new_table_block(ctx, first_block, i, _("inode bitmap"),
2663					1, &new_blk);
2664			ext2fs_inode_bitmap_loc_set(fs, i, new_blk);
2665		}
2666		if (ctx->invalid_inode_table_flag[i]) {
2667			new_blk = ext2fs_inode_table_loc(fs, i);
2668			new_table_block(ctx, first_block, i, _("inode table"),
2669					fs->inode_blocks_per_group,
2670					&new_blk);
2671			ext2fs_inode_table_loc_set(fs, i, new_blk);
2672			ctx->flags |= E2F_FLAG_RESTART;
2673		}
2674	}
2675	ctx->invalid_bitmaps = 0;
2676}
2677
2678/*
2679 * This routine marks all blocks which are used by the superblock,
2680 * group descriptors, inode bitmaps, and block bitmaps.
2681 */
2682static void mark_table_blocks(e2fsck_t ctx)
2683{
2684	ext2_filsys fs = ctx->fs;
2685	blk64_t	b;
2686	dgrp_t	i;
2687	int	j;
2688	struct problem_context pctx;
2689
2690	clear_problem_context(&pctx);
2691
2692	for (i = 0; i < fs->group_desc_count; i++) {
2693		pctx.group = i;
2694
2695		ext2fs_reserve_super_and_bgd(fs, i, ctx->block_found_map);
2696
2697		/*
2698		 * Mark the blocks used for the inode table
2699		 */
2700		if (ext2fs_inode_table_loc(fs, i)) {
2701			for (j = 0, b = ext2fs_inode_table_loc(fs, i);
2702			     j < fs->inode_blocks_per_group;
2703			     j++, b++) {
2704				if (ext2fs_test_block_bitmap2(ctx->block_found_map,
2705							     b)) {
2706					pctx.blk = b;
2707					if (!ctx->invalid_inode_table_flag[i] &&
2708					    fix_problem(ctx,
2709						PR_1_ITABLE_CONFLICT, &pctx)) {
2710						ctx->invalid_inode_table_flag[i]++;
2711						ctx->invalid_bitmaps++;
2712					}
2713				} else {
2714				    ext2fs_mark_block_bitmap2(ctx->block_found_map,
2715							     b);
2716			    	}
2717			}
2718		}
2719
2720		/*
2721		 * Mark block used for the block bitmap
2722		 */
2723		if (ext2fs_block_bitmap_loc(fs, i)) {
2724			if (ext2fs_test_block_bitmap2(ctx->block_found_map,
2725				     ext2fs_block_bitmap_loc(fs, i))) {
2726				pctx.blk = ext2fs_block_bitmap_loc(fs, i);
2727				if (fix_problem(ctx, PR_1_BB_CONFLICT, &pctx)) {
2728					ctx->invalid_block_bitmap_flag[i]++;
2729					ctx->invalid_bitmaps++;
2730				}
2731			} else {
2732			    ext2fs_mark_block_bitmap2(ctx->block_found_map,
2733				     ext2fs_block_bitmap_loc(fs, i));
2734		    }
2735
2736		}
2737		/*
2738		 * Mark block used for the inode bitmap
2739		 */
2740		if (ext2fs_inode_bitmap_loc(fs, i)) {
2741			if (ext2fs_test_block_bitmap2(ctx->block_found_map,
2742				     ext2fs_inode_bitmap_loc(fs, i))) {
2743				pctx.blk = ext2fs_inode_bitmap_loc(fs, i);
2744				if (fix_problem(ctx, PR_1_IB_CONFLICT, &pctx)) {
2745					ctx->invalid_inode_bitmap_flag[i]++;
2746					ctx->invalid_bitmaps++;
2747				}
2748			} else {
2749			    ext2fs_mark_block_bitmap2(ctx->block_found_map,
2750				     ext2fs_inode_bitmap_loc(fs, i));
2751			}
2752		}
2753	}
2754}
2755
2756/*
2757 * Thes subroutines short circuits ext2fs_get_blocks and
2758 * ext2fs_check_directory; we use them since we already have the inode
2759 * structure, so there's no point in letting the ext2fs library read
2760 * the inode again.
2761 */
2762static errcode_t pass1_get_blocks(ext2_filsys fs, ext2_ino_t ino,
2763				  blk_t *blocks)
2764{
2765	e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2766	int	i;
2767
2768	if ((ino != ctx->stashed_ino) || !ctx->stashed_inode)
2769		return EXT2_ET_CALLBACK_NOTHANDLED;
2770
2771	for (i=0; i < EXT2_N_BLOCKS; i++)
2772		blocks[i] = ctx->stashed_inode->i_block[i];
2773	return 0;
2774}
2775
2776static errcode_t pass1_read_inode(ext2_filsys fs, ext2_ino_t ino,
2777				  struct ext2_inode *inode)
2778{
2779	e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2780
2781	if ((ino != ctx->stashed_ino) || !ctx->stashed_inode)
2782		return EXT2_ET_CALLBACK_NOTHANDLED;
2783	*inode = *ctx->stashed_inode;
2784	return 0;
2785}
2786
2787static errcode_t pass1_write_inode(ext2_filsys fs, ext2_ino_t ino,
2788			    struct ext2_inode *inode)
2789{
2790	e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2791
2792	if ((ino == ctx->stashed_ino) && ctx->stashed_inode &&
2793		(inode != ctx->stashed_inode))
2794		*ctx->stashed_inode = *inode;
2795	return EXT2_ET_CALLBACK_NOTHANDLED;
2796}
2797
2798static errcode_t pass1_check_directory(ext2_filsys fs, ext2_ino_t ino)
2799{
2800	e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2801
2802	if ((ino != ctx->stashed_ino) || !ctx->stashed_inode)
2803		return EXT2_ET_CALLBACK_NOTHANDLED;
2804
2805	if (!LINUX_S_ISDIR(ctx->stashed_inode->i_mode))
2806		return EXT2_ET_NO_DIRECTORY;
2807	return 0;
2808}
2809
2810static errcode_t e2fsck_get_alloc_block(ext2_filsys fs, blk64_t goal,
2811					blk64_t *ret)
2812{
2813	e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2814	errcode_t	retval;
2815	blk64_t		new_block;
2816
2817	if (ctx->block_found_map) {
2818		retval = ext2fs_new_block2(fs, goal, ctx->block_found_map,
2819					   &new_block);
2820		if (retval)
2821			return retval;
2822		if (fs->block_map) {
2823			ext2fs_mark_block_bitmap2(fs->block_map, new_block);
2824			ext2fs_mark_bb_dirty(fs);
2825		}
2826	} else {
2827		if (!fs->block_map) {
2828			retval = ext2fs_read_block_bitmap(fs);
2829			if (retval)
2830				return retval;
2831		}
2832
2833		retval = ext2fs_new_block2(fs, goal, 0, &new_block);
2834		if (retval)
2835			return retval;
2836	}
2837
2838	*ret = new_block;
2839	return (0);
2840}
2841
2842static void e2fsck_block_alloc_stats(ext2_filsys fs, blk64_t blk, int inuse)
2843{
2844	e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2845
2846	if (ctx->block_found_map) {
2847		if (inuse > 0)
2848			ext2fs_mark_block_bitmap2(ctx->block_found_map, blk);
2849		else
2850			ext2fs_unmark_block_bitmap2(ctx->block_found_map, blk);
2851	}
2852}
2853
2854void e2fsck_use_inode_shortcuts(e2fsck_t ctx, int use_shortcuts)
2855{
2856	ext2_filsys fs = ctx->fs;
2857
2858	if (use_shortcuts) {
2859		fs->get_blocks = pass1_get_blocks;
2860		fs->check_directory = pass1_check_directory;
2861		fs->read_inode = pass1_read_inode;
2862		fs->write_inode = pass1_write_inode;
2863		ctx->stashed_ino = 0;
2864		ext2fs_set_alloc_block_callback(fs, e2fsck_get_alloc_block,
2865						0);
2866		ext2fs_set_block_alloc_stats_callback(fs,
2867						      e2fsck_block_alloc_stats,
2868						      0);
2869	} else {
2870		fs->get_blocks = 0;
2871		fs->check_directory = 0;
2872		fs->read_inode = 0;
2873		fs->write_inode = 0;
2874	}
2875}
2876