mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-25 23:52:17 +00:00
btrfs-progs: change btrfs_check_chunk_valid to match the kernel version
In btrfs-progs we check the actual leaf pointers as well as the chunk itself in btrfs_check_chunk_valid. However in the kernel the leaf stuff is handled separately as part of the read, and then we have the chunk checker itself. Change the btrfs-progs version to match the in-kernel version temporarily so it makes syncing the in-kernel code easier. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
361e4bea13
commit
180bd5edd1
@ -5329,8 +5329,7 @@ static int process_chunk_item(struct cache_tree *chunk_cache,
|
||||
* wrong onwer(3) out of chunk tree, to pass both chunk tree check
|
||||
* and owner<->key_type check.
|
||||
*/
|
||||
ret = btrfs_check_chunk_valid(gfs_info, eb, chunk, slot,
|
||||
key->offset);
|
||||
ret = btrfs_check_chunk_valid(eb, chunk, key->offset);
|
||||
if (ret < 0) {
|
||||
error("chunk(%llu, %llu) is not valid, ignore it",
|
||||
key->offset, btrfs_chunk_length(eb, chunk));
|
||||
|
@ -4470,8 +4470,7 @@ static int check_dev_extent_item(struct extent_buffer *eb, int slot)
|
||||
|
||||
l = path.nodes[0];
|
||||
chunk = btrfs_item_ptr(l, path.slots[0], struct btrfs_chunk);
|
||||
ret = btrfs_check_chunk_valid(gfs_info, l, chunk, path.slots[0],
|
||||
chunk_key.offset);
|
||||
ret = btrfs_check_chunk_valid(l, chunk, chunk_key.offset);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@ -4702,8 +4701,7 @@ static int check_chunk_item(struct extent_buffer *eb, int slot)
|
||||
chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk);
|
||||
length = btrfs_chunk_length(eb, chunk);
|
||||
chunk_end = chunk_key.offset + length;
|
||||
ret = btrfs_check_chunk_valid(gfs_info, eb, chunk, slot,
|
||||
chunk_key.offset);
|
||||
ret = btrfs_check_chunk_valid(eb, chunk, chunk_key.offset);
|
||||
if (ret < 0) {
|
||||
error("chunk[%llu %llu) is invalid", chunk_key.offset,
|
||||
chunk_end);
|
||||
|
@ -2090,33 +2090,19 @@ static struct btrfs_device *fill_missing_device(u64 devid)
|
||||
* slot == -1: SYSTEM chunk
|
||||
* return -EIO on error, otherwise return 0
|
||||
*/
|
||||
int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
|
||||
struct extent_buffer *leaf,
|
||||
struct btrfs_chunk *chunk,
|
||||
int slot, u64 logical)
|
||||
int btrfs_check_chunk_valid(struct extent_buffer *leaf,
|
||||
struct btrfs_chunk *chunk, u64 logical)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = leaf->fs_info;
|
||||
u64 length;
|
||||
u64 stripe_len;
|
||||
u16 num_stripes;
|
||||
u16 sub_stripes;
|
||||
u64 type;
|
||||
u32 chunk_ondisk_size;
|
||||
u32 sectorsize = fs_info->sectorsize;
|
||||
int min_devs;
|
||||
int table_sub_stripes;
|
||||
|
||||
/*
|
||||
* Basic chunk item size check. Note that btrfs_chunk already contains
|
||||
* one stripe, so no "==" check.
|
||||
*/
|
||||
if (slot >= 0 &&
|
||||
btrfs_item_size(leaf, slot) < sizeof(struct btrfs_chunk)) {
|
||||
error("invalid chunk item size, have %u expect [%zu, %u)",
|
||||
btrfs_item_size(leaf, slot),
|
||||
sizeof(struct btrfs_chunk),
|
||||
BTRFS_LEAF_DATA_SIZE(fs_info));
|
||||
return -EUCLEAN;
|
||||
}
|
||||
length = btrfs_chunk_length(leaf, chunk);
|
||||
stripe_len = btrfs_chunk_stripe_len(leaf, chunk);
|
||||
num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
|
||||
@ -2128,13 +2114,6 @@ int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
|
||||
num_stripes);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
if (slot >= 0 && btrfs_chunk_item_size(num_stripes) !=
|
||||
btrfs_item_size(leaf, slot)) {
|
||||
error("invalid chunk item size, have %u expect %lu",
|
||||
btrfs_item_size(leaf, slot),
|
||||
btrfs_chunk_item_size(num_stripes));
|
||||
return -EUCLEAN;
|
||||
}
|
||||
|
||||
/*
|
||||
* These valid checks may be insufficient to cover every corner cases.
|
||||
@ -2156,11 +2135,6 @@ int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
|
||||
error("invalid chunk stripe length: %llu", stripe_len);
|
||||
return -EIO;
|
||||
}
|
||||
/* Check on chunk item type */
|
||||
if (slot == -1 && (type & BTRFS_BLOCK_GROUP_SYSTEM) == 0) {
|
||||
error("invalid chunk type %llu", type);
|
||||
return -EIO;
|
||||
}
|
||||
if (type & ~(BTRFS_BLOCK_GROUP_TYPE_MASK |
|
||||
BTRFS_BLOCK_GROUP_PROFILE_MASK)) {
|
||||
error("unrecognized chunk type: %llu",
|
||||
@ -2183,18 +2157,6 @@ int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
chunk_ondisk_size = btrfs_chunk_item_size(num_stripes);
|
||||
/*
|
||||
* Btrfs_chunk contains at least one stripe, and for sys_chunk
|
||||
* it can't exceed the system chunk array size
|
||||
* For normal chunk, it should match its chunk item size.
|
||||
*/
|
||||
if (num_stripes < 1 ||
|
||||
(slot == -1 && chunk_ondisk_size > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) ||
|
||||
(slot >= 0 && chunk_ondisk_size > btrfs_item_size(leaf, slot))) {
|
||||
error("invalid num_stripes: %u", num_stripes);
|
||||
return -EIO;
|
||||
}
|
||||
/*
|
||||
* Device number check against profile
|
||||
*/
|
||||
@ -2243,7 +2205,7 @@ static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
|
||||
length = btrfs_chunk_length(leaf, chunk);
|
||||
num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
|
||||
/* Validation check */
|
||||
ret = btrfs_check_chunk_valid(fs_info, leaf, chunk, slot, logical);
|
||||
ret = btrfs_check_chunk_valid(leaf, chunk, logical);
|
||||
if (ret) {
|
||||
error("%s checksums match, but it has an invalid chunk, %s",
|
||||
(slot == -1) ? "Superblock" : "Metadata",
|
||||
|
@ -294,10 +294,8 @@ int write_raid56_with_parity(struct btrfs_fs_info *info,
|
||||
struct extent_buffer *eb,
|
||||
struct btrfs_multi_bio *multi,
|
||||
u64 stripe_len, u64 *raid_map);
|
||||
int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
|
||||
struct extent_buffer *leaf,
|
||||
struct btrfs_chunk *chunk,
|
||||
int slot, u64 logical);
|
||||
int btrfs_check_chunk_valid(struct extent_buffer *leaf,
|
||||
struct btrfs_chunk *chunk, u64 logical);
|
||||
u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
|
||||
struct extent_buffer *leaf,
|
||||
struct btrfs_chunk *chunk);
|
||||
|
Loading…
Reference in New Issue
Block a user