| From 18db4b4e6fc31eda838dd1c1296d67dbcb3dc957 Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Thu, 29 Mar 2018 22:10:35 -0400 |
| Subject: ext4: don't allow r/w mounts if metadata blocks overlap the superblock |
| |
| From: Theodore Ts'o <tytso@mit.edu> |
| |
| commit 18db4b4e6fc31eda838dd1c1296d67dbcb3dc957 upstream. |
| |
| If some metadata block, such as an allocation bitmap, overlaps the |
| superblock, it's very likely that if the file system is mounted |
| read/write, the results will not be pretty. So disallow r/w mounts |
| for file systems corrupted in this particular way. |
| |
| Backport notes: |
| 3.18.y is missing bc98a42c1f7d ("VFS: Convert sb->s_flags & MS_RDONLY to sb_rdonly(sb)") |
| and e462ec50cb5f ("VFS: Differentiate mount flags (MS_*) from internal superblock flags") |
| so we simply use the sb MS_RDONLY check from pre bc98a42c1f7d in place of the sb_rdonly |
| function used in the upstream variant of the patch. |
| |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Harsh Shandilya <harsh@prjkt.io> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/ext4/super.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -2093,6 +2093,8 @@ static int ext4_check_descriptors(struct |
| ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
| "Block bitmap for group %u overlaps " |
| "superblock", i); |
| + if (!(sb->s_flags & MS_RDONLY)) |
| + return 0; |
| } |
| if (block_bitmap < first_block || block_bitmap > last_block) { |
| ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
| @@ -2105,6 +2107,8 @@ static int ext4_check_descriptors(struct |
| ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
| "Inode bitmap for group %u overlaps " |
| "superblock", i); |
| + if (!(sb->s_flags & MS_RDONLY)) |
| + return 0; |
| } |
| if (inode_bitmap < first_block || inode_bitmap > last_block) { |
| ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
| @@ -2117,6 +2121,8 @@ static int ext4_check_descriptors(struct |
| ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: " |
| "Inode table for group %u overlaps " |
| "superblock", i); |
| + if (!(sb->s_flags & MS_RDONLY)) |
| + return 0; |
| } |
| if (inode_table < first_block || |
| inode_table + sbi->s_itb_per_group - 1 > last_block) { |