1dc728923Sopenharmony_ciFrom dc4c71c6192f9709a2d833f9aa63d3463da6155a Mon Sep 17 00:00:00 2001 2dc728923Sopenharmony_ciFrom: lihaotian <lihaotian9@huawei.com> 3dc728923Sopenharmony_ciDate: Tue, 15 Dec 2020 11:46:07 +0000 4dc728923Sopenharmony_ciSubject: [PATCH] e2fsck: exit journal recovery when find EIO, ENOMEM 5dc728923Sopenharmony_ci errors 6dc728923Sopenharmony_ci 7dc728923Sopenharmony_cijbd2_journal_revocer() may fail when some error occers 8dc728923Sopenharmony_cisuch as ENOMEM. However, jsb->s_start is still cleared 9dc728923Sopenharmony_ciby func e2fsck_journal_release(). This may break 10dc728923Sopenharmony_ciconsistency between metadata and data in disk. Sometimes, 11dc728923Sopenharmony_cifailure in jbd2_journal_revocer() is temporary but retry 12dc728923Sopenharmony_cie2fsck will skip the journal recovery when the temporary 13dc728923Sopenharmony_ciproblem is fixed. 14dc728923Sopenharmony_ci 15dc728923Sopenharmony_ciTo fix this case, we use "fatal_error" instead "goto errout" 16dc728923Sopenharmony_ciwhen recover journal failed. If journal recovery fails, we 17dc728923Sopenharmony_ciwill send error message to user and reserve the recovery 18dc728923Sopenharmony_ciflags to recover the journal when try e2fsck again. 19dc728923Sopenharmony_ci 20dc728923Sopenharmony_ciFix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZUT?from=project-issue 21dc728923Sopenharmony_ci 22dc728923Sopenharmony_ciconflict: journal_recover -> jbd2_journal_recover 23dc728923Sopenharmony_ci 24dc728923Sopenharmony_ciReported-by: Liangyun <liangyun2@huawei.com> 25dc728923Sopenharmony_ciSigned-off-by: Haotian Li <lihaotian9@huawei.com> 26dc728923Sopenharmony_ciSigned-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com> 27dc728923Sopenharmony_ci--- 28dc728923Sopenharmony_ci e2fsck/journal.c | 7 +++++++ 29dc728923Sopenharmony_ci 1 file changed, 7 insertions(+) 30dc728923Sopenharmony_ci 31dc728923Sopenharmony_cidiff --git a/e2fsck/journal.c b/e2fsck/journal.c 32dc728923Sopenharmony_ciindex e83f3a9..a5f7088 100644 33dc728923Sopenharmony_ci--- a/e2fsck/journal.c 34dc728923Sopenharmony_ci+++ b/e2fsck/journal.c 35dc728923Sopenharmony_ci@@ -942,6 +942,13 @@ static errcode_t recover_ext3_journal(e2fsck_t ctx) 36dc728923Sopenharmony_ci goto errout; 37dc728923Sopenharmony_ci 38dc728923Sopenharmony_ci retval = -jbd2_journal_recover(journal); 39dc728923Sopenharmony_ci+ if (retval == EIO || retval == ENOMEM || retval == EXT2_ET_NO_MEMORY) { 40dc728923Sopenharmony_ci+ ctx->fs->flags &= ~EXT2_FLAG_VALID; 41dc728923Sopenharmony_ci+ com_err(ctx->program_name, 0, 42dc728923Sopenharmony_ci+ _("Journal recovery failed " 43dc728923Sopenharmony_ci+ "on %s, retval=%d \n"), ctx->device_name, retval); 44dc728923Sopenharmony_ci+ fatal_error(ctx, 0); 45dc728923Sopenharmony_ci+ } 46dc728923Sopenharmony_ci if (retval) 47dc728923Sopenharmony_ci goto errout; 48dc728923Sopenharmony_ci 49dc728923Sopenharmony_ci-- 50dc728923Sopenharmony_ci2.21.1 (Apple Git-122.3) 51dc728923Sopenharmony_ci 52