From 6267ee49be64035d8a9772c3bafed18a09874fa5 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Thu, 28 May 2009 00:39:49 -0600 Subject: [PATCH] e2fsck: only restart e2fsck once for inodes in uninit range Restart e2fsck only once in case of multiple inodes in uninit range. Display correct inode number during BG_INO_UNINIT and INOREF_IN_USED errors. Signed-off-by: Kalpak Shah Signed-off-by: Andreas Dilger Signed-off-by: Theodore Ts'o --- e2fsck/e2fsck.h | 1 + e2fsck/pass2.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h index 553a8c4..4722dcc 100644 --- a/e2fsck/e2fsck.h +++ b/e2fsck/e2fsck.h @@ -163,6 +163,7 @@ struct resource_track { #define E2F_FLAG_CANCEL 0x0002 /* Cancel signaled */ #define E2F_FLAG_SIGNAL_MASK 0x0003 #define E2F_FLAG_RESTART 0x0004 /* Restart signaled */ +#define E2F_FLAG_RESTART_LATER 0x0008 /* Restart after all iterations done */ #define E2F_FLAG_SETJMP_OK 0x0010 /* Setjmp valid for abort */ diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index b33f596..7b79f4b 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -153,6 +153,12 @@ void e2fsck_pass2(e2fsck_t ctx) &cd); if (ctx->flags & E2F_FLAG_SIGNAL_MASK || ctx->flags & E2F_FLAG_RESTART) return; + + if (ctx->flags & E2F_FLAG_RESTART_LATER) { + ctx->flags |= E2F_FLAG_RESTART; + return; + } + if (cd.pctx.errcode) { fix_problem(ctx, PR_2_DBLIST_ITERATE, &cd.pctx); ctx->flags |= E2F_FLAG_ABORT; @@ -988,23 +994,24 @@ out_htree: * newly visible inodes. */ if (fs->group_desc[group].bg_flags & EXT2_BG_INODE_UNINIT) { + pctx.num = dirent->inode; if (fix_problem(ctx, PR_2_INOREF_BG_INO_UNINIT, &cd->pctx)){ fs->group_desc[group].bg_flags &= ~EXT2_BG_INODE_UNINIT; ext2fs_mark_super_dirty(fs); - ctx->flags |= E2F_FLAG_RESTART; + ctx->flags |= E2F_FLAG_RESTART_LATER; } else { ext2fs_unmark_valid(fs); if (problem == PR_2_BAD_INO) goto next; } } else if (dirent->inode >= first_unused_inode) { + pctx.num = dirent->inode; if (fix_problem(ctx, PR_2_INOREF_IN_UNUSED, &cd->pctx)){ fs->group_desc[group].bg_itable_unused = 0; ext2fs_mark_super_dirty(fs); - ctx->flags |= E2F_FLAG_RESTART; - goto restart_fsck; + ctx->flags |= E2F_FLAG_RESTART_LATER; } else { ext2fs_unmark_valid(fs); if (problem == PR_2_BAD_INO) @@ -1145,7 +1152,6 @@ out_htree: return 0; abort_free_dict: ctx->flags |= E2F_FLAG_ABORT; -restart_fsck: dict_free_nodes(&de_dict); return DIRENT_ABORT; } -- 1.8.3.1