From 9d824d3436c36e30544883b307a8e2781232daa9 Mon Sep 17 00:00:00 2001 From: Zhiqiang Liu Date: Sun, 30 Jan 2022 16:52:31 +0800 Subject: [PATCH] e2fsprogs: fix three issues to improve reliablity when exec fsck - e2fsck: exit journal recovery when find EIO, ENOMEM errors Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZUT?from=project-issue - e2fsck: exit journal recovery when jounral superblock fails to update Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4S0SD?from=project-issue - e2fsck: add env param E2FS_UNRELIABLE_IO to fix unreliable io case Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZVX?from=project-issue Signed-off-by: Zhiqiang Liu (cherry picked from commit ba27191637466aacf62ebfb2b8ce27f8fb7dc9b6) --- ...nal-recovery-when-find-EIO-ENOMEM-er.patch | 49 ++++++++++ ...nal-recovery-when-jounral-superblock.patch | 92 +++++++++++++++++++ ...d-env-param-E2FS_UNRELIABLE_IO-to-fi.patch | 41 +++++++++ e2fsprogs.spec | 14 ++- 4 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 0038-e2fsck-exit-journal-recovery-when-find-EIO-ENOMEM-er.patch create mode 100644 0039-e2fsck-exit-journal-recovery-when-jounral-superblock.patch create mode 100644 0040-e2fsck-add-env-param-E2FS_UNRELIABLE_IO-to-fi.patch diff --git a/0038-e2fsck-exit-journal-recovery-when-find-EIO-ENOMEM-er.patch b/0038-e2fsck-exit-journal-recovery-when-find-EIO-ENOMEM-er.patch new file mode 100644 index 0000000..26331e0 --- /dev/null +++ b/0038-e2fsck-exit-journal-recovery-when-find-EIO-ENOMEM-er.patch @@ -0,0 +1,49 @@ +From dc4c71c6192f9709a2d833f9aa63d3463da6155a Mon Sep 17 00:00:00 2001 +From: lihaotian +Date: Tue, 15 Dec 2020 11:46:07 +0000 +Subject: [PATCH] e2fsck: exit journal recovery when find EIO, ENOMEM + errors + +jbd2_journal_revocer() may fail when some error occers +such as ENOMEM. However, jsb->s_start is still cleared +by func e2fsck_journal_release(). This may break +consistency between metadata and data in disk. Sometimes, +failure in jbd2_journal_revocer() is temporary but retry +e2fsck will skip the journal recovery when the temporary +problem is fixed. + +To fix this case, we use "fatal_error" instead "goto errout" +when recover journal failed. If journal recovery fails, we +will send error message to user and reserve the recovery +flags to recover the journal when try e2fsck again. + +Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZUT?from=project-issue + +Reported-by: Liangyun +Signed-off-by: Haotian Li +Signed-off-by: Zhiqiang Liu +--- + e2fsck/journal.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/e2fsck/journal.c b/e2fsck/journal.c +index e83f3a9..a5f7088 100644 +--- a/e2fsck/journal.c ++++ b/e2fsck/journal.c +@@ -942,6 +942,13 @@ static errcode_t recover_ext3_journal(e2fsck_t ctx) + goto errout; + + retval = -journal_recover(journal); ++ if (retval == EIO || retval == ENOMEM || retval == EXT2_ET_NO_MEMORY) { ++ ctx->fs->flags &= ~EXT2_FLAG_VALID; ++ com_err(ctx->program_name, 0, ++ _("Journal recovery failed " ++ "on %s, retval=%d \n"), ctx->device_name, retval); ++ fatal_error(ctx, 0); ++ } + if (retval) + goto errout; + +-- +2.21.1 (Apple Git-122.3) + diff --git a/0039-e2fsck-exit-journal-recovery-when-jounral-superblock.patch b/0039-e2fsck-exit-journal-recovery-when-jounral-superblock.patch new file mode 100644 index 0000000..2441e4f --- /dev/null +++ b/0039-e2fsck-exit-journal-recovery-when-jounral-superblock.patch @@ -0,0 +1,92 @@ +From 941de25a0f5bbd0d3b4e98c0451bdd02f91dc7bc Mon Sep 17 00:00:00 2001 +From: liangyun2 +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 + +Reported-by: Liangyun +Signed-off-by: Haotian Li +Signed-off-by: Zhiqiang Liu +--- + e2fsck/journal.c | 26 ++++++++++++++++++++++++-- + 1 file changed, 24 insertions(+), 2 deletions(-) + +diff --git a/e2fsck/journal.c b/e2fsck/journal.c +index a5f7088..b3f1bb0 100644 +--- a/e2fsck/journal.c ++++ b/e2fsck/journal.c +@@ -757,10 +757,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); +@@ -774,6 +776,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 & JFS_BARRIER) { ++ err2 = blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL); ++ if (!err) ++ err = err2; ++ } ++ } ++ + if (ctx->journal_io) { + if (ctx->fs && ctx->fs->io != ctx->journal_io) + io_channel_close(ctx->journal_io); +@@ -787,6 +799,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; + } + + /* +@@ -925,6 +939,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); + +@@ -964,7 +979,14 @@ static errcode_t recover_ext3_journal(e2fsck_t ctx) + errout: + journal_destroy_revoke(journal); + journal_destroy_revoke_caches(); +- 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; + } + +-- +2.21.1 (Apple Git-122.3) + diff --git a/0040-e2fsck-add-env-param-E2FS_UNRELIABLE_IO-to-fi.patch b/0040-e2fsck-add-env-param-E2FS_UNRELIABLE_IO-to-fi.patch new file mode 100644 index 0000000..e64c7fb --- /dev/null +++ b/0040-e2fsck-add-env-param-E2FS_UNRELIABLE_IO-to-fi.patch @@ -0,0 +1,41 @@ +From 491c2dea43a9c9f33c5feb9ccd9b91d04a24b6f7 Mon Sep 17 00:00:00 2001 +From: Haotian +Date: Wed, 17 Mar 2021 17:34:14 +0800 +Subject: [PATCH] e2fsck: add env param E2FS_UNRELIABLE_IO to fix + unreliable io case + +Func write_primary_superblock() has two way to wirte disk. One is 1k block, +the other is byte by byte as default. On unreliable IO case such as flaky +network, the byte-by-byte method may lost some data of ext4-superblock. +Then, the superblock may lose consistency and the sb checksum error will +occur. + +We provide the env param E2FS_UNRELIABLE_IO for users to choose if it's +necessary to take 1k block way on writing disk. + +Fix issue:https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZVX?from=project-issue + +Signed-off-by: Haotian Li +Signed-off-by: Zhiqiang Liu +--- + lib/ext2fs/closefs.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c +index 1d4d5b7..1893fb6 100644 +--- a/lib/ext2fs/closefs.c ++++ b/lib/ext2fs/closefs.c +@@ -195,8 +195,9 @@ static errcode_t write_primary_superblock(ext2_filsys fs, + __u16 *old_super, *new_super; + int check_idx, write_idx, size; + errcode_t retval; ++ int is_unreliable_io = getenv("E2FS_UNRELIABLE_IO") ? 1 : 0; + +- if (!fs->io->manager->write_byte || !fs->orig_super) { ++ if (!fs->io->manager->write_byte || !fs->orig_super || is_unreliable_io) { + fallback: + io_channel_set_blksize(fs->io, SUPERBLOCK_OFFSET); + retval = io_channel_write_blk64(fs->io, 1, -SUPERBLOCK_SIZE, +-- +2.21.1 (Apple Git-122.3) + diff --git a/e2fsprogs.spec b/e2fsprogs.spec index ead09f6..19ba213 100644 --- a/e2fsprogs.spec +++ b/e2fsprogs.spec @@ -1,6 +1,6 @@ Name: e2fsprogs Version: 1.45.6 -Release: 7 +Release: 8 Summary: Second extended file system management tools License: GPLv2 and LGPLv2 and GPLv2+ URL: http://e2fsprogs.sourceforge.net/ @@ -44,6 +44,9 @@ Patch34: 0034-ss_create_invocation-fix-potential-unititalized-refe.patch Patch35: 0035-libext2fs-fix-unexpected-NULL-variable.patch Patch36: 0036-libsupport-fix-potental-NULL-pointer-dereferences-in.patch Patch37: 0037-libext2fs-fix-coverity-nits-in-tdb.c.patch +Patch38: 0038-e2fsck-exit-journal-recovery-when-find-EIO-ENOMEM-er.patch +Patch39: 0039-e2fsck-exit-journal-recovery-when-jounral-superblock.patch +Patch40: 0040-e2fsck-add-env-param-E2FS_UNRELIABLE_IO-to-fi.patch BuildRequires: gcc pkgconfig texinfo BuildRequires: fuse-devel libblkid-devel libuuid-devel @@ -165,6 +168,15 @@ exit 0 %{_mandir}/man8/* %changelog +* Sun Jan 30 2021 Zhiqiang Liu - 1.45.6-8 +- DESC: fix three issues: + - e2fsck: exit journal recovery when find EIO, ENOMEM errors + Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZUT?from=project-issue + - e2fsck: exit journal recovery when jounral superblock fails to update + Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4S0SD?from=project-issue + - e2fsck: add env param E2FS_UNRELIABLE_IO to fix unreliable io case + Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4RZVX?from=project-issue + * Mon Nov 15 2021 zhanchengbin - 1.45.6-7 - DESC: integrate community patches. -- Gitee