From: Theodore Ts'o Date: Wed, 23 May 2001 22:19:47 +0000 (+0000) Subject: ChangeLog, journal.c, problem.c, problem.h: X-Git-Tag: E2FSPROGS-1_20~12 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=c7f23364fd6d8d25d74e51ba5f342fc2230048d8;p=tools%2Fe2fsprogs.git ChangeLog, journal.c, problem.c, problem.h: journal.c (e2fsck_journal_reset_super): Fix bug; the reset journal wasn't getting written out to disk since the dirty bit wasn't being set on the buffer. (e2fsck_journal_load): Don't print an error message if the journal version number is wrong; just return a error code reflecting this fact. If the block type in the journal superblcok is obviously not a version number, report the journal is corrupted. (e2fsck_check_ext3_journal): On an unsupported journal version, prompt to abort by default, but then offer a chance to clear the journal as corrupt. problem.c, problem.h (PR_0_JOURNAL_UNSUPP_VERSION): Added new problem code. --- diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 12fc444..1db266c 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,3 +1,20 @@ +2001-05-23 Theodore Tso + + * journal.c (e2fsck_journal_reset_super): Fix bug; the reset + journal wasn't getting written out to disk since the dirty + bit wasn't being set on the buffer. + (e2fsck_journal_load): Don't print an error message if the + journal version number is wrong; just return a error code + reflecting this fact. If the block type in the journal + superblcok is obviously not a version number, report the + journal is corrupted. + (e2fsck_check_ext3_journal): On an unsupported journal + version, prompt to abort by default, but then offer a + chance to clear the journal as corrupt. + + * problem.c, problem.h (PR_0_JOURNAL_UNSUPP_VERSION): Added new + problem code. + 2001-05-14 Theodore Tso * pass1.c: Treat inodes with a low dtime (that were from a diff --git a/e2fsck/journal.c b/e2fsck/journal.c index f5366bb..7bd7862 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -333,15 +333,21 @@ static errcode_t e2fsck_journal_load(journal_t *journal) case JFS_SUPERBLOCK_V2: journal->j_format_version = 2; break; + + /* + * These should never appear in a journal super block, so if + * they do, the journal is badly corrupted. + */ + case JFS_DESCRIPTOR_BLOCK: + case JFS_COMMIT_BLOCK: + case JFS_REVOKE_BLOCK: + return EXT2_ET_CORRUPT_SUPERBLOCK; /* If we don't understand the superblock major type, but there * is a magic number, then it is likely to be a new format we * just don't understand, so leave it alone. */ default: - com_err(ctx->program_name, EXT2_ET_UNSUPP_FEATURE, - _("%s: journal has unrecognised format\n"), - ctx->device_name); - return EXT2_ET_UNSUPP_FEATURE; + return EXT2_ET_JOURNAL_UNSUPP_VERSION; } if (JFS_HAS_INCOMPAT_FEATURE(journal, ~JFS_KNOWN_INCOMPAT_FEATURES)) { @@ -427,6 +433,7 @@ static void e2fsck_journal_reset_super(e2fsck_t ctx, journal_superblock_t *jsb, new_seq ^= u.val[i]; jsb->s_sequence = htonl(new_seq); + mark_buffer_dirty(journal->j_sb_buffer, 1); ll_rw_block(WRITE, 1, &journal->j_sb_buffer); } @@ -508,7 +515,9 @@ int e2fsck_check_ext3_journal(e2fsck_t ctx) retval = e2fsck_journal_load(journal); if (retval) { - if (retval == EXT2_ET_CORRUPT_SUPERBLOCK) + if ((retval == EXT2_ET_CORRUPT_SUPERBLOCK) || + ((retval == EXT2_ET_JOURNAL_UNSUPP_VERSION) && + (!fix_problem(ctx, PR_0_JOURNAL_UNSUPP_VERSION, &pctx)))) retval = e2fsck_journal_fix_corrupt_super(ctx, journal, &pctx); e2fsck_journal_release(ctx, journal, 0, 1); diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 947c998..8c12360 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -276,6 +276,11 @@ static const struct e2fsck_problem problem_table[] = { { PR_0_JOURNAL_RESET_COMPAT, N_("Ext3 @j @S has bad feature flag(s) set.\n"), PROMPT_CLEAR, PR_PREEN_OK|PR_PREEN_NOMSG }, + + /* Journal has unsupported version number */ + { PR_0_JOURNAL_UNSUPP_VERSION, + N_("@j version not supported by this e2fsck.\n"), + PROMPT_ABORT, 0 }, /* Pass 1 errors */ diff --git a/e2fsck/problem.h b/e2fsck/problem.h index f92745d..1806314 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -155,6 +155,9 @@ struct problem_context { /* Journal has unsupported feature - reset */ #define PR_0_JOURNAL_RESET_COMPAT 0x000027 +/* Journal has unsupported version number */ +#define PR_0_JOURNAL_UNSUPP_VERSION 0x000028 + /* * Pass 1 errors */