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.
This commit is contained in:
Theodore Ts'o 2001-05-23 22:19:47 +00:00
parent 4ed8ebe268
commit c7f23364fd
4 changed files with 39 additions and 5 deletions

View File

@ -1,3 +1,20 @@
2001-05-23 Theodore Tso <tytso@valinux.com>
* 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 <tytso@valinux.com> 2001-05-14 Theodore Tso <tytso@valinux.com>
* pass1.c: Treat inodes with a low dtime (that were from a * pass1.c: Treat inodes with a low dtime (that were from a

View File

@ -333,15 +333,21 @@ static errcode_t e2fsck_journal_load(journal_t *journal)
case JFS_SUPERBLOCK_V2: case JFS_SUPERBLOCK_V2:
journal->j_format_version = 2; journal->j_format_version = 2;
break; 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 /* 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 * is a magic number, then it is likely to be a new format we
* just don't understand, so leave it alone. */ * just don't understand, so leave it alone. */
default: default:
com_err(ctx->program_name, EXT2_ET_UNSUPP_FEATURE, return EXT2_ET_JOURNAL_UNSUPP_VERSION;
_("%s: journal has unrecognised format\n"),
ctx->device_name);
return EXT2_ET_UNSUPP_FEATURE;
} }
if (JFS_HAS_INCOMPAT_FEATURE(journal, ~JFS_KNOWN_INCOMPAT_FEATURES)) { 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]; new_seq ^= u.val[i];
jsb->s_sequence = htonl(new_seq); jsb->s_sequence = htonl(new_seq);
mark_buffer_dirty(journal->j_sb_buffer, 1);
ll_rw_block(WRITE, 1, &journal->j_sb_buffer); 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); retval = e2fsck_journal_load(journal);
if (retval) { 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, retval = e2fsck_journal_fix_corrupt_super(ctx, journal,
&pctx); &pctx);
e2fsck_journal_release(ctx, journal, 0, 1); e2fsck_journal_release(ctx, journal, 0, 1);

View File

@ -276,6 +276,11 @@ static const struct e2fsck_problem problem_table[] = {
{ PR_0_JOURNAL_RESET_COMPAT, { PR_0_JOURNAL_RESET_COMPAT,
N_("Ext3 @j @S has bad feature flag(s) set.\n"), N_("Ext3 @j @S has bad feature flag(s) set.\n"),
PROMPT_CLEAR, PR_PREEN_OK|PR_PREEN_NOMSG }, 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 */ /* Pass 1 errors */

View File

@ -155,6 +155,9 @@ struct problem_context {
/* Journal has unsupported feature - reset */ /* Journal has unsupported feature - reset */
#define PR_0_JOURNAL_RESET_COMPAT 0x000027 #define PR_0_JOURNAL_RESET_COMPAT 0x000027
/* Journal has unsupported version number */
#define PR_0_JOURNAL_UNSUPP_VERSION 0x000028
/* /*
* Pass 1 errors * Pass 1 errors
*/ */