ext4: check block device size on mount
authorFrom: Thiemo Nagel <thiemo.nagel@ph.tum.de>
Tue, 7 Apr 2009 18:07:47 +0000 (14:07 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 7 Apr 2009 18:07:47 +0000 (14:07 -0400)
Signed-off-by: Thiemo Nagel <thiemo.nagel@ph.tum.de>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/super.c

index 9987bba99db3cc62c2faa887b95783676f83b480..2958f4e6f222a8956f595145b1fe31e16e4eec9d 100644 (file)
@@ -2508,6 +2508,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
        if (EXT4_BLOCKS_PER_GROUP(sb) == 0)
                goto cantfind_ext4;
 
+       /* check blocks count against device size */
+       blocks_count = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
+       if (blocks_count && ext4_blocks_count(es) > blocks_count) {
+               printk(KERN_WARNING "EXT4-fs: bad geometry: block count %llu "
+                      "exceeds size of device (%llu blocks)\n",
+                      ext4_blocks_count(es), blocks_count);
+               goto failed_mount;
+       }
+
         /*
          * It makes no sense for the first data block to be beyond the end
          * of the filesystem.