static errcode_t recover_ext3_journal(e2fsck_t ctx) { journal_t *journal; int retval; 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_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); } errout: journal_destroy_revoke(journal); journal_destroy_revoke_caches(); e2fsck_journal_release(ctx, journal, 1, 0); return retval; }
errcode_t ext2fs_open_journal(ext2_filsys fs, journal_t **j) { journal_t *journal; errcode_t retval; journal_init_revoke_caches(); retval = ext2fs_get_journal(fs, &journal); if (retval) return retval; retval = ext2fs_journal_load(journal); if (retval) goto errout; retval = journal_init_revoke(journal, 1024); if (retval) goto errout; if (journal->j_failed_commit) { journal->j_superblock->s_errno = -EINVAL; mark_buffer_dirty(journal->j_sb_buffer); } *j = journal; return 0; errout: journal_destroy_revoke(journal); journal_destroy_revoke_caches(); ext2fs_journal_release(fs, journal, 1, 0); return retval; }
static int __init journal_init_caches(void) { int ret; ret = journal_init_revoke_caches(); if (ret == 0) ret = journal_init_journal_head_cache(); if (ret == 0) ret = journal_init_handle_cache(); return ret; }
static errcode_t recover_ext3_journal(e2fsck_t ctx) { struct problem_context pctx; 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); journal->j_superblock->s_errno = -EINVAL; mark_buffer_dirty(journal->j_sb_buffer); } errout: journal_destroy_revoke(journal); journal_destroy_revoke_caches(); e2fsck_journal_release(ctx, journal, 1, 0); return retval; }