!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
|
Name: e2fsprogs
|
||||||
Version: 1.46.5
|
Version: 1.46.5
|
||||||
Release: 5
|
Release: 6
|
||||||
Summary: Second extended file system management tools
|
Summary: Second extended file system management tools
|
||||||
License: GPLv2+ and LGPLv2 and MIT
|
License: GPLv2+ and LGPLv2 and MIT
|
||||||
URL: http://e2fsprogs.sourceforge.net/
|
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
|
Patch19: 0019-debugfs-fix-repeated-output-problem-with-logdump-O-n.patch
|
||||||
Patch20: 0020-tune2fs-check-return-value-of-ext2fs_mmp_update2-in-.patch
|
Patch20: 0020-tune2fs-check-return-value-of-ext2fs_mmp_update2-in-.patch
|
||||||
Patch21: 0021-mmp-fix-wrong-comparison-in-ext2fs_mmp_stop.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
|
BuildRequires: gcc pkgconfig texinfo
|
||||||
@ -169,6 +171,9 @@ exit 0
|
|||||||
%{_mandir}/man8/*
|
%{_mandir}/man8/*
|
||||||
|
|
||||||
%changelog
|
%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
|
* Wed Jul 05 2023 Xinliang Liu <xinliang.liu@linaro.org> - 1.46.5-5
|
||||||
- Fix rpmlint Provides/Obsoletes unversioned warnings to fix dnf update
|
- Fix rpmlint Provides/Obsoletes unversioned warnings to fix dnf update
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user