Index: linux-2.6.18-128.1.6/fs/ext4/super.c =================================================================== --- linux-2.6.18-128.1.6.orig/fs/ext4/super.c +++ linux-2.6.18-128.1.6/fs/ext4/super.c @@ -47,6 +47,8 @@ #include "namei.h" #include "group.h" +static int force_over_8tb; + static int ext4_load_journal(struct super_block *, struct ext4_super_block *, unsigned long journal_devnum); static int ext4_create_journal(struct super_block *, struct ext4_super_block *, @@ -1227,6 +1229,7 @@ enum { Opt_grpquota, Opt_extents, Opt_noextents, Opt_i_version, Opt_mballoc, Opt_nomballoc, Opt_stripe, Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, Opt_bigendian_extents, + Opt_force_over_8tb, }; static match_table_t tokens = { @@ -1289,6 +1292,7 @@ static match_table_t tokens = { {Opt_stripe, "stripe=%u"}, {Opt_resize, "resize"}, {Opt_bigendian_extents, "bigendian_extents"}, + {Opt_force_over_8tb, "force_over_8tb"}, {Opt_err, NULL}, }; @@ -1690,6 +1694,9 @@ clear_qf_name: case Opt_bigendian_extents: bigendian_extents = 1; break; + case Opt_force_over_8tb: + force_over_8tb = 1; + break; default: printk(KERN_ERR "EXT4-fs: Unrecognized mount option \"%s\" " @@ -2534,6 +2541,17 @@ static int ext4_fill_super(struct super_ goto failed_mount; } + if (ext4_blocks_count(es) > + ((0x80000000000ULL >> sb->s_blocksize_bits) - 1)) { + if (force_over_8tb == 0) { + printk(KERN_ERR "EXT4-fs does not support filesystems " + "greater than 8TB and can cause data corruption." + "Use \"force_over_8tb\" mount option to override." + "\n"); + goto failed_mount; + } + } + if (EXT4_BLOCKS_PER_GROUP(sb) == 0) goto cantfind_ext4;