print-tree.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright (C) 2007 Oracle. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public
  6. * License v2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public
  14. * License along with this program; if not, write to the
  15. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16. * Boston, MA 021110-1307, USA.
  17. */
  18. #include <linux/module.h>
  19. #include "ctree.h"
  20. #include "disk-io.h"
  21. #include "print-tree.h"
  22. void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l)
  23. {
  24. int i;
  25. u32 nr = btrfs_header_nritems(&l->header);
  26. struct btrfs_item *item;
  27. struct btrfs_extent_item *ei;
  28. struct btrfs_root_item *ri;
  29. struct btrfs_dir_item *di;
  30. struct btrfs_inode_item *ii;
  31. struct btrfs_block_group_item *bi;
  32. struct btrfs_file_extent_item *fi;
  33. u32 type;
  34. printk("leaf %llu total ptrs %d free space %d\n",
  35. (unsigned long long)btrfs_header_blocknr(&l->header), nr,
  36. btrfs_leaf_free_space(root, l));
  37. for (i = 0 ; i < nr ; i++) {
  38. item = l->items + i;
  39. type = btrfs_disk_key_type(&item->key);
  40. printk("\titem %d key (%llu %x %llu) itemoff %d itemsize %d\n",
  41. i,
  42. (unsigned long long)btrfs_disk_key_objectid(&item->key),
  43. btrfs_disk_key_flags(&item->key),
  44. (unsigned long long)btrfs_disk_key_offset(&item->key),
  45. btrfs_item_offset(item),
  46. btrfs_item_size(item));
  47. switch (type) {
  48. case BTRFS_INODE_ITEM_KEY:
  49. ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
  50. printk("\t\tinode generation %llu size %llu mode %o\n",
  51. (unsigned long long)btrfs_inode_generation(ii),
  52. (unsigned long long)btrfs_inode_size(ii),
  53. btrfs_inode_mode(ii));
  54. break;
  55. case BTRFS_DIR_ITEM_KEY:
  56. di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
  57. printk("\t\tdir oid %llu flags %u type %u\n",
  58. (unsigned long long)btrfs_disk_key_objectid(
  59. &di->location),
  60. btrfs_dir_flags(di),
  61. btrfs_dir_type(di));
  62. printk("\t\tname %.*s\n",
  63. btrfs_dir_name_len(di),(char *)(di + 1));
  64. break;
  65. case BTRFS_ROOT_ITEM_KEY:
  66. ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
  67. printk("\t\troot data blocknr %llu refs %u\n",
  68. (unsigned long long)btrfs_root_blocknr(ri),
  69. btrfs_root_refs(ri));
  70. break;
  71. case BTRFS_EXTENT_ITEM_KEY:
  72. ei = btrfs_item_ptr(l, i, struct btrfs_extent_item);
  73. printk("\t\textent data refs %u\n",
  74. btrfs_extent_refs(ei));
  75. break;
  76. case BTRFS_EXTENT_DATA_KEY:
  77. fi = btrfs_item_ptr(l, i,
  78. struct btrfs_file_extent_item);
  79. if (btrfs_file_extent_type(fi) ==
  80. BTRFS_FILE_EXTENT_INLINE) {
  81. printk("\t\tinline extent data size %u\n",
  82. btrfs_file_extent_inline_len(l->items + i));
  83. break;
  84. }
  85. printk("\t\textent data disk block %llu nr %llu\n",
  86. (unsigned long long)btrfs_file_extent_disk_blocknr(fi),
  87. (unsigned long long)btrfs_file_extent_disk_num_blocks(fi));
  88. printk("\t\textent data offset %llu nr %llu\n",
  89. (unsigned long long)btrfs_file_extent_offset(fi),
  90. (unsigned long long)btrfs_file_extent_num_blocks(fi));
  91. break;
  92. case BTRFS_BLOCK_GROUP_ITEM_KEY:
  93. bi = btrfs_item_ptr(l, i,
  94. struct btrfs_block_group_item);
  95. printk("\t\tblock group used %llu\n",
  96. (unsigned long long)btrfs_block_group_used(bi));
  97. break;
  98. case BTRFS_STRING_ITEM_KEY:
  99. printk("\t\titem data %.*s\n", btrfs_item_size(item),
  100. btrfs_leaf_data(l) + btrfs_item_offset(item));
  101. break;
  102. };
  103. }
  104. }
  105. void btrfs_print_tree(struct btrfs_root *root, struct buffer_head *t)
  106. {
  107. int i;
  108. u32 nr;
  109. struct btrfs_node *c;
  110. if (!t)
  111. return;
  112. c = btrfs_buffer_node(t);
  113. nr = btrfs_header_nritems(&c->header);
  114. if (btrfs_is_leaf(c)) {
  115. btrfs_print_leaf(root, (struct btrfs_leaf *)c);
  116. return;
  117. }
  118. printk("node %llu level %d total ptrs %d free spc %u\n",
  119. (unsigned long long)btrfs_header_blocknr(&c->header),
  120. btrfs_header_level(&c->header), nr,
  121. (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr);
  122. for (i = 0; i < nr; i++) {
  123. printk("\tkey %d (%llu %u %llu) block %llu\n",
  124. i,
  125. (unsigned long long)c->ptrs[i].key.objectid,
  126. c->ptrs[i].key.flags,
  127. (unsigned long long)c->ptrs[i].key.offset,
  128. (unsigned long long)btrfs_node_blockptr(c, i));
  129. }
  130. for (i = 0; i < nr; i++) {
  131. struct buffer_head *next_buf = read_tree_block(root,
  132. btrfs_node_blockptr(c, i));
  133. struct btrfs_node *next = btrfs_buffer_node(next_buf);
  134. if (btrfs_is_leaf(next) &&
  135. btrfs_header_level(&c->header) != 1)
  136. BUG();
  137. if (btrfs_header_level(&next->header) !=
  138. btrfs_header_level(&c->header) - 1)
  139. BUG();
  140. btrfs_print_tree(root, next_buf);
  141. btrfs_block_release(root, next_buf);
  142. }
  143. }