Blame view

fs/btrfs/print-tree.c 10.8 KB
6cbd55707   Chris Mason   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   Chris Mason   Btrfs: Break up c...
18
19
  #include "ctree.h"
  #include "disk-io.h"
35b7e4761   Chris Mason   Btrfs: fix page c...
20
  #include "print-tree.h"
5de08d7d5   Chris Mason   Btrfs: Break up c...
21

0b86a832a   Chris Mason   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   Chris Mason   Btrfs: Fix checkp...
26
27
28
  	printk(KERN_INFO "\t\tchunk length %llu owner %llu type %llu "
  	       "num_stripes %d
  ",
e17cade25   Chris Mason   Btrfs: Add chunk ...
29
  	       (unsigned long long)btrfs_chunk_length(eb, chunk),
0b86a832a   Chris Mason   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   Chris Mason   Btrfs: Fix checkp...
34
35
  		printk(KERN_INFO "\t\t\tstripe %d devid %llu offset %llu
  ", i,
0b86a832a   Chris Mason   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   Chris Mason   Btrfs: Fix checkp...
43
44
45
  	printk(KERN_INFO "\t\tdev item devid %llu "
  	       "total_bytes %llu bytes used %llu
  ",
0b86a832a   Chris Mason   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   Chris Mason   Btrfs: Add suppor...
49
  }
5d4f98a28   Yan Zheng   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   Chris Mason   Btrfs: Create ext...
167
  void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
5de08d7d5   Chris Mason   Btrfs: Break up c...
168
169
  {
  	int i;
068132bad   Daniel J Blueman   btrfs: fix oops o...
170
  	u32 type, nr;
0783fcfc4   Chris Mason   Btrfs: struct ite...
171
  	struct btrfs_item *item;
3768f3689   Chris Mason   Btrfs: Change the...
172
  	struct btrfs_root_item *ri;
1d4f6404d   Chris Mason   Btrfs: directory ...
173
  	struct btrfs_dir_item *di;
293ffd5fd   Chris Mason   Btrfs: change dir...
174
  	struct btrfs_inode_item *ii;
9078a3e1e   Chris Mason   Btrfs: start of b...
175
  	struct btrfs_block_group_item *bi;
8c2383c3d   Chris Mason   Subject: Rework b...
176
  	struct btrfs_file_extent_item *fi;
5d4f98a28   Yan Zheng   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   Chris Mason   Btrfs: Create ext...
180
181
  	struct btrfs_key key;
  	struct btrfs_key found_key;
1d4f6404d   Chris Mason   Btrfs: directory ...
182

068132bad   Daniel J Blueman   btrfs: fix oops o...
183
184
185
186
  	if (!l)
  		return;
  
  	nr = btrfs_header_nritems(l);
d397712bc   Chris Mason   Btrfs: Fix checkp...
187
188
  	printk(KERN_INFO "leaf %llu total ptrs %d free space %d
  ",
db94535db   Chris Mason   Btrfs: Allow tree...
189
  		(unsigned long long)btrfs_header_bytenr(l), nr,
123abc88c   Chris Mason   Btrfs: variable b...
190
  		btrfs_leaf_free_space(root, l));
5de08d7d5   Chris Mason   Btrfs: Break up c...
191
  	for (i = 0 ; i < nr ; i++) {
5f39d397d   Chris Mason   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   Chris Mason   Btrfs: Fix checkp...
195
196
197
  		printk(KERN_INFO "\titem %d key (%llu %x %llu) itemoff %d "
  		       "itemsize %d
  ",
5de08d7d5   Chris Mason   Btrfs: Break up c...
198
  			i,
5f39d397d   Chris Mason   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   Chris Mason   Btrfs: Use a chun...
202
203
  		switch (type) {
  		case BTRFS_INODE_ITEM_KEY:
293ffd5fd   Chris Mason   Btrfs: change dir...
204
  			ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
d397712bc   Chris Mason   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   Chris Mason   Btrfs: Create ext...
210
211
  			      (unsigned long long)btrfs_inode_size(l, ii),
  			       btrfs_inode_mode(l, ii));
62e2749e0   Chris Mason   Btrfs: Use a chun...
212
213
  			break;
  		case BTRFS_DIR_ITEM_KEY:
1d4f6404d   Chris Mason   Btrfs: directory ...
214
  			di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
5f39d397d   Chris Mason   Btrfs: Create ext...
215
  			btrfs_dir_item_key_to_cpu(l, di, &found_key);
d397712bc   Chris Mason   Btrfs: Fix checkp...
216
217
  			printk(KERN_INFO "\t\tdir oid %llu type %u
  ",
5f39d397d   Chris Mason   Btrfs: Create ext...
218
  				(unsigned long long)found_key.objectid,
5f39d397d   Chris Mason   Btrfs: Create ext...
219
  				btrfs_dir_type(l, di));
62e2749e0   Chris Mason   Btrfs: Use a chun...
220
221
222
  			break;
  		case BTRFS_ROOT_ITEM_KEY:
  			ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
d397712bc   Chris Mason   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   Chris Mason   Btrfs: Create ext...
227
  				btrfs_disk_root_refs(l, ri));
62e2749e0   Chris Mason   Btrfs: Use a chun...
228
229
  			break;
  		case BTRFS_EXTENT_ITEM_KEY:
5d4f98a28   Yan Zheng   Btrfs: Mixed back...
230
  			print_extent_item(l, i);
62e2749e0   Chris Mason   Btrfs: Use a chun...
231
  			break;
5d4f98a28   Yan Zheng   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   Chris Mason   Btrfs: Add back p...
251
  			break;
8c2383c3d   Chris Mason   Subject: Rework b...
252
253
254
  		case BTRFS_EXTENT_DATA_KEY:
  			fi = btrfs_item_ptr(l, i,
  					    struct btrfs_file_extent_item);
5f39d397d   Chris Mason   Btrfs: Create ext...
255
  			if (btrfs_file_extent_type(l, fi) ==
8c2383c3d   Chris Mason   Subject: Rework b...
256
  			    BTRFS_FILE_EXTENT_INLINE) {
d397712bc   Chris Mason   Btrfs: Fix checkp...
257
258
259
260
  				printk(KERN_INFO "\t\tinline extent data "
  				       "size %u
  ",
  				       btrfs_file_extent_inline_len(l, fi));
8c2383c3d   Chris Mason   Subject: Rework b...
261
262
  				break;
  			}
d397712bc   Chris Mason   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   Chris Mason   Subject: Rework b...
279
  			break;
5d4f98a28   Yan Zheng   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   liubo   btrfs: fix missin...
286
  			break;
9078a3e1e   Chris Mason   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   Chris Mason   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   Chris Mason   Btrfs: Use a chun...
294
  			break;
0b86a832a   Chris Mason   Btrfs: Add suppor...
295
  		case BTRFS_CHUNK_ITEM_KEY:
d397712bc   Chris Mason   Btrfs: Fix checkp...
296
297
  			print_chunk(l, btrfs_item_ptr(l, i,
  						      struct btrfs_chunk));
0b86a832a   Chris Mason   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   Chris Mason   Btrfs: Fix checkp...
306
307
  			printk(KERN_INFO "\t\tdev extent chunk_tree %llu
  "
e17cade25   Chris Mason   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   Chris Mason   Btrfs: Use a chun...
319
  		};
5de08d7d5   Chris Mason   Btrfs: Break up c...
320
321
  	}
  }
e20d96d64   Chris Mason   Mountable btrfs, ...
322

5f39d397d   Chris Mason   Btrfs: Create ext...
323
  void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *c)
5de08d7d5   Chris Mason   Btrfs: Break up c...
324
  {
e17cade25   Chris Mason   Btrfs: Add chunk ...
325
  	int i; u32 nr;
5f39d397d   Chris Mason   Btrfs: Create ext...
326
  	struct btrfs_key key;
db94535db   Chris Mason   Btrfs: Allow tree...
327
  	int level;
5de08d7d5   Chris Mason   Btrfs: Break up c...
328

5f39d397d   Chris Mason   Btrfs: Create ext...
329
  	if (!c)
5de08d7d5   Chris Mason   Btrfs: Break up c...
330
  		return;
5f39d397d   Chris Mason   Btrfs: Create ext...
331
  	nr = btrfs_header_nritems(c);
db94535db   Chris Mason   Btrfs: Allow tree...
332
333
  	level = btrfs_header_level(c);
  	if (level == 0) {
5f39d397d   Chris Mason   Btrfs: Create ext...
334
  		btrfs_print_leaf(root, c);
5de08d7d5   Chris Mason   Btrfs: Break up c...
335
336
  		return;
  	}
d397712bc   Chris Mason   Btrfs: Fix checkp...
337
338
  	printk(KERN_INFO "node %llu level %d total ptrs %d free spc %u
  ",
db94535db   Chris Mason   Btrfs: Allow tree...
339
  	       (unsigned long long)btrfs_header_bytenr(c),
c271b4924   Daniel Cadete   Btrfs: remove of ...
340
  	      level, nr,
e20d96d64   Chris Mason   Mountable btrfs, ...
341
  	       (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr);
5de08d7d5   Chris Mason   Btrfs: Break up c...
342
  	for (i = 0; i < nr; i++) {
5f39d397d   Chris Mason   Btrfs: Create ext...
343
  		btrfs_node_key_to_cpu(c, &key, i);
d397712bc   Chris Mason   Btrfs: Fix checkp...
344
345
  		printk(KERN_INFO "\tkey %d (%llu %u %llu) block %llu
  ",
5de08d7d5   Chris Mason   Btrfs: Break up c...
346
  		       i,
5f39d397d   Chris Mason   Btrfs: Create ext...
347
348
349
  		       (unsigned long long)key.objectid,
  		       key.type,
  		       (unsigned long long)key.offset,
5af3981c1   Chris Mason   Btrfs: printk fixes
350
  		       (unsigned long long)btrfs_node_blockptr(c, i));
5de08d7d5   Chris Mason   Btrfs: Break up c...
351
352
  	}
  	for (i = 0; i < nr; i++) {
5f39d397d   Chris Mason   Btrfs: Create ext...
353
  		struct extent_buffer *next = read_tree_block(root,
db94535db   Chris Mason   Btrfs: Allow tree...
354
  					btrfs_node_blockptr(c, i),
ca7a79ad8   Chris Mason   Btrfs: Pass down ...
355
356
  					btrfs_level_size(root, level - 1),
  					btrfs_node_ptr_generation(c, i));
7518a238e   Chris Mason   Btrfs: get/set fo...
357
  		if (btrfs_is_leaf(next) &&
c271b4924   Daniel Cadete   Btrfs: remove of ...
358
  		   level != 1)
5de08d7d5   Chris Mason   Btrfs: Break up c...
359
  			BUG();
5f39d397d   Chris Mason   Btrfs: Create ext...
360
  		if (btrfs_header_level(next) !=
c271b4924   Daniel Cadete   Btrfs: remove of ...
361
  		       level - 1)
5de08d7d5   Chris Mason   Btrfs: Break up c...
362
  			BUG();
5f39d397d   Chris Mason   Btrfs: Create ext...
363
364
  		btrfs_print_tree(root, next);
  		free_extent_buffer(next);
5de08d7d5   Chris Mason   Btrfs: Break up c...
365
  	}
5de08d7d5   Chris Mason   Btrfs: Break up c...
366
  }