119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * e2fsck.c - a consistency checker for the new extended file system.
33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1993, 1994, 1995, 1996, 1997 Theodore Ts'o.
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header%
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License.
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header%
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h>
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2fsck.h"
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "problem.h"
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * This function allocates an e2fsck context
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t e2fsck_allocate_context(e2fsck_t *ret)
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	e2fsck_t	context;
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval;
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		*time_env;
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_get_mem(sizeof(struct e2fsck_struct), &context);
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval)
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return retval;
293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	memset(context, 0, sizeof(struct e2fsck_struct));
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	context->process_inode_size = 256;
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	context->ext_attr_ver = 2;
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	context->blocks_per_page = 1;
353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	context->htree_slack_percentage = 255;
363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	time_env = getenv("E2FSCK_TIME");
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (time_env)
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		context->now = strtoul(time_env, NULL, 0);
408558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	else {
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		context->now = time(0);
428558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall		if (context->now < 1262322000) /* January 1 2010 */
438558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall			context->flags |= E2F_FLAG_TIME_INSANE;
448558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	}
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	*ret = context;
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function resets an e2fsck context; it is called when e2fsck
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * needs to be restarted.
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t e2fsck_reset_context(e2fsck_t ctx)
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	int	i;
573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
588558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall	ctx->flags &= E2F_RESET_FLAGS;
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->lost_and_found = 0;
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->bad_lost_and_found = 0;
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_used_map) {
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_inode_bitmap(ctx->inode_used_map);
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_used_map = 0;
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_dir_map) {
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_inode_bitmap(ctx->inode_dir_map);
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_dir_map = 0;
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_reg_map) {
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_inode_bitmap(ctx->inode_reg_map);
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_reg_map = 0;
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->block_found_map) {
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_block_bitmap(ctx->block_found_map);
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->block_found_map = 0;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_link_info) {
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_icount(ctx->inode_link_info);
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_link_info = 0;
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->journal_io) {
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ctx->fs && ctx->fs->io != ctx->journal_io)
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			io_channel_close(ctx->journal_io);
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->journal_io = 0;
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->fs && ctx->fs->dblist) {
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_dblist(ctx->fs->dblist);
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->fs->dblist = 0;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	e2fsck_free_dir_info(ctx);
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef ENABLE_HTREE
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	e2fsck_free_dx_dir_info(ctx);
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->refcount) {
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ea_refcount_free(ctx->refcount);
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->refcount = 0;
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->refcount_extra) {
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ea_refcount_free(ctx->refcount_extra);
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->refcount_extra = 0;
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->block_dup_map) {
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_block_bitmap(ctx->block_dup_map);
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->block_dup_map = 0;
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->block_ea_map) {
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_block_bitmap(ctx->block_ea_map);
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->block_ea_map = 0;
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_bb_map) {
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_inode_bitmap(ctx->inode_bb_map);
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_bb_map = 0;
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_bad_map) {
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_inode_bitmap(ctx->inode_bad_map);
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_bad_map = 0;
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->inode_imagic_map) {
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_inode_bitmap(ctx->inode_imagic_map);
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->inode_imagic_map = 0;
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->dirs_to_hash) {
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_u32_list_free(ctx->dirs_to_hash);
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->dirs_to_hash = 0;
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	/*
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 * Clear the array of invalid meta-data flags
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 */
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->invalid_inode_bitmap_flag) {
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_mem(&ctx->invalid_inode_bitmap_flag);
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->invalid_inode_bitmap_flag = 0;
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->invalid_block_bitmap_flag) {
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_mem(&ctx->invalid_block_bitmap_flag);
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->invalid_block_bitmap_flag = 0;
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->invalid_inode_table_flag) {
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_mem(&ctx->invalid_inode_table_flag);
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->invalid_inode_table_flag = 0;
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	/* Clear statistic counters */
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_directory_count = 0;
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_regular_count = 0;
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_blockdev_count = 0;
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_chardev_count = 0;
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_links_count = 0;
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_symlinks_count = 0;
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_fast_symlinks_count = 0;
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_fifo_count = 0;
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_total_count = 0;
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_badblocks_count = 0;
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_sockets_count = 0;
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_ind_count = 0;
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_dind_count = 0;
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_tind_count = 0;
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->fs_fragmented = 0;
1593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	ctx->fs_fragmented_dir = 0;
16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->large_files = 0;
16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	for (i=0; i < MAX_EXTENT_DEPTH_COUNT; i++)
1633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		ctx->extent_depth_count[i] = 0;
1643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	/* Reset the superblock to the user's requested value */
16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->superblock = ctx->use_superblock;
1673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid e2fsck_free_context(e2fsck_t ctx)
17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!ctx)
17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return;
1753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	e2fsck_reset_context(ctx);
17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->blkid)
17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		blkid_put_cache(ctx->blkid);
17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->profile)
18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		profile_release(ctx->profile);
1823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
1833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	if (ctx->filesystem_name)
1843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		ext2fs_free_mem(&ctx->filesystem_name);
1853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
1863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	if (ctx->device_name)
1873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		ext2fs_free_mem(&ctx->device_name);
1883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2fs_free_mem(&ctx);
19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function runs through the e2fsck passes and calls them all,
19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * returning restart, abort, or cancel as necessary...
19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttypedef void (*pass_t)(e2fsck_t ctx);
19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectpass_t e2fsck_passes[] = {
19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	e2fsck_pass1, e2fsck_pass2, e2fsck_pass3, e2fsck_pass4,
20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	e2fsck_pass5, 0 };
20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define E2F_FLAG_RUN_RETURN	(E2F_FLAG_SIGNAL_MASK|E2F_FLAG_RESTART)
20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint e2fsck_run(e2fsck_t ctx)
20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	i;
20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	pass_t	e2fsck_pass;
20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_SETJMP_H
21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (setjmp(ctx->abort_loc)) {
21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ctx->flags &= ~E2F_FLAG_SETJMP_OK;
21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return (ctx->flags & E2F_FLAG_RUN_RETURN);
21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->flags |= E2F_FLAG_SETJMP_OK;
21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (i=0; (e2fsck_pass = e2fsck_passes[i]); i++) {
21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ctx->flags & E2F_FLAG_RUN_RETURN)
21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		e2fsck_pass(ctx);
22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ctx->progress)
22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			(void) (ctx->progress)(ctx, 0, 0, 0);
22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ctx->flags &= ~E2F_FLAG_SETJMP_OK;
2253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ctx->flags & E2F_FLAG_RUN_RETURN)
22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return (ctx->flags & E2F_FLAG_RUN_RETURN);
22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
230