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