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>

authored by Qu Wenruo and committed by David Sterba c0872323 5e388e95

Changed files
+16 -11
fs
+15 -10
fs/btrfs/print-tree.c
··· 189 189 fs_info = l->fs_info; 190 190 nr = btrfs_header_nritems(l); 191 191 192 - btrfs_info(fs_info, "leaf %llu total ptrs %d free space %d", 193 - btrfs_header_bytenr(l), nr, 194 - btrfs_leaf_free_space(fs_info, l)); 192 + btrfs_info(fs_info, 193 + "leaf %llu gen %llu total ptrs %d free space %d owner %llu", 194 + btrfs_header_bytenr(l), btrfs_header_generation(l), nr, 195 + btrfs_leaf_free_space(fs_info, l), btrfs_header_owner(l)); 195 196 for (i = 0 ; i < nr ; i++) { 196 197 item = btrfs_item_nr(i); 197 198 btrfs_item_key_to_cpu(l, &key, i); ··· 326 325 } 327 326 } 328 327 329 - void btrfs_print_tree(struct extent_buffer *c) 328 + void btrfs_print_tree(struct extent_buffer *c, bool follow) 330 329 { 331 330 struct btrfs_fs_info *fs_info; 332 331 int i; u32 nr; ··· 343 342 return; 344 343 } 345 344 btrfs_info(fs_info, 346 - "node %llu level %d total ptrs %d free spc %u", 347 - btrfs_header_bytenr(c), level, nr, 348 - (u32)BTRFS_NODEPTRS_PER_BLOCK(fs_info) - nr); 345 + "node %llu level %d gen %llu total ptrs %d free spc %u owner %llu", 346 + btrfs_header_bytenr(c), level, btrfs_header_generation(c), 347 + nr, (u32)BTRFS_NODEPTRS_PER_BLOCK(fs_info) - nr, 348 + btrfs_header_owner(c)); 349 349 for (i = 0; i < nr; i++) { 350 350 btrfs_node_key_to_cpu(c, &key, i); 351 - pr_info("\tkey %d (%llu %u %llu) block %llu\n", 351 + pr_info("\tkey %d (%llu %u %llu) block %llu gen %llu\n", 352 352 i, key.objectid, key.type, key.offset, 353 - btrfs_node_blockptr(c, i)); 353 + btrfs_node_blockptr(c, i), 354 + btrfs_node_ptr_generation(c, i)); 354 355 } 356 + if (!follow) 357 + return; 355 358 for (i = 0; i < nr; i++) { 356 359 struct btrfs_key first_key; 357 360 struct extent_buffer *next; ··· 377 372 if (btrfs_header_level(next) != 378 373 level - 1) 379 374 BUG(); 380 - btrfs_print_tree(next); 375 + btrfs_print_tree(next, follow); 381 376 free_extent_buffer(next); 382 377 } 383 378 }
+1 -1
fs/btrfs/print-tree.h
··· 7 7 #define BTRFS_PRINT_TREE_H 8 8 9 9 void btrfs_print_leaf(struct extent_buffer *l); 10 - void btrfs_print_tree(struct extent_buffer *c); 10 + void btrfs_print_tree(struct extent_buffer *c, bool follow); 11 11 12 12 #endif