aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2020-01-17 10:51:16 -0500
committerTheodore Ts'o <tytso@mit.edu>2020-01-17 10:51:16 -0500
commitdbc05604d33aece6c4ab55e9f621213243117212 (patch)
tree194707d74fd41657cec7a85c12deb0e448ad1c58
parentf8e4f457d30ccff19833ddaf6514632f054a4418 (diff)
downloade2fsprogs-dbc05604d33aece6c4ab55e9f621213243117212.tar.gz
e2fsck: restart the full e2fsck run if the bad block inode is invalidate
Previously, we just cleared the bad block list and restarted the inode scan, but we didn't do a full reset of all of e2fsck's state. When code handling this case; we didn't have the framework to do a restarted run. Now that we do, we can simply the code and make it more correct. Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--e2fsck/pass1.c14
-rw-r--r--tests/f_bb_in_bb/expect.12
2 files changed, 5 insertions, 11 deletions
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index ed85431da..4de9ca653 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -1382,17 +1382,9 @@ void e2fsck_pass1(e2fsck_t ctx)
fix_problem(ctx, PR_1_ISCAN_ERROR,
&pctx);
ctx->flags |= E2F_FLAG_ABORT;
- goto endit;
- }
- err = ext2fs_inode_scan_goto_blockgroup(scan,
- 0);
- if (err) {
- fix_problem(ctx, PR_1_ISCAN_ERROR,
- &pctx);
- ctx->flags |= E2F_FLAG_ABORT;
- goto endit;
- }
- continue;
+ } else
+ ctx->flags |= E2F_FLAG_RESTART;
+ goto endit;
}
if (!ctx->inode_bb_map)
alloc_bb_map(ctx);
diff --git a/tests/f_bb_in_bb/expect.1 b/tests/f_bb_in_bb/expect.1
index 1d719e51f..1bd697ec9 100644
--- a/tests/f_bb_in_bb/expect.1
+++ b/tests/f_bb_in_bb/expect.1
@@ -1,6 +1,8 @@
Pass 1: Checking inodes, blocks, and sizes
Bad block list says the bad block list inode is bad. Clear inode? yes
+Restarting e2fsck from the beginning...
+Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts