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