Whamcloud - gitweb
e2fsck: only restart e2fsck once for inodes in uninit range
authorAndreas Dilger <adilger@sun.com>
Thu, 28 May 2009 06:39:49 +0000 (00:39 -0600)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 28 May 2009 11:58:52 +0000 (07:58 -0400)
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 <kalpak.shah@sun.com>
Signed-off-by: Andreas Dilger <adilger@sun.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e2fsck/e2fsck.h
e2fsck/pass2.c

index 553a8c4..4722dcc 100644 (file)
@@ -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 */
 
index b33f596..7b79f4b 100644 (file)
@@ -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;
 }