aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@us.ibm.com>2010-11-19 09:56:44 -0500
committerTheodore Ts'o <tytso@mit.edu>2010-11-19 09:56:44 -0500
commit5a9ae68a349aa076bc8557ee2fcf865574459282 (patch)
tree484c26f74f13a0c5962ac634c90462d98dea8e1a
parent0587aa3d11f9769a301b21bff2c3ed8365606b8d (diff)
downloadmrst-s0i3-test-5a9ae68a349aa076bc8557ee2fcf865574459282.tar.gz
mrst-s0i3-test-5a9ae68a349aa076bc8557ee2fcf865574459282.tar.xz
mrst-s0i3-test-5a9ae68a349aa076bc8557ee2fcf865574459282.zip
ext4: ext4_fill_super shouldn't return 0 on corruption
At the start of ext4_fill_super, ret is set to -EINVAL, and any failure path out of that function returns ret. However, the generic_check_addressable clause sets ret = 0 (if it passes), which means that a subsequent failure (e.g. a group checksum error) returns 0 even though the mount should fail. This causes vfs_kern_mount in turn to think that the mount succeeded, leading to an oops. A simple fix is to avoid using ret for the generic_check_addressable check, which was last changed in commit 30ca22c70e3ef0a96ff84de69cd7e8561b416cb2. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r--fs/ext4/super.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index ef09d1443d1..14ada8c50c4 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3265,13 +3265,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
* Test whether we have more sectors than will fit in sector_t,
* and whether the max offset is addressable by the page cache.
*/
- ret = generic_check_addressable(sb->s_blocksize_bits,
+ err = generic_check_addressable(sb->s_blocksize_bits,
ext4_blocks_count(es));
- if (ret) {
+ if (err) {
ext4_msg(sb, KERN_ERR, "filesystem"
" too large to mount safely on this system");
if (sizeof(sector_t) < 8)
ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled");
+ ret = err;
goto failed_mount;
}