|
@@ -3910,6 +3910,25 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,
|
|
|
ret = -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Obvious sys_chunk_array corruptions, it must hold at least one key
|
|
|
+ * and one chunk
|
|
|
+ */
|
|
|
+ if (btrfs_super_sys_array_size(sb) > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) {
|
|
|
+ printk(KERN_ERR "BTRFS: system chunk array too big %u > %u\n",
|
|
|
+ btrfs_super_sys_array_size(sb),
|
|
|
+ BTRFS_SYSTEM_CHUNK_ARRAY_SIZE);
|
|
|
+ ret = -EINVAL;
|
|
|
+ }
|
|
|
+ if (btrfs_super_sys_array_size(sb) < sizeof(struct btrfs_disk_key)
|
|
|
+ + sizeof(struct btrfs_chunk)) {
|
|
|
+ printk(KERN_ERR "BTRFS: system chunk array too small %u < %lu\n",
|
|
|
+ btrfs_super_sys_array_size(sb),
|
|
|
+ sizeof(struct btrfs_disk_key)
|
|
|
+ + sizeof(struct btrfs_chunk));
|
|
|
+ ret = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* The generation is a global counter, we'll trust it more than the others
|
|
|
* but it's still possible that it's the one that's wrong.
|