| From 484b3437754c7dd7c99946e80c95c3459df79cf2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 18 Mar 2020 14:19:38 -0500 |
| Subject: ext4: do not commit super on read-only bdev |
| |
| From: Eric Sandeen <sandeen@redhat.com> |
| |
| [ Upstream commit c96e2b8564adfb8ac14469ebc51ddc1bfecb3ae2 ] |
| |
| Under some circumstances we may encounter a filesystem error on a |
| read-only block device, and if we try to save the error info to the |
| superblock and commit it, we'll wind up with a noisy error and |
| backtrace, i.e.: |
| |
| [ 3337.146838] EXT4-fs error (device pmem1p2): ext4_get_journal_inode:4634: comm mount: inode #0: comm mount: iget: illegal inode # |
| ------------[ cut here ]------------ |
| generic_make_request: Trying to write to read-only block-device pmem1p2 (partno 2) |
| WARNING: CPU: 107 PID: 115347 at block/blk-core.c:788 generic_make_request_checks+0x6b4/0x7d0 |
| ... |
| |
| To avoid this, commit the error info in the superblock only if the |
| block device is writable. |
| |
| Reported-by: Ritesh Harjani <riteshh@linux.ibm.com> |
| Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
| Reviewed-by: Andreas Dilger <adilger@dilger.ca> |
| Link: https://lore.kernel.org/r/4b6e774d-cc00-3469-7abb-108eb151071a@sandeen.net |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/ext4/super.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
| index 98e27432c8592..0ced133a36ec5 100644 |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -369,7 +369,8 @@ static void save_error_info(struct super_block *sb, const char *func, |
| unsigned int line) |
| { |
| __save_error_info(sb, func, line); |
| - ext4_commit_super(sb, 1); |
| + if (!bdev_read_only(sb->s_bdev)) |
| + ext4_commit_super(sb, 1); |
| } |
| |
| /* |
| -- |
| 2.20.1 |
| |