mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-30 01:12:45 +00:00
btrfs-progs: check: Move check_child_node to check/common.c
Reviewed-by: Su Yue <suy.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
fa37a13f73
commit
3d3ce73d90
@ -275,3 +275,52 @@ void reada_walk_down(struct btrfs_root *root, struct extent_buffer *node,
|
||||
readahead_tree_block(fs_info, bytenr, ptr_gen);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the child node/leaf by the following condition:
|
||||
* 1. the first item key of the node/leaf should be the same with the one
|
||||
* in parent.
|
||||
* 2. block in parent node should match the child node/leaf.
|
||||
* 3. generation of parent node and child's header should be consistent.
|
||||
*
|
||||
* Or the child node/leaf pointed by the key in parent is not valid.
|
||||
*
|
||||
* We hope to check leaf owner too, but since subvol may share leaves,
|
||||
* which makes leaf owner check not so strong, key check should be
|
||||
* sufficient enough for that case.
|
||||
*/
|
||||
int check_child_node(struct extent_buffer *parent, int slot,
|
||||
struct extent_buffer *child)
|
||||
{
|
||||
struct btrfs_key parent_key;
|
||||
struct btrfs_key child_key;
|
||||
int ret = 0;
|
||||
|
||||
btrfs_node_key_to_cpu(parent, &parent_key, slot);
|
||||
if (btrfs_header_level(child) == 0)
|
||||
btrfs_item_key_to_cpu(child, &child_key, 0);
|
||||
else
|
||||
btrfs_node_key_to_cpu(child, &child_key, 0);
|
||||
|
||||
if (memcmp(&parent_key, &child_key, sizeof(parent_key))) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr,
|
||||
"Wrong key of child node/leaf, wanted: (%llu, %u, %llu), have: (%llu, %u, %llu)\n",
|
||||
parent_key.objectid, parent_key.type, parent_key.offset,
|
||||
child_key.objectid, child_key.type, child_key.offset);
|
||||
}
|
||||
if (btrfs_header_bytenr(child) != btrfs_node_blockptr(parent, slot)) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "Wrong block of child node/leaf, wanted: %llu, have: %llu\n",
|
||||
btrfs_node_blockptr(parent, slot),
|
||||
btrfs_header_bytenr(child));
|
||||
}
|
||||
if (btrfs_node_ptr_generation(parent, slot) !=
|
||||
btrfs_header_generation(child)) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "Wrong generation of child node/leaf, wanted: %llu, have: %llu\n",
|
||||
btrfs_header_generation(child),
|
||||
btrfs_node_ptr_generation(parent, slot));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -93,5 +93,7 @@ int link_inode_to_lostfound(struct btrfs_trans_handle *trans,
|
||||
void check_dev_size_alignment(u64 devid, u64 total_bytes, u32 sectorsize);
|
||||
void reada_walk_down(struct btrfs_root *root, struct extent_buffer *node,
|
||||
int slot);
|
||||
int check_child_node(struct extent_buffer *parent, int slot,
|
||||
struct extent_buffer *child);
|
||||
|
||||
#endif
|
||||
|
49
check/main.c
49
check/main.c
@ -1668,55 +1668,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the child node/leaf by the following condition:
|
||||
* 1. the first item key of the node/leaf should be the same with the one
|
||||
* in parent.
|
||||
* 2. block in parent node should match the child node/leaf.
|
||||
* 3. generation of parent node and child's header should be consistent.
|
||||
*
|
||||
* Or the child node/leaf pointed by the key in parent is not valid.
|
||||
*
|
||||
* We hope to check leaf owner too, but since subvol may share leaves,
|
||||
* which makes leaf owner check not so strong, key check should be
|
||||
* sufficient enough for that case.
|
||||
*/
|
||||
static int check_child_node(struct extent_buffer *parent, int slot,
|
||||
struct extent_buffer *child)
|
||||
{
|
||||
struct btrfs_key parent_key;
|
||||
struct btrfs_key child_key;
|
||||
int ret = 0;
|
||||
|
||||
btrfs_node_key_to_cpu(parent, &parent_key, slot);
|
||||
if (btrfs_header_level(child) == 0)
|
||||
btrfs_item_key_to_cpu(child, &child_key, 0);
|
||||
else
|
||||
btrfs_node_key_to_cpu(child, &child_key, 0);
|
||||
|
||||
if (memcmp(&parent_key, &child_key, sizeof(parent_key))) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr,
|
||||
"Wrong key of child node/leaf, wanted: (%llu, %u, %llu), have: (%llu, %u, %llu)\n",
|
||||
parent_key.objectid, parent_key.type, parent_key.offset,
|
||||
child_key.objectid, child_key.type, child_key.offset);
|
||||
}
|
||||
if (btrfs_header_bytenr(child) != btrfs_node_blockptr(parent, slot)) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "Wrong block of child node/leaf, wanted: %llu, have: %llu\n",
|
||||
btrfs_node_blockptr(parent, slot),
|
||||
btrfs_header_bytenr(child));
|
||||
}
|
||||
if (btrfs_node_ptr_generation(parent, slot) !=
|
||||
btrfs_header_generation(child)) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "Wrong generation of child node/leaf, wanted: %llu, have: %llu\n",
|
||||
btrfs_header_generation(child),
|
||||
btrfs_node_ptr_generation(parent, slot));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* for a tree node or leaf, if it's shared, indeed we don't need to iterate it
|
||||
* in every fs or file tree check. Here we find its all root ids, and only check
|
||||
|
Loading…
Reference in New Issue
Block a user