btrfs: print-tree: debugging output enhancement

This patch enhances the following things:

- tree block header
  * add generation and owner output for node and leaf
- node pointer generation output
- allow btrfs_print_tree() to not follow nodes
  * just like btrfs-progs

Please note that, although function btrfs_print_tree() is not called by
anyone right now, it's still a pretty useful function to debug kernel.
So that function is still kept for later use.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2018-04-11 17:08:12 +08:00 committed by David Sterba
parent 5e388e9581
commit c087232374
2 changed files with 16 additions and 11 deletions

View File

@ -189,9 +189,10 @@ void btrfs_print_leaf(struct extent_buffer *l)
fs_info = l->fs_info; fs_info = l->fs_info;
nr = btrfs_header_nritems(l); nr = btrfs_header_nritems(l);
btrfs_info(fs_info, "leaf %llu total ptrs %d free space %d", btrfs_info(fs_info,
btrfs_header_bytenr(l), nr, "leaf %llu gen %llu total ptrs %d free space %d owner %llu",
btrfs_leaf_free_space(fs_info, l)); btrfs_header_bytenr(l), btrfs_header_generation(l), nr,
btrfs_leaf_free_space(fs_info, l), btrfs_header_owner(l));
for (i = 0 ; i < nr ; i++) { for (i = 0 ; i < nr ; i++) {
item = btrfs_item_nr(i); item = btrfs_item_nr(i);
btrfs_item_key_to_cpu(l, &key, i); btrfs_item_key_to_cpu(l, &key, i);
@ -325,7 +326,7 @@ void btrfs_print_leaf(struct extent_buffer *l)
} }
} }
void btrfs_print_tree(struct extent_buffer *c) void btrfs_print_tree(struct extent_buffer *c, bool follow)
{ {
struct btrfs_fs_info *fs_info; struct btrfs_fs_info *fs_info;
int i; u32 nr; int i; u32 nr;
@ -342,15 +343,19 @@ void btrfs_print_tree(struct extent_buffer *c)
return; return;
} }
btrfs_info(fs_info, btrfs_info(fs_info,
"node %llu level %d total ptrs %d free spc %u", "node %llu level %d gen %llu total ptrs %d free spc %u owner %llu",
btrfs_header_bytenr(c), level, nr, btrfs_header_bytenr(c), level, btrfs_header_generation(c),
(u32)BTRFS_NODEPTRS_PER_BLOCK(fs_info) - nr); nr, (u32)BTRFS_NODEPTRS_PER_BLOCK(fs_info) - nr,
btrfs_header_owner(c));
for (i = 0; i < nr; i++) { for (i = 0; i < nr; i++) {
btrfs_node_key_to_cpu(c, &key, i); btrfs_node_key_to_cpu(c, &key, i);
pr_info("\tkey %d (%llu %u %llu) block %llu\n", pr_info("\tkey %d (%llu %u %llu) block %llu gen %llu\n",
i, key.objectid, key.type, key.offset, i, key.objectid, key.type, key.offset,
btrfs_node_blockptr(c, i)); btrfs_node_blockptr(c, i),
btrfs_node_ptr_generation(c, i));
} }
if (!follow)
return;
for (i = 0; i < nr; i++) { for (i = 0; i < nr; i++) {
struct btrfs_key first_key; struct btrfs_key first_key;
struct extent_buffer *next; struct extent_buffer *next;
@ -372,7 +377,7 @@ void btrfs_print_tree(struct extent_buffer *c)
if (btrfs_header_level(next) != if (btrfs_header_level(next) !=
level - 1) level - 1)
BUG(); BUG();
btrfs_print_tree(next); btrfs_print_tree(next, follow);
free_extent_buffer(next); free_extent_buffer(next);
} }
} }

View File

@ -7,6 +7,6 @@
#define BTRFS_PRINT_TREE_H #define BTRFS_PRINT_TREE_H
void btrfs_print_leaf(struct extent_buffer *l); void btrfs_print_leaf(struct extent_buffer *l);
void btrfs_print_tree(struct extent_buffer *c); void btrfs_print_tree(struct extent_buffer *c, bool follow);
#endif #endif