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 19 #include "ctree.h" 20 #include "disk-io.h" 21 #include "print-tree.h" 22 23 void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) 24 { 25 int i; 26 u32 nr = btrfs_header_nritems(l); 27 struct btrfs_item *item; 28 struct btrfs_extent_item *ei; 29 struct btrfs_root_item *ri; 30 struct btrfs_dir_item *di; 31 struct btrfs_inode_item *ii; 32 struct btrfs_block_group_item *bi; 33 struct btrfs_file_extent_item *fi; 34 struct btrfs_key key; 35 struct btrfs_key found_key; 36 u32 type; 37 38 printk("leaf %llu total ptrs %d free space %d\n", 39 (unsigned long long)btrfs_header_bytenr(l), nr, 40 btrfs_leaf_free_space(root, l)); 41 for (i = 0 ; i < nr ; i++) { 42 item = btrfs_item_nr(l, i); 43 btrfs_item_key_to_cpu(l, &key, i); 44 type = btrfs_key_type(&key); 45 printk("\titem %d key (%llu %x %llu) itemoff %d itemsize %d\n", 46 i, 47 (unsigned long long)key.objectid, type, 48 (unsigned long long)key.offset, 49 btrfs_item_offset(l, item), btrfs_item_size(l, item)); 50 switch (type) { 51 case BTRFS_INODE_ITEM_KEY: 52 ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); 53 printk("\t\tinode generation %llu size %llu mode %o\n", 54 (unsigned long long)btrfs_inode_generation(l, ii), 55 (unsigned long long)btrfs_inode_size(l, ii), 56 btrfs_inode_mode(l, ii)); 57 break; 58 case BTRFS_DIR_ITEM_KEY: 59 di = btrfs_item_ptr(l, i, struct btrfs_dir_item); 60 btrfs_dir_item_key_to_cpu(l, di, &found_key); 61 printk("\t\tdir oid %llu type %u\n", 62 (unsigned long long)found_key.objectid, 63 btrfs_dir_type(l, di)); 64 break; 65 case BTRFS_ROOT_ITEM_KEY: 66 ri = btrfs_item_ptr(l, i, struct btrfs_root_item); 67 printk("\t\troot data bytenr %llu refs %u\n", 68 (unsigned long long)btrfs_disk_root_bytenr(l, ri), 69 btrfs_disk_root_refs(l, 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(l, ei)); 75 break; 76 77 case BTRFS_EXTENT_DATA_KEY: 78 fi = btrfs_item_ptr(l, i, 79 struct btrfs_file_extent_item); 80 if (btrfs_file_extent_type(l, fi) == 81 BTRFS_FILE_EXTENT_INLINE) { 82 printk("\t\tinline extent data size %u\n", 83 btrfs_file_extent_inline_len(l, item)); 84 break; 85 } 86 printk("\t\textent data disk bytenr %llu nr %llu\n", 87 (unsigned long long)btrfs_file_extent_disk_bytenr(l, fi), 88 (unsigned long long)btrfs_file_extent_disk_num_bytes(l, fi)); 89 printk("\t\textent data offset %llu nr %llu\n", 90 (unsigned long long)btrfs_file_extent_offset(l, fi), 91 (unsigned long long)btrfs_file_extent_num_bytes(l, fi)); 92 break; 93 case BTRFS_BLOCK_GROUP_ITEM_KEY: 94 bi = btrfs_item_ptr(l, i, 95 struct btrfs_block_group_item); 96 printk("\t\tblock group used %llu\n", 97 (unsigned long long)btrfs_disk_block_group_used(l, bi)); 98 break; 99 }; 100 } 101 } 102 103 void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *c) 104 { 105 int i; 106 u32 nr; 107 struct btrfs_key key; 108 int level; 109 110 if (!c) 111 return; 112 nr = btrfs_header_nritems(c); 113 level = btrfs_header_level(c); 114 if (level == 0) { 115 btrfs_print_leaf(root, c); 116 return; 117 } 118 printk("node %llu level %d total ptrs %d free spc %u\n", 119 (unsigned long long)btrfs_header_bytenr(c), 120 btrfs_header_level(c), nr, 121 (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr); 122 for (i = 0; i < nr; i++) { 123 btrfs_node_key_to_cpu(c, &key, i); 124 printk("\tkey %d (%llu %u %llu) block %llu\n", 125 i, 126 (unsigned long long)key.objectid, 127 key.type, 128 (unsigned long long)key.offset, 129 (unsigned long long)btrfs_node_blockptr(c, i)); 130 } 131 for (i = 0; i < nr; i++) { 132 struct extent_buffer *next = read_tree_block(root, 133 btrfs_node_blockptr(c, i), 134 btrfs_level_size(root, level - 1)); 135 if (btrfs_is_leaf(next) && 136 btrfs_header_level(c) != 1) 137 BUG(); 138 if (btrfs_header_level(next) != 139 btrfs_header_level(c) - 1) 140 BUG(); 141 btrfs_print_tree(root, next); 142 free_extent_buffer(next); 143 } 144 } 145 146