]>
Commit | Line | Data |
---|---|---|
0f23eb5b GKH |
1 | From 18db4b4e6fc31eda838dd1c1296d67dbcb3dc957 Mon Sep 17 00:00:00 2001 |
2 | From: Theodore Ts'o <tytso@mit.edu> | |
3 | Date: Thu, 29 Mar 2018 22:10:35 -0400 | |
4 | Subject: ext4: don't allow r/w mounts if metadata blocks overlap the superblock | |
5 | ||
6 | From: Theodore Ts'o <tytso@mit.edu> | |
7 | ||
8 | commit 18db4b4e6fc31eda838dd1c1296d67dbcb3dc957 upstream. | |
9 | ||
10 | If some metadata block, such as an allocation bitmap, overlaps the | |
11 | superblock, it's very likely that if the file system is mounted | |
12 | read/write, the results will not be pretty. So disallow r/w mounts | |
13 | for file systems corrupted in this particular way. | |
14 | ||
15 | Signed-off-by: Theodore Ts'o <tytso@mit.edu> | |
16 | Cc: stable@vger.kernel.org | |
17 | Signed-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) { |