!170 e2fsprogs: avoid error information loss during journal replay

From: @hifi521 
Reviewed-by: @liuzhiqiang26 
Signed-off-by: @liuzhiqiang26
This commit is contained in:
openeuler-ci-bot 2023-07-13 02:22:45 +00:00 committed by Gitee
commit ba257ae895
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 134 additions and 1 deletions

View File

@ -0,0 +1,54 @@
From 4fc46b7930cddffd106dd6a3c8070ae2f9bf32a8 Mon Sep 17 00:00:00 2001
From: Baokun Li <libaokun1@huawei.com>
Date: Fri, 17 Feb 2023 18:09:21 +0800
Subject: [PATCH 1/2] e2fsck: save EXT2_ERROR_FS flag during journal replay
When repairing a file system with s_errno missing from the journal
superblock but the file system superblock contains the ERROR_FS flag,
the ERROR_FS flag on the file system image is overwritten after the
journal replay, followed by a reload of the file system data from disk
and the ERROR_FS flag in memory is overwritten. Also s_errno is not set
and the ERROR_FS flag is not reset. Therefore, when checked later, no
forced check is performed, which makes it possible to have some errors
hidden in the disk image, which may make it read-only when using the
file system. So we save the ERROR_FS flag to the superblock after the
journal replay, instead of just relying on the jsb->s_errno to do this.
Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: zhanchengbin <zhanchengbin1@huawei.com>
---
e2fsck/journal.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/e2fsck/journal.c b/e2fsck/journal.c
index 2e86723..3142a13 100644
--- a/e2fsck/journal.c
+++ b/e2fsck/journal.c
@@ -1666,6 +1666,7 @@ errcode_t e2fsck_run_ext3_journal(e2fsck_t ctx)
errcode_t retval, recover_retval;
io_stats stats = 0;
unsigned long long kbytes_written = 0;
+ __u16 s_error_state;
printf(_("%s: recovering journal\n"), ctx->device_name);
if (ctx->options & E2F_OPT_READONLY) {
@@ -1688,6 +1689,7 @@ errcode_t e2fsck_run_ext3_journal(e2fsck_t ctx)
ctx->fs->io->manager->get_stats(ctx->fs->io, &stats);
if (stats && stats->bytes_written)
kbytes_written = stats->bytes_written >> 10;
+ s_error_state = ctx->fs->super->s_state & EXT2_ERROR_FS;
ext2fs_mmp_stop(ctx->fs);
ext2fs_free(ctx->fs);
@@ -1704,6 +1706,7 @@ errcode_t e2fsck_run_ext3_journal(e2fsck_t ctx)
ctx->fs->now = ctx->now;
ctx->fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
ctx->fs->super->s_kbytes_written += kbytes_written;
+ ctx->fs->super->s_state |= s_error_state;
/* Set the superblock flags */
e2fsck_clear_recover(ctx, recover_retval != 0);
--
2.41.0

View File

@ -0,0 +1,74 @@
From cc59b82532b7a47051b5c64d554bf9f978ad92d4 Mon Sep 17 00:00:00 2001
From: Baokun Li <libaokun1@huawei.com>
Date: Fri, 17 Feb 2023 18:09:22 +0800
Subject: [PATCH 2/2] tune2fs/fuse2fs/debugfs: save error information during
journal replay
Saving error information during journal replay, as in the kernel,
prevents information loss from making problems difficult to locate.
We save these error information until someone uses e2fsck to check
for and fix possible errors.
Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: zhanchengbin <zhanchengbin1@huawei.com>
---
debugfs/journal.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/debugfs/journal.c b/debugfs/journal.c
index 095fff0..a3128b7 100644
--- a/debugfs/journal.c
+++ b/debugfs/journal.c
@@ -787,6 +787,8 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp)
char *fsname;
int fsflags;
int fsblocksize;
+ char *save;
+ __u16 s_error_state;
if (!(fs->flags & EXT2_FLAG_RW))
return EXT2_ET_FILE_RO;
@@ -806,6 +808,12 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp)
if (stats && stats->bytes_written)
kbytes_written = stats->bytes_written >> 10;
+ save = malloc(EXT4_S_ERR_LEN);
+ if (save)
+ memcpy(save, ((char *) fs->super) + EXT4_S_ERR_START,
+ EXT4_S_ERR_LEN);
+ s_error_state = fs->super->s_state & EXT2_ERROR_FS;
+
ext2fs_mmp_stop(fs);
fsname = fs->device_name;
fs->device_name = NULL;
@@ -816,11 +824,15 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp)
retval = ext2fs_open(fsname, fsflags, 0, fsblocksize, io_ptr, fsp);
ext2fs_free_mem(&fsname);
if (retval)
- return retval;
+ goto outfree;
fs = *fsp;
fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
fs->super->s_kbytes_written += kbytes_written;
+ fs->super->s_state |= s_error_state;
+ if (save)
+ memcpy(((char *) fs->super) + EXT4_S_ERR_START, save,
+ EXT4_S_ERR_LEN);
/* Set the superblock flags */
ext2fs_clear_recover(fs, recover_retval != 0);
@@ -830,6 +842,9 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp)
* the EXT2_ERROR_FS flag in the fs superblock if needed.
*/
retval = ext2fs_check_ext3_journal(fs);
+
+outfree:
+ free(save);
return retval ? retval : recover_retval;
}
--
2.41.0

View File

@ -1,6 +1,6 @@
Name: e2fsprogs
Version: 1.46.5
Release: 5
Release: 6
Summary: Second extended file system management tools
License: GPLv2+ and LGPLv2 and MIT
URL: http://e2fsprogs.sourceforge.net/
@ -28,6 +28,8 @@ Patch18: 0018-misc-fsck.c-Processes-may-kill-other-processes.patch
Patch19: 0019-debugfs-fix-repeated-output-problem-with-logdump-O-n.patch
Patch20: 0020-tune2fs-check-return-value-of-ext2fs_mmp_update2-in-.patch
Patch21: 0021-mmp-fix-wrong-comparison-in-ext2fs_mmp_stop.patch
Patch22: 0022-e2fsck-save-EXT2_ERROR_FS-flag-during-journal-replay.patch
Patch23: 0023-tune2fs-fuse2fs-debugfs-save-error-information-durin.patch
BuildRequires: gcc pkgconfig texinfo
@ -169,6 +171,9 @@ exit 0
%{_mandir}/man8/*
%changelog
* Tue Jul 11 2023 zhanchengbin <zhanchengbin1@huawei.com> - 1.46.5-6
- e2fsprogs: avoid error information loss during journal replay
* Wed Jul 05 2023 Xinliang Liu <xinliang.liu@linaro.org> - 1.46.5-5
- Fix rpmlint Provides/Obsoletes unversioned warnings to fix dnf update