Projects
openEuler:24.03:SP1:Everything
e2fsprogs
_service:tar_scm:0003-e2fsck-exit-journal-recov...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0003-e2fsck-exit-journal-recovery-when-jounral-superblock.patch of Package e2fsprogs
From f923f6ddbd555801f1d6495904de4fefb363fa57 Mon Sep 17 00:00:00 2001 From: liangyun2 <liangyun2@huawei.com> Date: Sat, 19 Dec 2020 12:05:37 +0800 Subject: [PATCH] e2fsck: exit journal recovery when jounral superblock fails to update Jounral superblock may be failed to update in e2fsck_journal_release. But if needs_recovery flag is cleared, e2fsck_check_ext3_journal will be failed. To fix this case, we use "fatal_error" when recover journal failed. So we can reserve the recovery flag to recover the journal when try e2fsck again. Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4S0SD?from=project-issue conflict: journal_destroy_revoke -> jbd2_journal_destroy_revoke journal_destroy_revoke_caches -> jbd2_journal_destroy_revoke_record_cache jbd2_journal_destroy_revoke_table_cache JFS_BARRIER -> JBD2_BARRIER blkdev_issue_flush(kdev, a, b) -> blkdev_issue_flush(kdev) Reported-by: Liangyun <liangyun2@huawei.com> Signed-off-by: Haotian Li <lihaotian9@huawei.com> Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com> --- e2fsck/journal.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/e2fsck/journal.c b/e2fsck/journal.c index 7081b6e..f4253c0 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -1444,10 +1444,12 @@ static errcode_t e2fsck_journal_fix_corrupt_super(e2fsck_t ctx, return 0; } -static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal, +static errcode_t e2fsck_journal_release(e2fsck_t ctx, journal_t *journal, int reset, int drop) { journal_superblock_t *jsb; + errcode_t err = 0; + errcode_t err2; if (drop) mark_buffer_clean(journal->j_sb_buffer); @@ -1461,6 +1463,16 @@ static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal, } brelse(journal->j_sb_buffer); + if(reset == 1 && drop == 0) { + err = sync_blockdev(journal->j_fs_dev); + /* Make sure all replayed data is on permanent storage */ + if (journal->j_flags & JBD2_BARRIER) { + err2 = blkdev_issue_flush(journal->j_fs_dev); + if (!err) + err = err2; + } + } + if (ctx->journal_io) { if (ctx->fs && ctx->fs->io != ctx->journal_io) io_channel_close(ctx->journal_io); @@ -1474,6 +1486,8 @@ static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal, if (journal->j_fs_dev) ext2fs_free_mem(&journal->j_fs_dev); ext2fs_free_mem(&journal); + + return err; } /* @@ -1612,6 +1626,7 @@ static errcode_t recover_ext3_journal(e2fsck_t ctx) struct problem_context pctx; journal_t *journal; errcode_t retval; + errcode_t recover_retval; clear_problem_context(&pctx); @@ -1659,7 +1674,14 @@ errout: jbd2_journal_destroy_revoke(journal); jbd2_journal_destroy_revoke_record_cache(); jbd2_journal_destroy_revoke_table_cache(); - e2fsck_journal_release(ctx, journal, 1, 0); + recover_retval = e2fsck_journal_release(ctx, journal, 1, 0); + if(recover_retval == -EIO) { + ctx->fs->flags &= ~EXT2_FLAG_VALID; + com_err(ctx->program_name, 0, + _("e2fsck journal release failed " + "on %s, retval=%d \n"), ctx->device_name, recover_retval); + fatal_error(ctx, 0); + } return retval; } -- 1.8.3.1
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2