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 <liuzhiqiang26@huawei.com>
(cherry picked from commit ba27191637466aacf62ebfb2b8ce27f8fb7dc9b6)
This commit is contained in:
Zhiqiang Liu 2022-01-30 16:52:31 +08:00 committed by openeuler-sync-bot
parent 59dbdf86ff
commit 0a25aec2b6
4 changed files with 195 additions and 1 deletions

View File

@ -0,0 +1,49 @@
From dc4c71c6192f9709a2d833f9aa63d3463da6155a Mon Sep 17 00:00:00 2001
From: lihaotian <lihaotian9@huawei.com>
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 <liangyun2@huawei.com>
Signed-off-by: Haotian Li <lihaotian9@huawei.com>
Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
---
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)

View File

@ -0,0 +1,92 @@
From 941de25a0f5bbd0d3b4e98c0451bdd02f91dc7bc 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
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 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)

View File

@ -0,0 +1,41 @@
From 491c2dea43a9c9f33c5feb9ccd9b91d04a24b6f7 Mon Sep 17 00:00:00 2001
From: Haotian <lihaotian9@huawei.com>
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 <lihaotian9@huawei.com>
Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
---
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)

View File

@ -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 <liuzhiqiang26@huawei.com> - 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 <zhanchengbin1@huawei.com> - 1.45.6-7
- DESC: integrate community patches.