btrfs-progs: dump-tree: improved error handling in print_extents

Signed-off-by: David Sterba <dsterba@suse.com>
master
David Sterba 2016-08-26 12:53:31 +02:00
parent 7febbc9efe
commit 04b3bf1779
1 changed files with 22 additions and 10 deletions

View File

@ -35,6 +35,7 @@
static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) static void print_extents(struct btrfs_root *root, struct extent_buffer *eb)
{ {
struct extent_buffer *next;
int i; int i;
u32 nr; u32 nr;
u32 size; u32 size;
@ -50,21 +51,32 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb)
size = root->nodesize; size = root->nodesize;
nr = btrfs_header_nritems(eb); nr = btrfs_header_nritems(eb);
for (i = 0; i < nr; i++) { for (i = 0; i < nr; i++) {
struct extent_buffer *next = read_tree_block(root, next = read_tree_block(root, btrfs_node_blockptr(eb, i),
btrfs_node_blockptr(eb, i), size, btrfs_node_ptr_generation(eb, i));
size,
btrfs_node_ptr_generation(eb, i));
if (!extent_buffer_uptodate(next)) if (!extent_buffer_uptodate(next))
continue; continue;
if (btrfs_is_leaf(next) && if (btrfs_is_leaf(next) && btrfs_header_level(eb) != 1) {
btrfs_header_level(eb) != 1) warning(
BUG(); "eb corrupted: item %d eb level %d next level %d, skipping the rest",
if (btrfs_header_level(next) != i, btrfs_header_level(next),
btrfs_header_level(eb) - 1) btrfs_header_level(eb));
BUG(); goto out;
}
if (btrfs_header_level(next) != btrfs_header_level(eb) - 1) {
warning(
"eb corrupted: item %d eb level %d next level %d, skipping the rest",
i, btrfs_header_level(next),
btrfs_header_level(eb));
goto out;
}
print_extents(root, next); print_extents(root, next);
free_extent_buffer(next); free_extent_buffer(next);
} }
return;
out:
free_extent_buffer(next);
} }
static void print_old_roots(struct btrfs_super_block *super) static void print_old_roots(struct btrfs_super_block *super)