From cb081690eb5e66ce276da36fb7d5ae3dc0c53a42 Mon Sep 17 00:00:00 2001 From: zhanchengbin Date: Mon, 10 Jul 2023 16:51:23 +0800 Subject: [PATCH] e2fsprogs: avoid error information loss during journal replay Signed-off-by: zhanchengbin --- ..._ERROR_FS-flag-during-journal-replay.patch | 54 ++++++++++++++ ...debugfs-save-error-information-durin.patch | 74 +++++++++++++++++++ e2fsprogs.spec | 7 +- 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 0022-e2fsck-save-EXT2_ERROR_FS-flag-during-journal-replay.patch create mode 100644 0023-tune2fs-fuse2fs-debugfs-save-error-information-durin.patch diff --git a/0022-e2fsck-save-EXT2_ERROR_FS-flag-during-journal-replay.patch b/0022-e2fsck-save-EXT2_ERROR_FS-flag-during-journal-replay.patch new file mode 100644 index 0000000..99a2d46 --- /dev/null +++ b/0022-e2fsck-save-EXT2_ERROR_FS-flag-during-journal-replay.patch @@ -0,0 +1,54 @@ +From 4fc46b7930cddffd106dd6a3c8070ae2f9bf32a8 Mon Sep 17 00:00:00 2001 +From: Baokun Li +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 +Reviewed-by: Jan Kara +Reviewed-by: zhanchengbin +--- + 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 + diff --git a/0023-tune2fs-fuse2fs-debugfs-save-error-information-durin.patch b/0023-tune2fs-fuse2fs-debugfs-save-error-information-durin.patch new file mode 100644 index 0000000..a62a499 --- /dev/null +++ b/0023-tune2fs-fuse2fs-debugfs-save-error-information-durin.patch @@ -0,0 +1,74 @@ +From cc59b82532b7a47051b5c64d554bf9f978ad92d4 Mon Sep 17 00:00:00 2001 +From: Baokun Li +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 +Reviewed-by: Jan Kara +Reviewed-by: zhanchengbin +--- + 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 + diff --git a/e2fsprogs.spec b/e2fsprogs.spec index a17ddcf..5730cf2 100644 --- a/e2fsprogs.spec +++ b/e2fsprogs.spec @@ -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 - 1.46.5-6 +- e2fsprogs: avoid error information loss during journal replay + * Wed Jul 05 2023 Xinliang Liu - 1.46.5-5 - Fix rpmlint Provides/Obsoletes unversioned warnings to fix dnf update -- Gitee