diff options
author | Ken Sumrall <ksumrall@android.com> | 2012-06-12 14:52:27 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-06-12 14:52:27 -0700 |
commit | 35db64508c8d95403a35dbbce52d3f6cd187626e (patch) | |
tree | 968288cf84a23ccd127224435961f31fb4d111f2 | |
parent | 7ebd23d5cacb949311fb6f741cb4f5c8063dd8cf (diff) | |
parent | 766baba9d08c13ec364f20ad70ca36303f186038 (diff) | |
download | android_external_e2fsprogs-35db64508c8d95403a35dbbce52d3f6cd187626e.tar.gz android_external_e2fsprogs-35db64508c8d95403a35dbbce52d3f6cd187626e.tar.bz2 android_external_e2fsprogs-35db64508c8d95403a35dbbce52d3f6cd187626e.zip |
am 766baba9: am a8948fce: Revert "Better fix for marking fs err in superblock if err set in journal superblock."
* commit '766baba9d08c13ec364f20ad70ca36303f186038':
Revert "Better fix for marking fs err in superblock if err set in journal superblock."
-rw-r--r-- | e2fsck/journal.c | 104 |
1 files changed, 55 insertions, 49 deletions
diff --git a/e2fsck/journal.c b/e2fsck/journal.c index dedca585..14556b96 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -803,13 +803,61 @@ no_has_journal: return retval; } -int e2fsck_run_ext3_journal(e2fsck_t ctx) +static errcode_t recover_ext3_journal(e2fsck_t ctx) { struct problem_context pctx; - journal_t *journal = 0; + journal_t *journal; + int retval; + + clear_problem_context(&pctx); + + journal_init_revoke_caches(); + retval = e2fsck_get_journal(ctx, &journal); + if (retval) + return retval; + + retval = e2fsck_journal_load(journal); + if (retval) + goto errout; + + retval = journal_init_revoke(journal, 1024); + if (retval) + goto errout; + + retval = -journal_recover(journal); + if (retval) + goto errout; + + if (journal->j_failed_commit) { + pctx.ino = journal->j_failed_commit; + fix_problem(ctx, PR_0_JNL_TXN_CORRUPT, &pctx); + ctx->fs->super->s_state |= EXT2_ERROR_FS; + ext2fs_mark_super_dirty(ctx->fs); + } + + + if (journal->j_superblock->s_errno) { + ctx->fs->super->s_state |= EXT2_ERROR_FS; + ext2fs_mark_super_dirty(ctx->fs); + journal->j_superblock->s_errno = 0; + mark_buffer_dirty(journal->j_sb_buffer); + } + + if (ctx->fs->flags & EXT2_FLAG_DIRTY) + ext2fs_flush(ctx->fs); /* Force out any modifications */ + +errout: + journal_destroy_revoke(journal); + journal_destroy_revoke_caches(); + e2fsck_journal_release(ctx, journal, 1, 0); + return retval; +} + +int e2fsck_run_ext3_journal(e2fsck_t ctx) +{ io_manager io_ptr = ctx->fs->io->manager; int blocksize = ctx->fs->blocksize; - errcode_t retval; + errcode_t retval, recover_retval; io_stats stats = 0; unsigned long long kbytes_written = 0; @@ -823,27 +871,7 @@ int e2fsck_run_ext3_journal(e2fsck_t ctx) if (ctx->fs->flags & EXT2_FLAG_DIRTY) ext2fs_flush(ctx->fs); /* Force out any modifications */ - clear_problem_context(&pctx); - - retval = journal_init_revoke_caches(); - if (retval) - return retval; - - retval = e2fsck_get_journal(ctx, &journal); - if (retval) - goto errout1; - - retval = e2fsck_journal_load(journal); - if (retval) - goto errout2; - - retval = journal_init_revoke(journal, 1024); - if (retval) - goto errout2; - - retval = -journal_recover(journal); - if (retval) - goto errout3; + recover_retval = recover_ext3_journal(ctx); /* * Reload the filesystem context to get up-to-date data from disk @@ -869,31 +897,9 @@ int e2fsck_run_ext3_journal(e2fsck_t ctx) ctx->fs->flags |= EXT2_FLAG_MASTER_SB_ONLY; ctx->fs->super->s_kbytes_written += kbytes_written; - if (journal->j_failed_commit) { - pctx.ino = journal->j_failed_commit; - fix_problem(ctx, PR_0_JNL_TXN_CORRUPT, &pctx); - ctx->fs->super->s_state |= EXT2_ERROR_FS; - ext2fs_mark_super_dirty(ctx->fs); - ext2fs_flush(ctx->fs); - } - - if (journal->j_superblock->s_errno) { - journal->j_superblock->s_errno = 0; - mark_buffer_dirty(journal->j_sb_buffer); - ctx->fs->super->s_state |= EXT2_ERROR_FS; - ext2fs_mark_super_dirty(ctx->fs); - ext2fs_flush(ctx->fs); - } - -errout3: - journal_destroy_revoke(journal); -errout2: - e2fsck_journal_release(ctx, journal, 1, 0); -errout1: - journal_destroy_revoke_caches(); - e2fsck_clear_recover(ctx, retval); - return retval; - + /* Set the superblock flags */ + e2fsck_clear_recover(ctx, recover_retval); + return recover_retval; } /* |