Blame view
fs/btrfs/print-tree.c
12.4 KB
c1d7c514f btrfs: replace GP... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
6cbd55707 Btrfs: add GPLv2 |
2 3 |
/* * Copyright (C) 2007 Oracle. All rights reserved. |
6cbd55707 Btrfs: add GPLv2 |
4 |
*/ |
5de08d7d5 Btrfs: Break up c... |
5 6 |
#include "ctree.h" #include "disk-io.h" |
35b7e4761 Btrfs: fix page c... |
7 |
#include "print-tree.h" |
5de08d7d5 Btrfs: Break up c... |
8 |
|
457f1864b btrfs: pretty pri... |
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
struct root_name_map { u64 id; char name[16]; }; static const struct root_name_map root_map[] = { { BTRFS_ROOT_TREE_OBJECTID, "ROOT_TREE" }, { BTRFS_EXTENT_TREE_OBJECTID, "EXTENT_TREE" }, { BTRFS_CHUNK_TREE_OBJECTID, "CHUNK_TREE" }, { BTRFS_DEV_TREE_OBJECTID, "DEV_TREE" }, { BTRFS_FS_TREE_OBJECTID, "FS_TREE" }, { BTRFS_CSUM_TREE_OBJECTID, "CSUM_TREE" }, { BTRFS_TREE_LOG_OBJECTID, "TREE_LOG" }, { BTRFS_QUOTA_TREE_OBJECTID, "QUOTA_TREE" }, { BTRFS_UUID_TREE_OBJECTID, "UUID_TREE" }, { BTRFS_FREE_SPACE_TREE_OBJECTID, "FREE_SPACE_TREE" }, { BTRFS_DATA_RELOC_TREE_OBJECTID, "DATA_RELOC_TREE" }, }; const char *btrfs_root_name(u64 objectid, char *buf) { int i; if (objectid == BTRFS_TREE_RELOC_OBJECTID) { snprintf(buf, BTRFS_ROOT_NAME_BUF_LEN, "TREE_RELOC offset=%llu", objectid); return buf; } for (i = 0; i < ARRAY_SIZE(root_map); i++) { if (root_map[i].id == objectid) return root_map[i].name; } snprintf(buf, BTRFS_ROOT_NAME_BUF_LEN, "%llu", objectid); return buf; } |
0b86a832a Btrfs: Add suppor... |
46 47 48 49 |
static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) { int num_stripes = btrfs_chunk_num_stripes(eb, chunk); int i; |
62e855771 btrfs: convert pr... |
50 51 |
pr_info("\t\tchunk length %llu owner %llu type %llu num_stripes %d ", |
c1c9ff7c9 Btrfs: Remove sup... |
52 53 |
btrfs_chunk_length(eb, chunk), btrfs_chunk_owner(eb, chunk), btrfs_chunk_type(eb, chunk), num_stripes); |
0b86a832a Btrfs: Add suppor... |
54 |
for (i = 0 ; i < num_stripes ; i++) { |
62e855771 btrfs: convert pr... |
55 56 |
pr_info("\t\t\tstripe %d devid %llu offset %llu ", i, |
c1c9ff7c9 Btrfs: Remove sup... |
57 58 |
btrfs_stripe_devid_nr(eb, chunk, i), btrfs_stripe_offset_nr(eb, chunk, i)); |
0b86a832a Btrfs: Add suppor... |
59 60 61 62 63 |
} } static void print_dev_item(struct extent_buffer *eb, struct btrfs_dev_item *dev_item) { |
62e855771 btrfs: convert pr... |
64 65 |
pr_info("\t\tdev item devid %llu total_bytes %llu bytes used %llu ", |
c1c9ff7c9 Btrfs: Remove sup... |
66 67 68 |
btrfs_device_id(eb, dev_item), btrfs_device_total_bytes(eb, dev_item), btrfs_device_bytes_used(eb, dev_item)); |
0b86a832a Btrfs: Add suppor... |
69 |
} |
5d4f98a28 Btrfs: Mixed back... |
70 71 72 |
static void print_extent_data_ref(struct extent_buffer *eb, struct btrfs_extent_data_ref *ref) { |
64ecdb647 Btrfs: add one mo... |
73 74 |
pr_cont("extent data backref root %llu objectid %llu offset %llu count %u ", |
c1c9ff7c9 Btrfs: Remove sup... |
75 76 77 |
btrfs_extent_data_ref_root(eb, ref), btrfs_extent_data_ref_objectid(eb, ref), btrfs_extent_data_ref_offset(eb, ref), |
5d4f98a28 Btrfs: Mixed back... |
78 79 |
btrfs_extent_data_ref_count(eb, ref)); } |
be2c765df Btrfs: fix btrfs_... |
80 |
static void print_extent_item(struct extent_buffer *eb, int slot, int type) |
5d4f98a28 Btrfs: Mixed back... |
81 82 83 84 85 86 87 88 |
{ 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; |
5d4f98a28 Btrfs: Mixed back... |
89 90 91 |
u32 item_size = btrfs_item_size_nr(eb, slot); u64 flags; u64 offset; |
64ecdb647 Btrfs: add one mo... |
92 |
int ref_index = 0; |
5d4f98a28 Btrfs: Mixed back... |
93 |
|
6d8ff4e45 btrfs: annotate u... |
94 |
if (unlikely(item_size < sizeof(*ei))) { |
ba3c2b196 btrfs: Add gracef... |
95 96 97 |
btrfs_print_v0_err(eb->fs_info); btrfs_handle_fs_error(eb->fs_info, -EINVAL, NULL); } |
5d4f98a28 Btrfs: Mixed back... |
98 99 100 |
ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item); flags = btrfs_extent_flags(eb, ei); |
62e855771 btrfs: convert pr... |
101 102 |
pr_info("\t\textent refs %llu gen %llu flags %llu ", |
c1c9ff7c9 Btrfs: Remove sup... |
103 104 |
btrfs_extent_refs(eb, ei), btrfs_extent_generation(eb, ei), flags); |
5d4f98a28 Btrfs: Mixed back... |
105 |
|
be2c765df Btrfs: fix btrfs_... |
106 107 |
if ((type == BTRFS_EXTENT_ITEM_KEY) && flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { |
5d4f98a28 Btrfs: Mixed back... |
108 109 110 |
struct btrfs_tree_block_info *info; info = (struct btrfs_tree_block_info *)(ei + 1); btrfs_tree_block_key(eb, info, &key); |
62e855771 btrfs: convert pr... |
111 112 |
pr_info("\t\ttree block key (%llu %u %llu) level %d ", |
c1c9ff7c9 Btrfs: Remove sup... |
113 114 |
btrfs_disk_key_objectid(&key), key.type, btrfs_disk_key_offset(&key), |
5d4f98a28 Btrfs: Mixed back... |
115 116 117 118 119 120 121 122 123 124 125 126 |
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); |
64ecdb647 Btrfs: add one mo... |
127 |
pr_info("\t\tref#%d: ", ref_index++); |
5d4f98a28 Btrfs: Mixed back... |
128 129 |
switch (type) { case BTRFS_TREE_BLOCK_REF_KEY: |
64ecdb647 Btrfs: add one mo... |
130 131 |
pr_cont("tree block backref root %llu ", offset); |
5d4f98a28 Btrfs: Mixed back... |
132 133 |
break; case BTRFS_SHARED_BLOCK_REF_KEY: |
64ecdb647 Btrfs: add one mo... |
134 135 136 137 138 139 |
pr_cont("shared block backref parent %llu ", offset); /* * offset is supposed to be a tree block which * must be aligned to nodesize. */ |
ea57788eb btrfs: require on... |
140 141 142 143 144 |
if (!IS_ALIGNED(offset, eb->fs_info->sectorsize)) pr_info( "\t\t\t(parent %llu not aligned to sectorsize %u) ", offset, eb->fs_info->sectorsize); |
5d4f98a28 Btrfs: Mixed back... |
145 146 147 148 149 150 151 |
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); |
64ecdb647 Btrfs: add one mo... |
152 153 |
pr_cont("shared data backref parent %llu count %u ", |
c1c9ff7c9 Btrfs: Remove sup... |
154 |
offset, btrfs_shared_data_ref_count(eb, sref)); |
64ecdb647 Btrfs: add one mo... |
155 156 157 158 159 |
/* * offset is supposed to be a tree block which * must be aligned to nodesize. */ if (!IS_ALIGNED(offset, eb->fs_info->nodesize)) |
ea57788eb btrfs: require on... |
160 161 162 163 |
pr_info( "\t\t\t(parent %llu not aligned to sectorsize %u) ", offset, eb->fs_info->sectorsize); |
5d4f98a28 Btrfs: Mixed back... |
164 165 |
break; default: |
64ecdb647 Btrfs: add one mo... |
166 167 |
pr_cont("(extent %llu has INVALID ref type %d) ", |
07638ea59 Btrfs: remove BUG... |
168 169 |
eb->start, type); return; |
5d4f98a28 Btrfs: Mixed back... |
170 171 172 173 174 |
} ptr += btrfs_extent_inline_ref_size(type); } WARN_ON(ptr > end); } |
8f8ae8e21 Btrfs: support pr... |
175 176 177 178 |
static void print_uuid_item(struct extent_buffer *l, unsigned long offset, u32 item_size) { if (!IS_ALIGNED(item_size, sizeof(u64))) { |
efe120a06 Btrfs: convert pr... |
179 180 |
pr_warn("BTRFS: uuid item with illegal size %lu! ", |
8f8ae8e21 Btrfs: support pr... |
181 182 183 184 185 186 187 |
(unsigned long)item_size); return; } while (item_size) { __le64 subvol_id; read_extent_buffer(l, &subvol_id, offset, sizeof(subvol_id)); |
62e855771 btrfs: convert pr... |
188 189 |
pr_info("\t\tsubvol_id %llu ", |
8f8ae8e21 Btrfs: support pr... |
190 191 192 193 194 |
(unsigned long long)le64_to_cpu(subvol_id)); item_size -= sizeof(u64); offset += sizeof(u64); } } |
b54599369 btrfs: print-tree... |
195 196 197 198 199 200 201 202 203 |
/* * Helper to output refs and locking status of extent buffer. Useful to debug * race condition related problems. */ static void print_eb_refs_lock(struct extent_buffer *eb) { #ifdef CONFIG_BTRFS_DEBUG btrfs_info(eb->fs_info, "refs %u lock (w:%d r:%d bw:%d br:%d sw:%d sr:%d) lock_owner %u current %u", |
00801ae4b btrfs: switch ext... |
204 |
atomic_read(&eb->refs), eb->write_locks, |
b54599369 btrfs: print-tree... |
205 |
atomic_read(&eb->read_locks), |
06297d8ce btrfs: switch ext... |
206 |
eb->blocking_writers, |
b54599369 btrfs: print-tree... |
207 |
atomic_read(&eb->blocking_readers), |
f3dc24c52 btrfs: switch ext... |
208 |
eb->spinning_writers, |
b54599369 btrfs: print-tree... |
209 210 211 212 |
atomic_read(&eb->spinning_readers), eb->lock_owner, current->pid); #endif } |
a4f78750e btrfs: get fs_inf... |
213 |
void btrfs_print_leaf(struct extent_buffer *l) |
5de08d7d5 Btrfs: Break up c... |
214 |
{ |
a4f78750e btrfs: get fs_inf... |
215 |
struct btrfs_fs_info *fs_info; |
5de08d7d5 Btrfs: Break up c... |
216 |
int i; |
068132bad btrfs: fix oops o... |
217 |
u32 type, nr; |
0783fcfc4 Btrfs: struct ite... |
218 |
struct btrfs_item *item; |
3768f3689 Btrfs: Change the... |
219 |
struct btrfs_root_item *ri; |
1d4f6404d Btrfs: directory ... |
220 |
struct btrfs_dir_item *di; |
293ffd5fd Btrfs: change dir... |
221 |
struct btrfs_inode_item *ii; |
9078a3e1e Btrfs: start of b... |
222 |
struct btrfs_block_group_item *bi; |
8c2383c3d Subject: Rework b... |
223 |
struct btrfs_file_extent_item *fi; |
5d4f98a28 Btrfs: Mixed back... |
224 225 226 |
struct btrfs_extent_data_ref *dref; struct btrfs_shared_data_ref *sref; struct btrfs_dev_extent *dev_extent; |
5f39d397d Btrfs: Create ext... |
227 228 |
struct btrfs_key key; struct btrfs_key found_key; |
1d4f6404d Btrfs: directory ... |
229 |
|
068132bad btrfs: fix oops o... |
230 231 |
if (!l) return; |
a4f78750e btrfs: get fs_inf... |
232 |
fs_info = l->fs_info; |
068132bad btrfs: fix oops o... |
233 |
nr = btrfs_header_nritems(l); |
c08723237 btrfs: print-tree... |
234 235 236 |
btrfs_info(fs_info, "leaf %llu gen %llu total ptrs %d free space %d owner %llu", btrfs_header_bytenr(l), btrfs_header_generation(l), nr, |
e902baac6 btrfs: get fs_inf... |
237 |
btrfs_leaf_free_space(l), btrfs_header_owner(l)); |
b54599369 btrfs: print-tree... |
238 |
print_eb_refs_lock(l); |
5de08d7d5 Btrfs: Break up c... |
239 |
for (i = 0 ; i < nr ; i++) { |
dd3cc16b8 btrfs: drop unuse... |
240 |
item = btrfs_item_nr(i); |
5f39d397d Btrfs: Create ext... |
241 |
btrfs_item_key_to_cpu(l, &key, i); |
962a298f3 btrfs: kill the k... |
242 |
type = key.type; |
62e855771 btrfs: convert pr... |
243 244 |
pr_info("\titem %d key (%llu %u %llu) itemoff %d itemsize %d ", |
c1c9ff7c9 Btrfs: Remove sup... |
245 |
i, key.objectid, type, key.offset, |
5f39d397d Btrfs: Create ext... |
246 |
btrfs_item_offset(l, item), btrfs_item_size(l, item)); |
62e2749e0 Btrfs: Use a chun... |
247 248 |
switch (type) { case BTRFS_INODE_ITEM_KEY: |
293ffd5fd Btrfs: change dir... |
249 |
ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); |
62e855771 btrfs: convert pr... |
250 251 |
pr_info("\t\tinode generation %llu size %llu mode %o ", |
d397712bc Btrfs: Fix checkp... |
252 |
btrfs_inode_generation(l, ii), |
c1c9ff7c9 Btrfs: Remove sup... |
253 |
btrfs_inode_size(l, ii), |
5f39d397d Btrfs: Create ext... |
254 |
btrfs_inode_mode(l, ii)); |
62e2749e0 Btrfs: Use a chun... |
255 256 |
break; case BTRFS_DIR_ITEM_KEY: |
1d4f6404d Btrfs: directory ... |
257 |
di = btrfs_item_ptr(l, i, struct btrfs_dir_item); |
5f39d397d Btrfs: Create ext... |
258 |
btrfs_dir_item_key_to_cpu(l, di, &found_key); |
62e855771 btrfs: convert pr... |
259 260 |
pr_info("\t\tdir oid %llu type %u ", |
c1c9ff7c9 Btrfs: Remove sup... |
261 |
found_key.objectid, |
5f39d397d Btrfs: Create ext... |
262 |
btrfs_dir_type(l, di)); |
62e2749e0 Btrfs: Use a chun... |
263 264 265 |
break; case BTRFS_ROOT_ITEM_KEY: ri = btrfs_item_ptr(l, i, struct btrfs_root_item); |
62e855771 btrfs: convert pr... |
266 267 |
pr_info("\t\troot data bytenr %llu refs %u ", |
d397712bc Btrfs: Fix checkp... |
268 |
btrfs_disk_root_bytenr(l, ri), |
5f39d397d Btrfs: Create ext... |
269 |
btrfs_disk_root_refs(l, ri)); |
62e2749e0 Btrfs: Use a chun... |
270 271 |
break; case BTRFS_EXTENT_ITEM_KEY: |
be2c765df Btrfs: fix btrfs_... |
272 273 |
case BTRFS_METADATA_ITEM_KEY: print_extent_item(l, i, type); |
62e2749e0 Btrfs: Use a chun... |
274 |
break; |
5d4f98a28 Btrfs: Mixed back... |
275 |
case BTRFS_TREE_BLOCK_REF_KEY: |
62e855771 btrfs: convert pr... |
276 277 |
pr_info("\t\ttree block backref "); |
5d4f98a28 Btrfs: Mixed back... |
278 279 |
break; case BTRFS_SHARED_BLOCK_REF_KEY: |
62e855771 btrfs: convert pr... |
280 281 |
pr_info("\t\tshared block backref "); |
5d4f98a28 Btrfs: Mixed back... |
282 283 284 285 286 287 288 289 290 |
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); |
62e855771 btrfs: convert pr... |
291 292 |
pr_info("\t\tshared data backref count %u ", |
5d4f98a28 Btrfs: Mixed back... |
293 |
btrfs_shared_data_ref_count(l, sref)); |
7bb86316c Btrfs: Add back p... |
294 |
break; |
8c2383c3d Subject: Rework b... |
295 296 297 |
case BTRFS_EXTENT_DATA_KEY: fi = btrfs_item_ptr(l, i, struct btrfs_file_extent_item); |
5f39d397d Btrfs: Create ext... |
298 |
if (btrfs_file_extent_type(l, fi) == |
8c2383c3d Subject: Rework b... |
299 |
BTRFS_FILE_EXTENT_INLINE) { |
e41ca5897 btrfs: Get rid of... |
300 301 302 |
pr_info("\t\tinline extent data size %llu ", btrfs_file_extent_ram_bytes(l, fi)); |
8c2383c3d Subject: Rework b... |
303 304 |
break; } |
62e855771 btrfs: convert pr... |
305 306 |
pr_info("\t\textent data disk bytenr %llu nr %llu ", |
d397712bc Btrfs: Fix checkp... |
307 |
btrfs_file_extent_disk_bytenr(l, fi), |
d397712bc Btrfs: Fix checkp... |
308 |
btrfs_file_extent_disk_num_bytes(l, fi)); |
62e855771 btrfs: convert pr... |
309 310 |
pr_info("\t\textent data offset %llu nr %llu ram %llu ", |
d397712bc Btrfs: Fix checkp... |
311 |
btrfs_file_extent_offset(l, fi), |
d397712bc Btrfs: Fix checkp... |
312 |
btrfs_file_extent_num_bytes(l, fi), |
d397712bc Btrfs: Fix checkp... |
313 |
btrfs_file_extent_ram_bytes(l, fi)); |
8c2383c3d Subject: Rework b... |
314 |
break; |
5d4f98a28 Btrfs: Mixed back... |
315 |
case BTRFS_EXTENT_REF_V0_KEY: |
ba3c2b196 btrfs: Add gracef... |
316 317 |
btrfs_print_v0_err(fs_info); btrfs_handle_fs_error(fs_info, -EINVAL, NULL); |
333e81054 btrfs: fix missin... |
318 |
break; |
9078a3e1e Btrfs: start of b... |
319 320 321 |
case BTRFS_BLOCK_GROUP_ITEM_KEY: bi = btrfs_item_ptr(l, i, struct btrfs_block_group_item); |
555ba411a Btrfs: let btrfs_... |
322 323 324 |
pr_info( "\t\tblock group used %llu chunk_objectid %llu flags %llu ", |
0222dfdd4 btrfs: rename ext... |
325 326 327 |
btrfs_block_group_used(l, bi), btrfs_block_group_chunk_objectid(l, bi), btrfs_block_group_flags(l, bi)); |
62e2749e0 Btrfs: Use a chun... |
328 |
break; |
0b86a832a Btrfs: Add suppor... |
329 |
case BTRFS_CHUNK_ITEM_KEY: |
d397712bc Btrfs: Fix checkp... |
330 331 |
print_chunk(l, btrfs_item_ptr(l, i, struct btrfs_chunk)); |
0b86a832a Btrfs: Add suppor... |
332 333 334 335 336 337 338 339 |
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); |
62e855771 btrfs: convert pr... |
340 341 342 |
pr_info("\t\tdev extent chunk_tree %llu \t\tchunk objectid %llu chunk offset %llu length %llu ", |
e17cade25 Btrfs: Add chunk ... |
343 |
btrfs_dev_extent_chunk_tree(l, dev_extent), |
e17cade25 Btrfs: Add chunk ... |
344 |
btrfs_dev_extent_chunk_objectid(l, dev_extent), |
e17cade25 Btrfs: Add chunk ... |
345 |
btrfs_dev_extent_chunk_offset(l, dev_extent), |
e17cade25 Btrfs: Add chunk ... |
346 |
btrfs_dev_extent_length(l, dev_extent)); |
0e6360274 btrfs: add missin... |
347 |
break; |
585a3d0d2 btrfs: teach prin... |
348 |
case BTRFS_PERSISTENT_ITEM_KEY: |
62e855771 btrfs: convert pr... |
349 350 |
pr_info("\t\tpersistent item objectid %llu offset %llu ", |
585a3d0d2 btrfs: teach prin... |
351 352 353 |
key.objectid, key.offset); switch (key.objectid) { case BTRFS_DEV_STATS_OBJECTID: |
62e855771 btrfs: convert pr... |
354 355 |
pr_info("\t\tdevice stats "); |
585a3d0d2 btrfs: teach prin... |
356 357 |
break; default: |
62e855771 btrfs: convert pr... |
358 359 |
pr_info("\t\tunknown persistent item "); |
585a3d0d2 btrfs: teach prin... |
360 |
} |
733f4fbbc Btrfs: read devic... |
361 |
break; |
9f07e1d76 btrfs: teach prin... |
362 |
case BTRFS_TEMPORARY_ITEM_KEY: |
62e855771 btrfs: convert pr... |
363 364 |
pr_info("\t\ttemporary item objectid %llu offset %llu ", |
9f07e1d76 btrfs: teach prin... |
365 366 367 |
key.objectid, key.offset); switch (key.objectid) { case BTRFS_BALANCE_OBJECTID: |
62e855771 btrfs: convert pr... |
368 369 |
pr_info("\t\tbalance status "); |
9f07e1d76 btrfs: teach prin... |
370 371 |
break; default: |
62e855771 btrfs: convert pr... |
372 373 |
pr_info("\t\tunknown temporary item "); |
9f07e1d76 btrfs: teach prin... |
374 375 |
} break; |
a2bff6402 Btrfs: introduce ... |
376 |
case BTRFS_DEV_REPLACE_KEY: |
62e855771 btrfs: convert pr... |
377 378 |
pr_info("\t\tdev replace "); |
a2bff6402 Btrfs: introduce ... |
379 |
break; |
8f8ae8e21 Btrfs: support pr... |
380 381 382 383 384 |
case BTRFS_UUID_KEY_SUBVOL: case BTRFS_UUID_KEY_RECEIVED_SUBVOL: print_uuid_item(l, btrfs_item_ptr_offset(l, i), btrfs_item_size_nr(l, i)); break; |
0ab575c5d btrfs: Remove unn... |
385 |
} |
5de08d7d5 Btrfs: Break up c... |
386 387 |
} } |
e20d96d64 Mountable btrfs, ... |
388 |
|
c08723237 btrfs: print-tree... |
389 |
void btrfs_print_tree(struct extent_buffer *c, bool follow) |
5de08d7d5 Btrfs: Break up c... |
390 |
{ |
abe60ba45 btrfs: get fs_inf... |
391 |
struct btrfs_fs_info *fs_info; |
e17cade25 Btrfs: Add chunk ... |
392 |
int i; u32 nr; |
5f39d397d Btrfs: Create ext... |
393 |
struct btrfs_key key; |
db94535db Btrfs: Allow tree... |
394 |
int level; |
5de08d7d5 Btrfs: Break up c... |
395 |
|
5f39d397d Btrfs: Create ext... |
396 |
if (!c) |
5de08d7d5 Btrfs: Break up c... |
397 |
return; |
abe60ba45 btrfs: get fs_inf... |
398 |
fs_info = c->fs_info; |
5f39d397d Btrfs: Create ext... |
399 |
nr = btrfs_header_nritems(c); |
db94535db Btrfs: Allow tree... |
400 401 |
level = btrfs_header_level(c); if (level == 0) { |
a4f78750e btrfs: get fs_inf... |
402 |
btrfs_print_leaf(c); |
5de08d7d5 Btrfs: Break up c... |
403 404 |
return; } |
0b246afa6 btrfs: root->fs_i... |
405 |
btrfs_info(fs_info, |
c08723237 btrfs: print-tree... |
406 407 408 409 |
"node %llu level %d gen %llu total ptrs %d free spc %u owner %llu", btrfs_header_bytenr(c), level, btrfs_header_generation(c), nr, (u32)BTRFS_NODEPTRS_PER_BLOCK(fs_info) - nr, btrfs_header_owner(c)); |
b54599369 btrfs: print-tree... |
410 |
print_eb_refs_lock(c); |
5de08d7d5 Btrfs: Break up c... |
411 |
for (i = 0; i < nr; i++) { |
5f39d397d Btrfs: Create ext... |
412 |
btrfs_node_key_to_cpu(c, &key, i); |
c08723237 btrfs: print-tree... |
413 414 |
pr_info("\tkey %d (%llu %u %llu) block %llu gen %llu ", |
c1c9ff7c9 Btrfs: Remove sup... |
415 |
i, key.objectid, key.type, key.offset, |
c08723237 btrfs: print-tree... |
416 417 |
btrfs_node_blockptr(c, i), btrfs_node_ptr_generation(c, i)); |
5de08d7d5 Btrfs: Break up c... |
418 |
} |
c08723237 btrfs: print-tree... |
419 420 |
if (!follow) return; |
5de08d7d5 Btrfs: Break up c... |
421 |
for (i = 0; i < nr; i++) { |
581c17604 btrfs: Validate c... |
422 423 424 425 426 427 428 |
struct btrfs_key first_key; struct extent_buffer *next; btrfs_node_key_to_cpu(c, &first_key, i); next = read_tree_block(fs_info, btrfs_node_blockptr(c, i), btrfs_node_ptr_generation(c, i), level - 1, &first_key); |
a42cbec9c Btrfs: add error ... |
429 430 431 432 433 434 |
if (IS_ERR(next)) { continue; } else if (!extent_buffer_uptodate(next)) { free_extent_buffer(next); continue; } |
7518a238e Btrfs: get/set fo... |
435 |
if (btrfs_is_leaf(next) && |
c271b4924 Btrfs: remove of ... |
436 |
level != 1) |
5de08d7d5 Btrfs: Break up c... |
437 |
BUG(); |
5f39d397d Btrfs: Create ext... |
438 |
if (btrfs_header_level(next) != |
c271b4924 Btrfs: remove of ... |
439 |
level - 1) |
5de08d7d5 Btrfs: Break up c... |
440 |
BUG(); |
c08723237 btrfs: print-tree... |
441 |
btrfs_print_tree(next, follow); |
5f39d397d Btrfs: Create ext... |
442 |
free_extent_buffer(next); |
5de08d7d5 Btrfs: Break up c... |
443 |
} |
5de08d7d5 Btrfs: Break up c... |
444 |
} |