Blame view
fs/btrfs/print-tree.c
10.8 KB
6cbd55707 Btrfs: add GPLv2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* * Copyright (C) 2007 Oracle. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License v2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. */ |
5de08d7d5 Btrfs: Break up c... |
18 19 |
#include "ctree.h" #include "disk-io.h" |
35b7e4761 Btrfs: fix page c... |
20 |
#include "print-tree.h" |
5de08d7d5 Btrfs: Break up c... |
21 |
|
0b86a832a Btrfs: Add suppor... |
22 23 24 25 |
static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) { int num_stripes = btrfs_chunk_num_stripes(eb, chunk); int i; |
d397712bc Btrfs: Fix checkp... |
26 27 28 |
printk(KERN_INFO "\t\tchunk length %llu owner %llu type %llu " "num_stripes %d ", |
e17cade25 Btrfs: Add chunk ... |
29 |
(unsigned long long)btrfs_chunk_length(eb, chunk), |
0b86a832a Btrfs: Add suppor... |
30 31 32 33 |
(unsigned long long)btrfs_chunk_owner(eb, chunk), (unsigned long long)btrfs_chunk_type(eb, chunk), num_stripes); for (i = 0 ; i < num_stripes ; i++) { |
d397712bc Btrfs: Fix checkp... |
34 35 |
printk(KERN_INFO "\t\t\tstripe %d devid %llu offset %llu ", i, |
0b86a832a Btrfs: Add suppor... |
36 37 38 39 40 41 42 |
(unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i), (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); } } static void print_dev_item(struct extent_buffer *eb, struct btrfs_dev_item *dev_item) { |
d397712bc Btrfs: Fix checkp... |
43 44 45 |
printk(KERN_INFO "\t\tdev item devid %llu " "total_bytes %llu bytes used %llu ", |
0b86a832a Btrfs: Add suppor... |
46 47 48 |
(unsigned long long)btrfs_device_id(eb, dev_item), (unsigned long long)btrfs_device_total_bytes(eb, dev_item), (unsigned long long)btrfs_device_bytes_used(eb, dev_item)); |
0b86a832a Btrfs: Add suppor... |
49 |
} |
5d4f98a28 Btrfs: Mixed back... |
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
static void print_extent_data_ref(struct extent_buffer *eb, struct btrfs_extent_data_ref *ref) { printk(KERN_INFO "\t\textent data backref root %llu " "objectid %llu offset %llu count %u ", (unsigned long long)btrfs_extent_data_ref_root(eb, ref), (unsigned long long)btrfs_extent_data_ref_objectid(eb, ref), (unsigned long long)btrfs_extent_data_ref_offset(eb, ref), btrfs_extent_data_ref_count(eb, ref)); } static void print_extent_item(struct extent_buffer *eb, int slot) { struct btrfs_extent_item *ei; struct btrfs_extent_inline_ref *iref; struct btrfs_extent_data_ref *dref; struct btrfs_shared_data_ref *sref; struct btrfs_disk_key key; unsigned long end; unsigned long ptr; int type; u32 item_size = btrfs_item_size_nr(eb, slot); u64 flags; u64 offset; if (item_size < sizeof(*ei)) { #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 struct btrfs_extent_item_v0 *ei0; BUG_ON(item_size != sizeof(*ei0)); ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0); printk(KERN_INFO "\t\textent refs %u ", btrfs_extent_refs_v0(eb, ei0)); return; #else BUG(); #endif } ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item); flags = btrfs_extent_flags(eb, ei); printk(KERN_INFO "\t\textent refs %llu gen %llu flags %llu ", (unsigned long long)btrfs_extent_refs(eb, ei), (unsigned long long)btrfs_extent_generation(eb, ei), (unsigned long long)flags); if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { struct btrfs_tree_block_info *info; info = (struct btrfs_tree_block_info *)(ei + 1); btrfs_tree_block_key(eb, info, &key); printk(KERN_INFO "\t\ttree block key (%llu %x %llu) " "level %d ", (unsigned long long)btrfs_disk_key_objectid(&key), key.type, (unsigned long long)btrfs_disk_key_offset(&key), btrfs_tree_block_level(eb, info)); iref = (struct btrfs_extent_inline_ref *)(info + 1); } else { iref = (struct btrfs_extent_inline_ref *)(ei + 1); } ptr = (unsigned long)iref; end = (unsigned long)ei + item_size; while (ptr < end) { iref = (struct btrfs_extent_inline_ref *)ptr; type = btrfs_extent_inline_ref_type(eb, iref); offset = btrfs_extent_inline_ref_offset(eb, iref); switch (type) { case BTRFS_TREE_BLOCK_REF_KEY: printk(KERN_INFO "\t\ttree block backref " "root %llu ", (unsigned long long)offset); break; case BTRFS_SHARED_BLOCK_REF_KEY: printk(KERN_INFO "\t\tshared block backref " "parent %llu ", (unsigned long long)offset); break; case BTRFS_EXTENT_DATA_REF_KEY: dref = (struct btrfs_extent_data_ref *)(&iref->offset); print_extent_data_ref(eb, dref); break; case BTRFS_SHARED_DATA_REF_KEY: sref = (struct btrfs_shared_data_ref *)(iref + 1); printk(KERN_INFO "\t\tshared data backref " "parent %llu count %u ", (unsigned long long)offset, btrfs_shared_data_ref_count(eb, sref)); break; default: BUG(); } ptr += btrfs_extent_inline_ref_size(type); } WARN_ON(ptr > end); } #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 static void print_extent_ref_v0(struct extent_buffer *eb, int slot) { struct btrfs_extent_ref_v0 *ref0; ref0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_ref_v0); printk("\t\textent back ref root %llu gen %llu " "owner %llu num_refs %lu ", (unsigned long long)btrfs_ref_root_v0(eb, ref0), (unsigned long long)btrfs_ref_generation_v0(eb, ref0), (unsigned long long)btrfs_ref_objectid_v0(eb, ref0), (unsigned long)btrfs_ref_count_v0(eb, ref0)); } #endif |
5f39d397d Btrfs: Create ext... |
167 |
void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) |
5de08d7d5 Btrfs: Break up c... |
168 169 |
{ int i; |
068132bad btrfs: fix oops o... |
170 |
u32 type, nr; |
0783fcfc4 Btrfs: struct ite... |
171 |
struct btrfs_item *item; |
3768f3689 Btrfs: Change the... |
172 |
struct btrfs_root_item *ri; |
1d4f6404d Btrfs: directory ... |
173 |
struct btrfs_dir_item *di; |
293ffd5fd Btrfs: change dir... |
174 |
struct btrfs_inode_item *ii; |
9078a3e1e Btrfs: start of b... |
175 |
struct btrfs_block_group_item *bi; |
8c2383c3d Subject: Rework b... |
176 |
struct btrfs_file_extent_item *fi; |
5d4f98a28 Btrfs: Mixed back... |
177 178 179 |
struct btrfs_extent_data_ref *dref; struct btrfs_shared_data_ref *sref; struct btrfs_dev_extent *dev_extent; |
5f39d397d Btrfs: Create ext... |
180 181 |
struct btrfs_key key; struct btrfs_key found_key; |
1d4f6404d Btrfs: directory ... |
182 |
|
068132bad btrfs: fix oops o... |
183 184 185 186 |
if (!l) return; nr = btrfs_header_nritems(l); |
d397712bc Btrfs: Fix checkp... |
187 188 |
printk(KERN_INFO "leaf %llu total ptrs %d free space %d ", |
db94535db Btrfs: Allow tree... |
189 |
(unsigned long long)btrfs_header_bytenr(l), nr, |
123abc88c Btrfs: variable b... |
190 |
btrfs_leaf_free_space(root, l)); |
5de08d7d5 Btrfs: Break up c... |
191 |
for (i = 0 ; i < nr ; i++) { |
5f39d397d Btrfs: Create ext... |
192 193 194 |
item = btrfs_item_nr(l, i); btrfs_item_key_to_cpu(l, &key, i); type = btrfs_key_type(&key); |
d397712bc Btrfs: Fix checkp... |
195 196 197 |
printk(KERN_INFO "\titem %d key (%llu %x %llu) itemoff %d " "itemsize %d ", |
5de08d7d5 Btrfs: Break up c... |
198 |
i, |
5f39d397d Btrfs: Create ext... |
199 200 201 |
(unsigned long long)key.objectid, type, (unsigned long long)key.offset, btrfs_item_offset(l, item), btrfs_item_size(l, item)); |
62e2749e0 Btrfs: Use a chun... |
202 203 |
switch (type) { case BTRFS_INODE_ITEM_KEY: |
293ffd5fd Btrfs: change dir... |
204 |
ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); |
d397712bc Btrfs: Fix checkp... |
205 206 207 208 209 |
printk(KERN_INFO "\t\tinode generation %llu size %llu " "mode %o ", (unsigned long long) btrfs_inode_generation(l, ii), |
5f39d397d Btrfs: Create ext... |
210 211 |
(unsigned long long)btrfs_inode_size(l, ii), btrfs_inode_mode(l, ii)); |
62e2749e0 Btrfs: Use a chun... |
212 213 |
break; case BTRFS_DIR_ITEM_KEY: |
1d4f6404d Btrfs: directory ... |
214 |
di = btrfs_item_ptr(l, i, struct btrfs_dir_item); |
5f39d397d Btrfs: Create ext... |
215 |
btrfs_dir_item_key_to_cpu(l, di, &found_key); |
d397712bc Btrfs: Fix checkp... |
216 217 |
printk(KERN_INFO "\t\tdir oid %llu type %u ", |
5f39d397d Btrfs: Create ext... |
218 |
(unsigned long long)found_key.objectid, |
5f39d397d Btrfs: Create ext... |
219 |
btrfs_dir_type(l, di)); |
62e2749e0 Btrfs: Use a chun... |
220 221 222 |
break; case BTRFS_ROOT_ITEM_KEY: ri = btrfs_item_ptr(l, i, struct btrfs_root_item); |
d397712bc Btrfs: Fix checkp... |
223 224 225 226 |
printk(KERN_INFO "\t\troot data bytenr %llu refs %u ", (unsigned long long) btrfs_disk_root_bytenr(l, ri), |
5f39d397d Btrfs: Create ext... |
227 |
btrfs_disk_root_refs(l, ri)); |
62e2749e0 Btrfs: Use a chun... |
228 229 |
break; case BTRFS_EXTENT_ITEM_KEY: |
5d4f98a28 Btrfs: Mixed back... |
230 |
print_extent_item(l, i); |
62e2749e0 Btrfs: Use a chun... |
231 |
break; |
5d4f98a28 Btrfs: Mixed back... |
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
case BTRFS_TREE_BLOCK_REF_KEY: printk(KERN_INFO "\t\ttree block backref "); break; case BTRFS_SHARED_BLOCK_REF_KEY: printk(KERN_INFO "\t\tshared block backref "); break; case BTRFS_EXTENT_DATA_REF_KEY: dref = btrfs_item_ptr(l, i, struct btrfs_extent_data_ref); print_extent_data_ref(l, dref); break; case BTRFS_SHARED_DATA_REF_KEY: sref = btrfs_item_ptr(l, i, struct btrfs_shared_data_ref); printk(KERN_INFO "\t\tshared data backref count %u ", btrfs_shared_data_ref_count(l, sref)); |
7bb86316c Btrfs: Add back p... |
251 |
break; |
8c2383c3d Subject: Rework b... |
252 253 254 |
case BTRFS_EXTENT_DATA_KEY: fi = btrfs_item_ptr(l, i, struct btrfs_file_extent_item); |
5f39d397d Btrfs: Create ext... |
255 |
if (btrfs_file_extent_type(l, fi) == |
8c2383c3d Subject: Rework b... |
256 |
BTRFS_FILE_EXTENT_INLINE) { |
d397712bc Btrfs: Fix checkp... |
257 258 259 260 |
printk(KERN_INFO "\t\tinline extent data " "size %u ", btrfs_file_extent_inline_len(l, fi)); |
8c2383c3d Subject: Rework b... |
261 262 |
break; } |
d397712bc Btrfs: Fix checkp... |
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
printk(KERN_INFO "\t\textent data disk bytenr %llu " "nr %llu ", (unsigned long long) btrfs_file_extent_disk_bytenr(l, fi), (unsigned long long) btrfs_file_extent_disk_num_bytes(l, fi)); printk(KERN_INFO "\t\textent data offset %llu " "nr %llu ram %llu ", (unsigned long long) btrfs_file_extent_offset(l, fi), (unsigned long long) btrfs_file_extent_num_bytes(l, fi), (unsigned long long) btrfs_file_extent_ram_bytes(l, fi)); |
8c2383c3d Subject: Rework b... |
279 |
break; |
5d4f98a28 Btrfs: Mixed back... |
280 281 282 283 284 285 |
case BTRFS_EXTENT_REF_V0_KEY: #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 print_extent_ref_v0(l, i); #else BUG(); #endif |
333e81054 btrfs: fix missin... |
286 |
break; |
9078a3e1e Btrfs: start of b... |
287 288 289 |
case BTRFS_BLOCK_GROUP_ITEM_KEY: bi = btrfs_item_ptr(l, i, struct btrfs_block_group_item); |
d397712bc Btrfs: Fix checkp... |
290 291 292 293 |
printk(KERN_INFO "\t\tblock group used %llu ", (unsigned long long) btrfs_disk_block_group_used(l, bi)); |
62e2749e0 Btrfs: Use a chun... |
294 |
break; |
0b86a832a Btrfs: Add suppor... |
295 |
case BTRFS_CHUNK_ITEM_KEY: |
d397712bc Btrfs: Fix checkp... |
296 297 |
print_chunk(l, btrfs_item_ptr(l, i, struct btrfs_chunk)); |
0b86a832a Btrfs: Add suppor... |
298 299 300 301 302 303 304 305 |
break; case BTRFS_DEV_ITEM_KEY: print_dev_item(l, btrfs_item_ptr(l, i, struct btrfs_dev_item)); break; case BTRFS_DEV_EXTENT_KEY: dev_extent = btrfs_item_ptr(l, i, struct btrfs_dev_extent); |
d397712bc Btrfs: Fix checkp... |
306 307 |
printk(KERN_INFO "\t\tdev extent chunk_tree %llu " |
e17cade25 Btrfs: Add chunk ... |
308 309 310 311 312 313 314 315 316 317 318 |
"\t\tchunk objectid %llu chunk offset %llu " "length %llu ", (unsigned long long) btrfs_dev_extent_chunk_tree(l, dev_extent), (unsigned long long) btrfs_dev_extent_chunk_objectid(l, dev_extent), (unsigned long long) btrfs_dev_extent_chunk_offset(l, dev_extent), (unsigned long long) btrfs_dev_extent_length(l, dev_extent)); |
62e2749e0 Btrfs: Use a chun... |
319 |
}; |
5de08d7d5 Btrfs: Break up c... |
320 321 |
} } |
e20d96d64 Mountable btrfs, ... |
322 |
|
5f39d397d Btrfs: Create ext... |
323 |
void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *c) |
5de08d7d5 Btrfs: Break up c... |
324 |
{ |
e17cade25 Btrfs: Add chunk ... |
325 |
int i; u32 nr; |
5f39d397d Btrfs: Create ext... |
326 |
struct btrfs_key key; |
db94535db Btrfs: Allow tree... |
327 |
int level; |
5de08d7d5 Btrfs: Break up c... |
328 |
|
5f39d397d Btrfs: Create ext... |
329 |
if (!c) |
5de08d7d5 Btrfs: Break up c... |
330 |
return; |
5f39d397d Btrfs: Create ext... |
331 |
nr = btrfs_header_nritems(c); |
db94535db Btrfs: Allow tree... |
332 333 |
level = btrfs_header_level(c); if (level == 0) { |
5f39d397d Btrfs: Create ext... |
334 |
btrfs_print_leaf(root, c); |
5de08d7d5 Btrfs: Break up c... |
335 336 |
return; } |
d397712bc Btrfs: Fix checkp... |
337 338 |
printk(KERN_INFO "node %llu level %d total ptrs %d free spc %u ", |
db94535db Btrfs: Allow tree... |
339 |
(unsigned long long)btrfs_header_bytenr(c), |
c271b4924 Btrfs: remove of ... |
340 |
level, nr, |
e20d96d64 Mountable btrfs, ... |
341 |
(u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr); |
5de08d7d5 Btrfs: Break up c... |
342 |
for (i = 0; i < nr; i++) { |
5f39d397d Btrfs: Create ext... |
343 |
btrfs_node_key_to_cpu(c, &key, i); |
d397712bc Btrfs: Fix checkp... |
344 345 |
printk(KERN_INFO "\tkey %d (%llu %u %llu) block %llu ", |
5de08d7d5 Btrfs: Break up c... |
346 |
i, |
5f39d397d Btrfs: Create ext... |
347 348 349 |
(unsigned long long)key.objectid, key.type, (unsigned long long)key.offset, |
5af3981c1 Btrfs: printk fixes |
350 |
(unsigned long long)btrfs_node_blockptr(c, i)); |
5de08d7d5 Btrfs: Break up c... |
351 352 |
} for (i = 0; i < nr; i++) { |
5f39d397d Btrfs: Create ext... |
353 |
struct extent_buffer *next = read_tree_block(root, |
db94535db Btrfs: Allow tree... |
354 |
btrfs_node_blockptr(c, i), |
ca7a79ad8 Btrfs: Pass down ... |
355 356 |
btrfs_level_size(root, level - 1), btrfs_node_ptr_generation(c, i)); |
7518a238e Btrfs: get/set fo... |
357 |
if (btrfs_is_leaf(next) && |
c271b4924 Btrfs: remove of ... |
358 |
level != 1) |
5de08d7d5 Btrfs: Break up c... |
359 |
BUG(); |
5f39d397d Btrfs: Create ext... |
360 |
if (btrfs_header_level(next) != |
c271b4924 Btrfs: remove of ... |
361 |
level - 1) |
5de08d7d5 Btrfs: Break up c... |
362 |
BUG(); |
5f39d397d Btrfs: Create ext... |
363 364 |
btrfs_print_tree(root, next); free_extent_buffer(next); |
5de08d7d5 Btrfs: Break up c... |
365 |
} |
5de08d7d5 Btrfs: Break up c... |
366 |
} |