mirror of
https://github.com/kdave/btrfs-progs
synced 2025-02-26 23:10:50 +00:00
btrfs-progs: Enhance chunk item validation check
btrfs_check_chunk_valid() doesn't check if 1) chunk flag has conflicting flags For example chunk type DATA|METADATA|RAID1|RAID10 is completely invalid, while current check_chunk_valid() can't detect it. 2) num_stripes is invalid for RAID10 Num_stripes 5 is not valid for RAID10. This patch will enhance btrfs_check_chunk_valid() to handle above cases. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
05734124f2
commit
383b2b9c56
17
volumes.c
17
volumes.c
@ -1727,6 +1727,20 @@ int btrfs_check_chunk_valid(struct btrfs_root *root,
|
||||
BTRFS_BLOCK_GROUP_PROFILE_MASK) & type);
|
||||
return -EIO;
|
||||
}
|
||||
if (!(type & BTRFS_BLOCK_GROUP_TYPE_MASK)) {
|
||||
error("missing chunk type flag: %llu", type);
|
||||
return -EIO;
|
||||
}
|
||||
if (!(is_power_of_2(type & BTRFS_BLOCK_GROUP_PROFILE_MASK) ||
|
||||
(type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0)) {
|
||||
error("conflicting chunk type detected: %llu", type);
|
||||
return -EIO;
|
||||
}
|
||||
if ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) &&
|
||||
!is_power_of_2(type & BTRFS_BLOCK_GROUP_PROFILE_MASK)) {
|
||||
error("conflicting chunk profile detected: %llu", type);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
chunk_ondisk_size = btrfs_chunk_item_size(num_stripes);
|
||||
/*
|
||||
@ -1743,7 +1757,8 @@ int btrfs_check_chunk_valid(struct btrfs_root *root,
|
||||
/*
|
||||
* Device number check against profile
|
||||
*/
|
||||
if ((type & BTRFS_BLOCK_GROUP_RAID10 && sub_stripes == 0) ||
|
||||
if ((type & BTRFS_BLOCK_GROUP_RAID10 && (sub_stripes != 2 ||
|
||||
!IS_ALIGNED(num_stripes, sub_stripes))) ||
|
||||
(type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes < 1) ||
|
||||
(type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 2) ||
|
||||
(type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 3) ||
|
||||
|
Loading…
Reference in New Issue
Block a user