reject too-large filesystems on 32-bit kernels
PATCH 1/1 reject too-large filesystems on 32-bit kernels
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 (2^32 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.
---
fs/ext4/super.c +10 -3
@@ -2274,13 +2274,20 @@ static int ext4_fill_super(struct super_ goto failed_mount; } +/* +* 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 )) { + (sector_t)(~0ULL ) >> (sb->s_blocksize_bits -9 ) || +ext4_blocks_count (es) > + (pgoff_t)(~0ULL ) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits)) {printk (KERN_ERR "EXT4-fs: filesystem on %s:" -" too large to mount safely\n" , sb->s_id); +" too large to mount safely on this system\n" , sb->s_id);if (sizeof (sector_t) <8 ) -printk (KERN_WARNING "EXT4-fs: CONFIG_LBD not " +printk (KERN_WARNING "EXT4-fs: CONFIG_LBDAF not " "enabled\n" ); + ret =EFBIG ; goto failed_mount; }
PATCH v2 1/1 reject too-large filesystems on 32-bit kernels
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.
---
V2: Get error sign right, too much userspace today :)
fs/ext4/super.c +10 -3
@@ -2274,13 +2274,20 @@ static int ext4_fill_super(struct super_ goto failed_mount; } +/* +* 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 )) { + (sector_t)(~0ULL ) >> (sb->s_blocksize_bits -9 ) || +ext4_blocks_count (es) > + (pgoff_t)(~0ULL ) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits)) {printk (KERN_ERR "EXT4-fs: filesystem on %s:" -" too large to mount safely\n" , sb->s_id); +" too large to mount safely on this system\n" , sb->s_id);if (sizeof (sector_t) <8 ) -printk (KERN_WARNING "EXT4-fs: CONFIG_LBD not " +printk (KERN_WARNING "EXT4-fs: CONFIG_LBDAF not " "enabled\n" ); + ret = -EFBIG ; goto failed_mount; }
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 3 lines · Eric Sandeen
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).
Applied in the ext4 patch queue, with minor changes to take into account the use of ext4_msg().
- Ted