!170 e2fsprogs: avoid error information loss during journal replay
From: @hifi521 Reviewed-by: @liuzhiqiang26 Signed-off-by: @liuzhiqiang26
This commit is contained in:
commit
ba257ae895
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user