| From a81c41ac6e920bdb87b51f20afde929cb08c00a1 Mon Sep 17 00:00:00 2001 |
| From: Eric Sandeen <sandeen@redhat.com> |
| Date: Mon, 17 Aug 2009 23:48:51 -0400 |
| Subject: [PATCH 10/85] ext4: reject too-large filesystems on 32-bit kernels |
| |
| (cherry picked from commit bf43d84b185e2ff54598f8c58a5a8e63148b6e90) |
| |
| ext4 will happily mount a > 16T filesystem on a 32-bit box, but |
| this is not safe; writes to the block device will wrap past 16T |
| and the page cache can't index past 16T (232 index * 4k pages). |
| |
| Adding another test to the existing "too many sectors" test |
| should do the trick. |
| |
| Add a comment, a relevant return value, and fix the reference |
| to the CONFIG_LBD(AF) option as well. |
| |
| Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/super.c | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -2550,12 +2550,19 @@ static int ext4_fill_super(struct super_ |
| goto failed_mount; |
| } |
| |
| - if (ext4_blocks_count(es) > |
| - (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { |
| + /* |
| + * Test whether we have more sectors than will fit in sector_t, |
| + * and whether the max offset is addressable by the page cache. |
| + */ |
| + if ((ext4_blocks_count(es) > |
| + (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) || |
| + (ext4_blocks_count(es) > |
| + (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits))) { |
| ext4_msg(sb, KERN_ERR, "filesystem" |
| - " too large to mount safely"); |
| + " too large to mount safely on this system"); |
| if (sizeof(sector_t) < 8) |
| ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled"); |
| + ret = -EFBIG; |
| goto failed_mount; |
| } |
| |