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