55 lines
2.2 KiB
Diff
55 lines
2.2 KiB
Diff
|
|
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
|
||
|
|
|