Index: linux-2.6.18-164.6.1/fs/ext4/super.c =================================================================== --- linux-2.6.18-164.6.1.orig/fs/ext4/super.c +++ linux-2.6.18-164.6.1/fs/ext4/super.c @@ -51,6 +51,8 @@ struct proc_dir_entry *ext4_proc_root; +static int force_over_16tb; + static int ext4_load_journal(struct super_block *, struct ext4_super_block *, unsigned long journal_devnum); static int ext4_commit_super(struct super_block *sb, @@ -1343,6 +1345,7 @@ enum { Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_inode_readahead_blks, Opt_journal_ioprio, Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, Opt_bigendian_extents, + Opt_force_over_16tb, }; static match_table_t tokens = { @@ -1410,6 +1413,7 @@ static match_table_t tokens = { {Opt_auto_da_alloc, "auto_da_alloc"}, {Opt_noauto_da_alloc, "noauto_da_alloc"}, {Opt_bigendian_extents, "bigendian_extents"}, + {Opt_force_over_16tb, "force_over_16tb"}, {Opt_err, NULL}, }; @@ -1837,6 +1841,9 @@ set_qf_format: break; case Opt_mballoc: break; + case Opt_force_over_16tb: + force_over_16tb = 1; + break; default: printk(KERN_ERR "EXT4-fs: Unrecognized mount option \"%s\" " @@ -2692,6 +2699,16 @@ static int ext4_fill_super(struct super_ goto failed_mount; } + if (ext4_blocks_count(es) >= (1ULL << 32)) { + if (force_over_16tb == 0) { + printk(KERN_ERR "EXT4-fs does not support filesystems " + "greater than 16TB and can cause data corruption." + "Use \"force_over_16tb\" mount option to override." + "\n"); + goto failed_mount; + } + } + if (EXT4_BLOCKS_PER_GROUP(sb) == 0) goto cantfind_ext4;