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