@@ -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);
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> --- check/main.c | 3 +-- check/mode-lowmem.c | 6 ++---- kernel-shared/volumes.c | 46 ++++------------------------------------- kernel-shared/volumes.h | 6 ++---- 4 files changed, 9 insertions(+), 52 deletions(-)