diff --git a/e2fsck/journal.c b/e2fsck/journal.c index 519df487..1f10305d 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -420,7 +420,7 @@ static errcode_t e2fsck_journal_fix_bad_inode(e2fsck_t ctx, "filesystem is now ext2 only ***\n\n"); sb->s_feature_compat &= ~EXT3_FEATURE_COMPAT_HAS_JOURNAL; sb->s_journal_inum = 0; - ctx->flags |= E2F_FLAG_JOURNAL_INODE; /* FIXME: todo */ + ctx->flags |= E2F_FLAG_JOURNAL_INODE; e2fsck_clear_recover(ctx, 1); return 0; } diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 9f4af509..87de6459 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -1494,6 +1494,11 @@ static struct e2fsck_problem problem_table[] = { " +(%i--%j)", PROMPT_NONE, PR_LATCH_IBITMAP | PR_PREEN_OK | PR_PREEN_NOMSG }, + /* Recreate journal if E2F_FLAG_JOURNAL_INODE flag is set */ + { PR_6_RECREATE_JOURNAL, + N_("Recreate journal to make the filesystem ext3 again?\n"), + PROMPT_FIX, PR_PREEN_OK | PR_NO_OK }, + { 0 } }; diff --git a/e2fsck/problem.h b/e2fsck/problem.h index 560907ac..28fe9646 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -900,6 +900,13 @@ struct problem_context { /* Inode rangeused, but not marked used in bitmap */ #define PR_5_INODE_RANGE_USED 0x050017 +/* + * Post-Pass 5 errors + */ + +/* Recreate the journal if E2F_FLAG_JOURNAL_INODE flag is set */ +#define PR_6_RECREATE_JOURNAL 0x060001 + /* * Function declarations */ diff --git a/e2fsck/unix.c b/e2fsck/unix.c index 72091f88..b01a62a3 100644 --- a/e2fsck/unix.c +++ b/e2fsck/unix.c @@ -851,6 +851,7 @@ int main (int argc, char *argv[]) e2fsck_t ctx; struct problem_context pctx; int flags, run_result; + int journal_size; clear_problem_context(&pctx); #ifdef MTRACE @@ -1184,8 +1185,47 @@ restart: " but we'll try to go on...\n")); } + /* + * Save the journal size in megabytes. + * Try and use the journal size from the backup else let e2fsck + * find the default journal size. + */ + if (sb->s_jnl_backup_type == EXT3_JNL_BACKUP_BLOCKS) + journal_size = sb->s_jnl_blocks[16] >> 20; + else + journal_size = -1; + run_result = e2fsck_run(ctx); e2fsck_clear_progbar(ctx); + + if (ctx->flags & E2F_FLAG_JOURNAL_INODE) { + if (fix_problem(ctx, PR_6_RECREATE_JOURNAL, &pctx)) { + if (journal_size < 1024) + journal_size = ext2fs_default_journal_size(fs->super->s_blocks_count); + if (journal_size < 0) { + fs->super->s_feature_compat &= + ~EXT3_FEATURE_COMPAT_HAS_JOURNAL; + com_err(ctx->program_name, 0, + _("Couldn't determine journal size")); + goto no_journal; + } + printf(_("Creating journal (%d blocks): "), + journal_size); + fflush(stdout); + retval = ext2fs_add_journal_inode(fs, + journal_size, 0); + if (retval) { + com_err("Error ", retval, + _("\n\twhile trying to create journal")); + goto no_journal; + } + printf(_(" Done.\n")); + printf(_("\n*** journal has been re-created - " + "filesystem is now ext3 again ***\n")); + } + } +no_journal: + if (run_result == E2F_FLAG_RESTART) { printf(_("Restarting e2fsck from the beginning...\n")); retval = e2fsck_reset_context(ctx); diff --git a/tests/f_badjourblks/expect.1 b/tests/f_badjourblks/expect.1 index 8684286e..5a0bfef5 100644 --- a/tests/f_badjourblks/expect.1 +++ b/tests/f_badjourblks/expect.1 @@ -19,7 +19,13 @@ Fix? yes Free blocks count wrong (7112, counted=8142). Fix? yes +Recreate journal to make the filesystem ext3 again? +Fix? yes + +Creating journal (1024 blocks): Done. + +*** journal has been re-created - filesystem is now ext3 again *** test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** -test_filesys: 11/256 files (0.0% non-contiguous), 50/8192 blocks +test_filesys: 11/256 files (0.0% non-contiguous), 1080/8192 blocks Exit status is 1 diff --git a/tests/f_badjourblks/expect.2 b/tests/f_badjourblks/expect.2 index 32ca9775..632dc71b 100644 --- a/tests/f_badjourblks/expect.2 +++ b/tests/f_badjourblks/expect.2 @@ -3,5 +3,5 @@ Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information -test_filesys: 11/256 files (0.0% non-contiguous), 50/8192 blocks +test_filesys: 11/256 files (0.0% non-contiguous), 1080/8192 blocks Exit status is 0 diff --git a/tests/f_miss_journal/expect.1 b/tests/f_miss_journal/expect.1 index 140cb518..cad69f63 100644 --- a/tests/f_miss_journal/expect.1 +++ b/tests/f_miss_journal/expect.1 @@ -17,7 +17,13 @@ Fix? yes Free blocks count wrong (968, counted=1998). Fix? yes +Recreate journal to make the filesystem ext3 again? +Fix? yes + +Creating journal (1024 blocks): Done. + +*** journal has been re-created - filesystem is now ext3 again *** test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** -test_filesys: 11/256 files (0.0% non-contiguous), 50/2048 blocks +test_filesys: 11/256 files (0.0% non-contiguous), 1080/2048 blocks Exit status is 1 diff --git a/tests/f_miss_journal/expect.2 b/tests/f_miss_journal/expect.2 index 834a1204..1e8c47f9 100644 --- a/tests/f_miss_journal/expect.2 +++ b/tests/f_miss_journal/expect.2 @@ -3,5 +3,5 @@ Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information -test_filesys: 11/256 files (0.0% non-contiguous), 50/2048 blocks +test_filesys: 11/256 files (0.0% non-contiguous), 1080/2048 blocks Exit status is 0