mirror of https://gitee.com/openkylin/linux.git
btrfs: volumes: Make sure no dev extent is beyond device boundary
Add extra dev extent end check against device boundary. Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
5eb193812a
commit
05a37c4860
|
@ -7387,6 +7387,7 @@ static int verify_one_dev_extent(struct btrfs_fs_info *fs_info,
|
|||
struct extent_map_tree *em_tree = &fs_info->mapping_tree.map_tree;
|
||||
struct extent_map *em;
|
||||
struct map_lookup *map;
|
||||
struct btrfs_device *dev;
|
||||
u64 stripe_len;
|
||||
bool found = false;
|
||||
int ret = 0;
|
||||
|
@ -7436,6 +7437,22 @@ static int verify_one_dev_extent(struct btrfs_fs_info *fs_info,
|
|||
physical_offset, devid);
|
||||
ret = -EUCLEAN;
|
||||
}
|
||||
|
||||
/* Make sure no dev extent is beyond device bondary */
|
||||
dev = btrfs_find_device(fs_info, devid, NULL, NULL);
|
||||
if (!dev) {
|
||||
btrfs_err(fs_info, "failed to find devid %llu", devid);
|
||||
ret = -EUCLEAN;
|
||||
goto out;
|
||||
}
|
||||
if (physical_offset + physical_len > dev->disk_total_bytes) {
|
||||
btrfs_err(fs_info,
|
||||
"dev extent devid %llu physical offset %llu len %llu is beyond device boundary %llu",
|
||||
devid, physical_offset, physical_len,
|
||||
dev->disk_total_bytes);
|
||||
ret = -EUCLEAN;
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
free_extent_map(em);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue