1dc728923Sopenharmony_ciFrom f923f6ddbd555801f1d6495904de4fefb363fa57 Mon Sep 17 00:00:00 2001
2dc728923Sopenharmony_ciFrom: liangyun2 <liangyun2@huawei.com>
3dc728923Sopenharmony_ciDate: Sat, 19 Dec 2020 12:05:37 +0800
4dc728923Sopenharmony_ciSubject: [PATCH] e2fsck: exit journal recovery when jounral superblock fails
5dc728923Sopenharmony_ci to update
6dc728923Sopenharmony_ci
7dc728923Sopenharmony_ciJounral superblock may be failed to update in e2fsck_journal_release.
8dc728923Sopenharmony_ciBut if needs_recovery flag is cleared, e2fsck_check_ext3_journal will be failed.
9dc728923Sopenharmony_ci
10dc728923Sopenharmony_ciTo fix this case, we use "fatal_error" when recover journal failed.
11dc728923Sopenharmony_ciSo we can reserve the recovery flag to recover the journal when try e2fsck again.
12dc728923Sopenharmony_ci
13dc728923Sopenharmony_ciFix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4S0SD?from=project-issue
14dc728923Sopenharmony_ci
15dc728923Sopenharmony_ciconflict: 	journal_destroy_revoke	        ->  jbd2_journal_destroy_revoke
16dc728923Sopenharmony_ci 		journal_destroy_revoke_caches   ->  jbd2_journal_destroy_revoke_record_cache
17dc728923Sopenharmony_ci						    jbd2_journal_destroy_revoke_table_cache
18dc728923Sopenharmony_ci		JFS_BARRIER -> JBD2_BARRIER
19dc728923Sopenharmony_ci		blkdev_issue_flush(kdev, a, b) -> blkdev_issue_flush(kdev)
20dc728923Sopenharmony_ci
21dc728923Sopenharmony_ciReported-by: Liangyun <liangyun2@huawei.com>
22dc728923Sopenharmony_ciSigned-off-by: Haotian Li <lihaotian9@huawei.com>
23dc728923Sopenharmony_ciSigned-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
24dc728923Sopenharmony_ci---
25dc728923Sopenharmony_ci e2fsck/journal.c | 26 ++++++++++++++++++++++++--
26dc728923Sopenharmony_ci 1 file changed, 24 insertions(+), 2 deletions(-)
27dc728923Sopenharmony_ci
28dc728923Sopenharmony_cidiff --git a/e2fsck/journal.c b/e2fsck/journal.c
29dc728923Sopenharmony_ciindex 7081b6e..f4253c0 100644
30dc728923Sopenharmony_ci--- a/e2fsck/journal.c
31dc728923Sopenharmony_ci+++ b/e2fsck/journal.c
32dc728923Sopenharmony_ci@@ -1444,10 +1444,12 @@ static errcode_t e2fsck_journal_fix_corrupt_super(e2fsck_t ctx,
33dc728923Sopenharmony_ci 	return 0;
34dc728923Sopenharmony_ci }
35dc728923Sopenharmony_ci 
36dc728923Sopenharmony_ci-static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal,
37dc728923Sopenharmony_ci+static errcode_t e2fsck_journal_release(e2fsck_t ctx, journal_t *journal,
38dc728923Sopenharmony_ci 				   int reset, int drop)
39dc728923Sopenharmony_ci {
40dc728923Sopenharmony_ci 	journal_superblock_t *jsb;
41dc728923Sopenharmony_ci+	errcode_t err = 0;
42dc728923Sopenharmony_ci+	errcode_t err2;
43dc728923Sopenharmony_ci 
44dc728923Sopenharmony_ci 	if (drop)
45dc728923Sopenharmony_ci 		mark_buffer_clean(journal->j_sb_buffer);
46dc728923Sopenharmony_ci@@ -1461,6 +1463,16 @@ static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal,
47dc728923Sopenharmony_ci 	}
48dc728923Sopenharmony_ci 	brelse(journal->j_sb_buffer);
49dc728923Sopenharmony_ci 
50dc728923Sopenharmony_ci+	if(reset == 1 && drop == 0) {
51dc728923Sopenharmony_ci+		err = sync_blockdev(journal->j_fs_dev);
52dc728923Sopenharmony_ci+		/* Make sure all replayed data is on permanent storage */
53dc728923Sopenharmony_ci+		if (journal->j_flags & JBD2_BARRIER) {
54dc728923Sopenharmony_ci+			err2 = blkdev_issue_flush(journal->j_fs_dev);
55dc728923Sopenharmony_ci+			if (!err)
56dc728923Sopenharmony_ci+				err = err2;
57dc728923Sopenharmony_ci+		}
58dc728923Sopenharmony_ci+	}
59dc728923Sopenharmony_ci+
60dc728923Sopenharmony_ci 	if (ctx->journal_io) {
61dc728923Sopenharmony_ci 		if (ctx->fs && ctx->fs->io != ctx->journal_io)
62dc728923Sopenharmony_ci 			io_channel_close(ctx->journal_io);
63dc728923Sopenharmony_ci@@ -1474,6 +1486,8 @@ static void e2fsck_journal_release(e2fsck_t ctx, journal_t *journal,
64dc728923Sopenharmony_ci 	if (journal->j_fs_dev)
65dc728923Sopenharmony_ci 		ext2fs_free_mem(&journal->j_fs_dev);
66dc728923Sopenharmony_ci 	ext2fs_free_mem(&journal);
67dc728923Sopenharmony_ci+
68dc728923Sopenharmony_ci+	return err;
69dc728923Sopenharmony_ci }
70dc728923Sopenharmony_ci 
71dc728923Sopenharmony_ci /*
72dc728923Sopenharmony_ci@@ -1612,6 +1626,7 @@ static errcode_t recover_ext3_journal(e2fsck_t ctx)
73dc728923Sopenharmony_ci 	struct problem_context	pctx;
74dc728923Sopenharmony_ci 	journal_t *journal;
75dc728923Sopenharmony_ci 	errcode_t retval;
76dc728923Sopenharmony_ci+	errcode_t recover_retval;
77dc728923Sopenharmony_ci 
78dc728923Sopenharmony_ci 	clear_problem_context(&pctx);
79dc728923Sopenharmony_ci 
80dc728923Sopenharmony_ci@@ -1659,7 +1674,14 @@ errout:
81dc728923Sopenharmony_ci 	jbd2_journal_destroy_revoke(journal);
82dc728923Sopenharmony_ci 	jbd2_journal_destroy_revoke_record_cache();
83dc728923Sopenharmony_ci 	jbd2_journal_destroy_revoke_table_cache();
84dc728923Sopenharmony_ci-	e2fsck_journal_release(ctx, journal, 1, 0);
85dc728923Sopenharmony_ci+	recover_retval = e2fsck_journal_release(ctx, journal, 1, 0);
86dc728923Sopenharmony_ci+	if(recover_retval == -EIO) {
87dc728923Sopenharmony_ci+		ctx->fs->flags &= ~EXT2_FLAG_VALID;
88dc728923Sopenharmony_ci+		com_err(ctx->program_name, 0,
89dc728923Sopenharmony_ci+			_("e2fsck journal release failed "
90dc728923Sopenharmony_ci+			"on %s, retval=%d \n"), ctx->device_name, recover_retval);
91dc728923Sopenharmony_ci+		fatal_error(ctx, 0);
92dc728923Sopenharmony_ci+	}
93dc728923Sopenharmony_ci 	return retval;
94dc728923Sopenharmony_ci }
95dc728923Sopenharmony_ci 
96dc728923Sopenharmony_ci-- 
97dc728923Sopenharmony_ci1.8.3.1
98dc728923Sopenharmony_ci
99