print-tree.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include <linux/module.h>
  2. #include "ctree.h"
  3. #include "disk-io.h"
  4. void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l)
  5. {
  6. int i;
  7. u32 nr = btrfs_header_nritems(&l->header);
  8. struct btrfs_item *item;
  9. struct btrfs_extent_item *ei;
  10. struct btrfs_root_item *ri;
  11. struct btrfs_dir_item *di;
  12. struct btrfs_inode_item *ii;
  13. u32 type;
  14. printk("leaf %Lu total ptrs %d free space %d\n",
  15. btrfs_header_blocknr(&l->header), nr,
  16. btrfs_leaf_free_space(root, l));
  17. for (i = 0 ; i < nr ; i++) {
  18. item = l->items + i;
  19. type = btrfs_disk_key_type(&item->key);
  20. printk("\titem %d key (%Lu %u %Lu) itemoff %d itemsize %d\n",
  21. i,
  22. btrfs_disk_key_objectid(&item->key),
  23. btrfs_disk_key_flags(&item->key),
  24. btrfs_disk_key_offset(&item->key),
  25. btrfs_item_offset(item),
  26. btrfs_item_size(item));
  27. switch (type) {
  28. case BTRFS_INODE_ITEM_KEY:
  29. ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
  30. printk("\t\tinode generation %Lu size %Lu mode %o\n",
  31. btrfs_inode_generation(ii),
  32. btrfs_inode_size(ii),
  33. btrfs_inode_mode(ii));
  34. break;
  35. case BTRFS_DIR_ITEM_KEY:
  36. di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
  37. printk("\t\tdir oid %Lu flags %u type %u\n",
  38. btrfs_disk_key_objectid(&di->location),
  39. btrfs_dir_flags(di),
  40. btrfs_dir_type(di));
  41. printk("\t\tname %.*s\n",
  42. btrfs_dir_name_len(di),(char *)(di + 1));
  43. break;
  44. case BTRFS_ROOT_ITEM_KEY:
  45. ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
  46. printk("\t\troot data blocknr %Lu refs %u\n",
  47. btrfs_root_blocknr(ri), btrfs_root_refs(ri));
  48. break;
  49. case BTRFS_EXTENT_ITEM_KEY:
  50. ei = btrfs_item_ptr(l, i, struct btrfs_extent_item);
  51. printk("\t\textent data refs %u\n",
  52. btrfs_extent_refs(ei));
  53. break;
  54. case BTRFS_STRING_ITEM_KEY:
  55. printk("\t\titem data %.*s\n", btrfs_item_size(item),
  56. btrfs_leaf_data(l) + btrfs_item_offset(item));
  57. break;
  58. };
  59. }
  60. }
  61. void btrfs_print_tree(struct btrfs_root *root, struct buffer_head *t)
  62. {
  63. int i;
  64. u32 nr;
  65. struct btrfs_node *c;
  66. if (!t)
  67. return;
  68. c = btrfs_buffer_node(t);
  69. nr = btrfs_header_nritems(&c->header);
  70. if (btrfs_is_leaf(c)) {
  71. btrfs_print_leaf(root, (struct btrfs_leaf *)c);
  72. return;
  73. }
  74. printk("node %Lu level %d total ptrs %d free spc %u\n",
  75. btrfs_header_blocknr(&c->header),
  76. btrfs_header_level(&c->header), nr,
  77. (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr);
  78. for (i = 0; i < nr; i++) {
  79. printk("\tkey %d (%Lu %u %Lu) block %Lu\n",
  80. i,
  81. c->ptrs[i].key.objectid,
  82. c->ptrs[i].key.flags,
  83. c->ptrs[i].key.offset,
  84. btrfs_node_blockptr(c, i));
  85. }
  86. for (i = 0; i < nr; i++) {
  87. struct buffer_head *next_buf = read_tree_block(root,
  88. btrfs_node_blockptr(c, i));
  89. struct btrfs_node *next = btrfs_buffer_node(next_buf);
  90. if (btrfs_is_leaf(next) &&
  91. btrfs_header_level(&c->header) != 1)
  92. BUG();
  93. if (btrfs_header_level(&next->header) !=
  94. btrfs_header_level(&c->header) - 1)
  95. BUG();
  96. btrfs_print_tree(root, next_buf);
  97. btrfs_block_release(root, next_buf);
  98. }
  99. }