• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
print_chunk(struct extent_buffer * eb,struct btrfs_chunk * chunk)23 static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk)
24 {
25 	int num_stripes = btrfs_chunk_num_stripes(eb, chunk);
26 	int i;
27 	printk(KERN_INFO "\t\tchunk length %llu owner %llu type %llu "
28 	       "num_stripes %d\n",
29 	       (unsigned long long)btrfs_chunk_length(eb, chunk),
30 	       (unsigned long long)btrfs_chunk_owner(eb, chunk),
31 	       (unsigned long long)btrfs_chunk_type(eb, chunk),
32 	       num_stripes);
33 	for (i = 0 ; i < num_stripes ; i++) {
34 		printk(KERN_INFO "\t\t\tstripe %d devid %llu offset %llu\n", i,
35 		      (unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i),
36 		      (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i));
37 	}
38 }
print_dev_item(struct extent_buffer * eb,struct btrfs_dev_item * dev_item)39 static void print_dev_item(struct extent_buffer *eb,
40 			   struct btrfs_dev_item *dev_item)
41 {
42 	printk(KERN_INFO "\t\tdev item devid %llu "
43 	       "total_bytes %llu bytes used %llu\n",
44 	       (unsigned long long)btrfs_device_id(eb, dev_item),
45 	       (unsigned long long)btrfs_device_total_bytes(eb, dev_item),
46 	       (unsigned long long)btrfs_device_bytes_used(eb, dev_item));
47 }
btrfs_print_leaf(struct btrfs_root * root,struct extent_buffer * l)48 void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
49 {
50 	int i;
51 	u32 nr = btrfs_header_nritems(l);
52 	struct btrfs_item *item;
53 	struct btrfs_extent_item *ei;
54 	struct btrfs_root_item *ri;
55 	struct btrfs_dir_item *di;
56 	struct btrfs_inode_item *ii;
57 	struct btrfs_block_group_item *bi;
58 	struct btrfs_file_extent_item *fi;
59 	struct btrfs_key key;
60 	struct btrfs_key found_key;
61 	struct btrfs_extent_ref *ref;
62 	struct btrfs_dev_extent *dev_extent;
63 	u32 type;
64 
65 	printk(KERN_INFO "leaf %llu total ptrs %d free space %d\n",
66 		(unsigned long long)btrfs_header_bytenr(l), nr,
67 		btrfs_leaf_free_space(root, l));
68 	for (i = 0 ; i < nr ; i++) {
69 		item = btrfs_item_nr(l, i);
70 		btrfs_item_key_to_cpu(l, &key, i);
71 		type = btrfs_key_type(&key);
72 		printk(KERN_INFO "\titem %d key (%llu %x %llu) itemoff %d "
73 		       "itemsize %d\n",
74 			i,
75 			(unsigned long long)key.objectid, type,
76 			(unsigned long long)key.offset,
77 			btrfs_item_offset(l, item), btrfs_item_size(l, item));
78 		switch (type) {
79 		case BTRFS_INODE_ITEM_KEY:
80 			ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
81 			printk(KERN_INFO "\t\tinode generation %llu size %llu "
82 			       "mode %o\n",
83 			       (unsigned long long)
84 			       btrfs_inode_generation(l, ii),
85 			      (unsigned long long)btrfs_inode_size(l, ii),
86 			       btrfs_inode_mode(l, ii));
87 			break;
88 		case BTRFS_DIR_ITEM_KEY:
89 			di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
90 			btrfs_dir_item_key_to_cpu(l, di, &found_key);
91 			printk(KERN_INFO "\t\tdir oid %llu type %u\n",
92 				(unsigned long long)found_key.objectid,
93 				btrfs_dir_type(l, di));
94 			break;
95 		case BTRFS_ROOT_ITEM_KEY:
96 			ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
97 			printk(KERN_INFO "\t\troot data bytenr %llu refs %u\n",
98 				(unsigned long long)
99 				btrfs_disk_root_bytenr(l, ri),
100 				btrfs_disk_root_refs(l, ri));
101 			break;
102 		case BTRFS_EXTENT_ITEM_KEY:
103 			ei = btrfs_item_ptr(l, i, struct btrfs_extent_item);
104 			printk(KERN_INFO "\t\textent data refs %u\n",
105 				btrfs_extent_refs(l, ei));
106 			break;
107 		case BTRFS_EXTENT_REF_KEY:
108 			ref = btrfs_item_ptr(l, i, struct btrfs_extent_ref);
109 			printk(KERN_INFO "\t\textent back ref root %llu "
110 			       "gen %llu owner %llu num_refs %lu\n",
111 			       (unsigned long long)btrfs_ref_root(l, ref),
112 			       (unsigned long long)btrfs_ref_generation(l, ref),
113 			       (unsigned long long)btrfs_ref_objectid(l, ref),
114 			       (unsigned long)btrfs_ref_num_refs(l, ref));
115 			break;
116 
117 		case BTRFS_EXTENT_DATA_KEY:
118 			fi = btrfs_item_ptr(l, i,
119 					    struct btrfs_file_extent_item);
120 			if (btrfs_file_extent_type(l, fi) ==
121 			    BTRFS_FILE_EXTENT_INLINE) {
122 				printk(KERN_INFO "\t\tinline extent data "
123 				       "size %u\n",
124 				       btrfs_file_extent_inline_len(l, fi));
125 				break;
126 			}
127 			printk(KERN_INFO "\t\textent data disk bytenr %llu "
128 			       "nr %llu\n",
129 			       (unsigned long long)
130 			       btrfs_file_extent_disk_bytenr(l, fi),
131 			       (unsigned long long)
132 			       btrfs_file_extent_disk_num_bytes(l, fi));
133 			printk(KERN_INFO "\t\textent data offset %llu "
134 			       "nr %llu ram %llu\n",
135 			       (unsigned long long)
136 			       btrfs_file_extent_offset(l, fi),
137 			       (unsigned long long)
138 			       btrfs_file_extent_num_bytes(l, fi),
139 			       (unsigned long long)
140 			       btrfs_file_extent_ram_bytes(l, fi));
141 			break;
142 		case BTRFS_BLOCK_GROUP_ITEM_KEY:
143 			bi = btrfs_item_ptr(l, i,
144 					    struct btrfs_block_group_item);
145 			printk(KERN_INFO "\t\tblock group used %llu\n",
146 			       (unsigned long long)
147 			       btrfs_disk_block_group_used(l, bi));
148 			break;
149 		case BTRFS_CHUNK_ITEM_KEY:
150 			print_chunk(l, btrfs_item_ptr(l, i,
151 						      struct btrfs_chunk));
152 			break;
153 		case BTRFS_DEV_ITEM_KEY:
154 			print_dev_item(l, btrfs_item_ptr(l, i,
155 					struct btrfs_dev_item));
156 			break;
157 		case BTRFS_DEV_EXTENT_KEY:
158 			dev_extent = btrfs_item_ptr(l, i,
159 						    struct btrfs_dev_extent);
160 			printk(KERN_INFO "\t\tdev extent chunk_tree %llu\n"
161 			       "\t\tchunk objectid %llu chunk offset %llu "
162 			       "length %llu\n",
163 			       (unsigned long long)
164 			       btrfs_dev_extent_chunk_tree(l, dev_extent),
165 			       (unsigned long long)
166 			       btrfs_dev_extent_chunk_objectid(l, dev_extent),
167 			       (unsigned long long)
168 			       btrfs_dev_extent_chunk_offset(l, dev_extent),
169 			       (unsigned long long)
170 			       btrfs_dev_extent_length(l, dev_extent));
171 		};
172 	}
173 }
174 
btrfs_print_tree(struct btrfs_root * root,struct extent_buffer * c)175 void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *c)
176 {
177 	int i; u32 nr;
178 	struct btrfs_key key;
179 	int level;
180 
181 	if (!c)
182 		return;
183 	nr = btrfs_header_nritems(c);
184 	level = btrfs_header_level(c);
185 	if (level == 0) {
186 		btrfs_print_leaf(root, c);
187 		return;
188 	}
189 	printk(KERN_INFO "node %llu level %d total ptrs %d free spc %u\n",
190 	       (unsigned long long)btrfs_header_bytenr(c),
191 	       btrfs_header_level(c), nr,
192 	       (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr);
193 	for (i = 0; i < nr; i++) {
194 		btrfs_node_key_to_cpu(c, &key, i);
195 		printk(KERN_INFO "\tkey %d (%llu %u %llu) block %llu\n",
196 		       i,
197 		       (unsigned long long)key.objectid,
198 		       key.type,
199 		       (unsigned long long)key.offset,
200 		       (unsigned long long)btrfs_node_blockptr(c, i));
201 	}
202 	for (i = 0; i < nr; i++) {
203 		struct extent_buffer *next = read_tree_block(root,
204 					btrfs_node_blockptr(c, i),
205 					btrfs_level_size(root, level - 1),
206 					btrfs_node_ptr_generation(c, i));
207 		if (btrfs_is_leaf(next) &&
208 		    btrfs_header_level(c) != 1)
209 			BUG();
210 		if (btrfs_header_level(next) !=
211 			btrfs_header_level(c) - 1)
212 			BUG();
213 		btrfs_print_tree(root, next);
214 		free_extent_buffer(next);
215 	}
216 }
217