From: Ye Bin <yebin10@xxxxxxxxxx> Now, 'es->s_state' maybe covered by recover journal. And journal errno maybe not recorded in journal sb as IO error. ext4_update_super() only update error information when 'sbi->s_add_error_count' large than zero. Then 'EXT4_ERROR_FS' flag maybe lost. To solve above issue commit error information after recover journal. Signed-off-by: Ye Bin <yebin10@xxxxxxxxxx> --- fs/ext4/super.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index dc3907dff13a..b94754ba8556 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -5932,6 +5932,18 @@ static int ext4_load_journal(struct super_block *sb, goto err_out; } + if (unlikely(es->s_error_count && !jbd2_journal_errno(journal) && + !(le16_to_cpu(es->s_state) & EXT4_ERROR_FS))) { + EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; + es->s_state |= cpu_to_le16(EXT4_ERROR_FS); + err = ext4_commit_super(sb); + if (err) { + ext4_msg(sb, KERN_ERR, + "Failed to commit error information, please repair fs force!"); + goto err_out; + } + } + EXT4_SB(sb)->s_journal = journal; err = ext4_clear_journal_err(sb, es); if (err) { -- 2.31.1