diff mbox series

[v3] ext4: Fix bdev write error check failed when mount fs with ro

Message ID 20200928020556.710971-1-zhangxiaoxu5@huawei.com
State Awaiting Upstream
Headers show
Series [v3] ext4: Fix bdev write error check failed when mount fs with ro | expand

Commit Message

zhangxiaoxu (A) Sept. 28, 2020, 2:05 a.m. UTC
Consider a situation when a filesystem was uncleanly shutdown and the
orphan list is not empty and a read-only mount is attempted. The orphan
list cleanup during mount will fail with:

ext4_check_bdev_write_error:193: comm mount: Error while async write back metadata

This happens because sbi->s_bdev_wb_err is not initialized when mounting
the filesystem in read only mode and so ext4_check_bdev_write_error()
falsely triggers.

Initialize sbi->s_bdev_wb_err unconditionally to avoid this problem.

Fixes: bc71726c7257 ("ext4: abort the filesystem if failed to async write metadata buffer")
Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
---
 fs/ext4/super.c | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

Comments

Theodore Ts'o Oct. 3, 2020, 5:09 a.m. UTC | #1
On Sun, Sep 27, 2020 at 10:05:56PM -0400, Zhang Xiaoxu wrote:
> Consider a situation when a filesystem was uncleanly shutdown and the
> orphan list is not empty and a read-only mount is attempted. The orphan
> list cleanup during mount will fail with:
> 
> ext4_check_bdev_write_error:193: comm mount: Error while async write back metadata
> 
> This happens because sbi->s_bdev_wb_err is not initialized when mounting
> the filesystem in read only mode and so ext4_check_bdev_write_error()
> falsely triggers.
> 
> Initialize sbi->s_bdev_wb_err unconditionally to avoid this problem.
> 
> Fixes: bc71726c7257 ("ext4: abort the filesystem if failed to async write metadata buffer")
> Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
> Reviewed-by: Jan Kara <jack@suse.cz>

Applied, thanks.

				- Ted
diff mbox series

Patch

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index ea425b49b345..0303e6e17190 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4814,9 +4814,8 @@  static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 	 * used to detect the metadata async write error.
 	 */
 	spin_lock_init(&sbi->s_bdev_wb_lock);
-	if (!sb_rdonly(sb))
-		errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
-					 &sbi->s_bdev_wb_err);
+	errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
+				 &sbi->s_bdev_wb_err);
 	sb->s_bdev->bd_super = sb;
 	EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
 	ext4_orphan_cleanup(sb, es);
@@ -5707,14 +5706,6 @@  static int ext4_remount(struct super_block *sb, int *flags, char *data)
 				goto restore_opts;
 			}
 
-			/*
-			 * Update the original bdev mapping's wb_err value
-			 * which could be used to detect the metadata async
-			 * write error.
-			 */
-			errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
-						 &sbi->s_bdev_wb_err);
-
 			/*
 			 * Mounting a RDONLY partition read-write, so reread
 			 * and store the current valid flag.  (It may have