]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.16.4/ext4-don-t-allow-r-w-mounts-if-metadata-blocks-overlap-the-superblock.patch
Fixes for 4.19
[thirdparty/kernel/stable-queue.git] / releases / 4.16.4 / ext4-don-t-allow-r-w-mounts-if-metadata-blocks-overlap-the-superblock.patch
CommitLineData
0f23eb5b
GKH
1From 18db4b4e6fc31eda838dd1c1296d67dbcb3dc957 Mon Sep 17 00:00:00 2001
2From: Theodore Ts'o <tytso@mit.edu>
3Date: Thu, 29 Mar 2018 22:10:35 -0400
4Subject: ext4: don't allow r/w mounts if metadata blocks overlap the superblock
5
6From: Theodore Ts'o <tytso@mit.edu>
7
8commit 18db4b4e6fc31eda838dd1c1296d67dbcb3dc957 upstream.
9
10If some metadata block, such as an allocation bitmap, overlaps the
11superblock, it's very likely that if the file system is mounted
12read/write, the results will not be pretty. So disallow r/w mounts
13for file systems corrupted in this particular way.
14
15Signed-off-by: Theodore Ts'o <tytso@mit.edu>
16Cc: stable@vger.kernel.org
17Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18
19---
20 fs/ext4/super.c | 6 ++++++
21 1 file changed, 6 insertions(+)
22
23--- a/fs/ext4/super.c
24+++ b/fs/ext4/super.c
25@@ -2333,6 +2333,8 @@ static int ext4_check_descriptors(struct
26 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
27 "Block bitmap for group %u overlaps "
28 "superblock", i);
29+ if (!sb_rdonly(sb))
30+ return 0;
31 }
32 if (block_bitmap < first_block || block_bitmap > last_block) {
33 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
34@@ -2345,6 +2347,8 @@ static int ext4_check_descriptors(struct
35 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
36 "Inode bitmap for group %u overlaps "
37 "superblock", i);
38+ if (!sb_rdonly(sb))
39+ return 0;
40 }
41 if (inode_bitmap < first_block || inode_bitmap > last_block) {
42 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
43@@ -2357,6 +2361,8 @@ static int ext4_check_descriptors(struct
44 ext4_msg(sb, KERN_ERR, "ext4_check_descriptors: "
45 "Inode table for group %u overlaps "
46 "superblock", i);
47+ if (!sb_rdonly(sb))
48+ return 0;
49 }
50 if (inode_table < first_block ||
51 inode_table + sbi->s_itb_per_group - 1 > last_block) {