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