aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/print-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/print-tree.c')
-rw-r--r--fs/btrfs/print-tree.c107
1 files changed, 54 insertions, 53 deletions
diff --git a/fs/btrfs/print-tree.c b/fs/btrfs/print-tree.c
index dc0024f17c1f..0088bedc8631 100644
--- a/fs/btrfs/print-tree.c
+++ b/fs/btrfs/print-tree.c
@@ -26,14 +26,12 @@ static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk)
26 int i; 26 int i;
27 printk(KERN_INFO "\t\tchunk length %llu owner %llu type %llu " 27 printk(KERN_INFO "\t\tchunk length %llu owner %llu type %llu "
28 "num_stripes %d\n", 28 "num_stripes %d\n",
29 (unsigned long long)btrfs_chunk_length(eb, chunk), 29 btrfs_chunk_length(eb, chunk), btrfs_chunk_owner(eb, chunk),
30 (unsigned long long)btrfs_chunk_owner(eb, chunk), 30 btrfs_chunk_type(eb, chunk), num_stripes);
31 (unsigned long long)btrfs_chunk_type(eb, chunk),
32 num_stripes);
33 for (i = 0 ; i < num_stripes ; i++) { 31 for (i = 0 ; i < num_stripes ; i++) {
34 printk(KERN_INFO "\t\t\tstripe %d devid %llu offset %llu\n", i, 32 printk(KERN_INFO "\t\t\tstripe %d devid %llu offset %llu\n", i,
35 (unsigned long long)btrfs_stripe_devid_nr(eb, chunk, i), 33 btrfs_stripe_devid_nr(eb, chunk, i),
36 (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); 34 btrfs_stripe_offset_nr(eb, chunk, i));
37 } 35 }
38} 36}
39static void print_dev_item(struct extent_buffer *eb, 37static void print_dev_item(struct extent_buffer *eb,
@@ -41,18 +39,18 @@ static void print_dev_item(struct extent_buffer *eb,
41{ 39{
42 printk(KERN_INFO "\t\tdev item devid %llu " 40 printk(KERN_INFO "\t\tdev item devid %llu "
43 "total_bytes %llu bytes used %llu\n", 41 "total_bytes %llu bytes used %llu\n",
44 (unsigned long long)btrfs_device_id(eb, dev_item), 42 btrfs_device_id(eb, dev_item),
45 (unsigned long long)btrfs_device_total_bytes(eb, dev_item), 43 btrfs_device_total_bytes(eb, dev_item),
46 (unsigned long long)btrfs_device_bytes_used(eb, dev_item)); 44 btrfs_device_bytes_used(eb, dev_item));
47} 45}
48static void print_extent_data_ref(struct extent_buffer *eb, 46static void print_extent_data_ref(struct extent_buffer *eb,
49 struct btrfs_extent_data_ref *ref) 47 struct btrfs_extent_data_ref *ref)
50{ 48{
51 printk(KERN_INFO "\t\textent data backref root %llu " 49 printk(KERN_INFO "\t\textent data backref root %llu "
52 "objectid %llu offset %llu count %u\n", 50 "objectid %llu offset %llu count %u\n",
53 (unsigned long long)btrfs_extent_data_ref_root(eb, ref), 51 btrfs_extent_data_ref_root(eb, ref),
54 (unsigned long long)btrfs_extent_data_ref_objectid(eb, ref), 52 btrfs_extent_data_ref_objectid(eb, ref),
55 (unsigned long long)btrfs_extent_data_ref_offset(eb, ref), 53 btrfs_extent_data_ref_offset(eb, ref),
56 btrfs_extent_data_ref_count(eb, ref)); 54 btrfs_extent_data_ref_count(eb, ref));
57} 55}
58 56
@@ -87,19 +85,17 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
87 flags = btrfs_extent_flags(eb, ei); 85 flags = btrfs_extent_flags(eb, ei);
88 86
89 printk(KERN_INFO "\t\textent refs %llu gen %llu flags %llu\n", 87 printk(KERN_INFO "\t\textent refs %llu gen %llu flags %llu\n",
90 (unsigned long long)btrfs_extent_refs(eb, ei), 88 btrfs_extent_refs(eb, ei), btrfs_extent_generation(eb, ei),
91 (unsigned long long)btrfs_extent_generation(eb, ei), 89 flags);
92 (unsigned long long)flags);
93 90
94 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { 91 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
95 struct btrfs_tree_block_info *info; 92 struct btrfs_tree_block_info *info;
96 info = (struct btrfs_tree_block_info *)(ei + 1); 93 info = (struct btrfs_tree_block_info *)(ei + 1);
97 btrfs_tree_block_key(eb, info, &key); 94 btrfs_tree_block_key(eb, info, &key);
98 printk(KERN_INFO "\t\ttree block key (%llu %x %llu) " 95 printk(KERN_INFO "\t\ttree block key (%llu %u %llu) "
99 "level %d\n", 96 "level %d\n",
100 (unsigned long long)btrfs_disk_key_objectid(&key), 97 btrfs_disk_key_objectid(&key), key.type,
101 key.type, 98 btrfs_disk_key_offset(&key),
102 (unsigned long long)btrfs_disk_key_offset(&key),
103 btrfs_tree_block_level(eb, info)); 99 btrfs_tree_block_level(eb, info));
104 iref = (struct btrfs_extent_inline_ref *)(info + 1); 100 iref = (struct btrfs_extent_inline_ref *)(info + 1);
105 } else { 101 } else {
@@ -115,11 +111,11 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
115 switch (type) { 111 switch (type) {
116 case BTRFS_TREE_BLOCK_REF_KEY: 112 case BTRFS_TREE_BLOCK_REF_KEY:
117 printk(KERN_INFO "\t\ttree block backref " 113 printk(KERN_INFO "\t\ttree block backref "
118 "root %llu\n", (unsigned long long)offset); 114 "root %llu\n", offset);
119 break; 115 break;
120 case BTRFS_SHARED_BLOCK_REF_KEY: 116 case BTRFS_SHARED_BLOCK_REF_KEY:
121 printk(KERN_INFO "\t\tshared block backref " 117 printk(KERN_INFO "\t\tshared block backref "
122 "parent %llu\n", (unsigned long long)offset); 118 "parent %llu\n", offset);
123 break; 119 break;
124 case BTRFS_EXTENT_DATA_REF_KEY: 120 case BTRFS_EXTENT_DATA_REF_KEY:
125 dref = (struct btrfs_extent_data_ref *)(&iref->offset); 121 dref = (struct btrfs_extent_data_ref *)(&iref->offset);
@@ -129,8 +125,7 @@ static void print_extent_item(struct extent_buffer *eb, int slot)
129 sref = (struct btrfs_shared_data_ref *)(iref + 1); 125 sref = (struct btrfs_shared_data_ref *)(iref + 1);
130 printk(KERN_INFO "\t\tshared data backref " 126 printk(KERN_INFO "\t\tshared data backref "
131 "parent %llu count %u\n", 127 "parent %llu count %u\n",
132 (unsigned long long)offset, 128 offset, btrfs_shared_data_ref_count(eb, sref));
133 btrfs_shared_data_ref_count(eb, sref));
134 break; 129 break;
135 default: 130 default:
136 BUG(); 131 BUG();
@@ -148,13 +143,32 @@ static void print_extent_ref_v0(struct extent_buffer *eb, int slot)
148 ref0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_ref_v0); 143 ref0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_ref_v0);
149 printk("\t\textent back ref root %llu gen %llu " 144 printk("\t\textent back ref root %llu gen %llu "
150 "owner %llu num_refs %lu\n", 145 "owner %llu num_refs %lu\n",
151 (unsigned long long)btrfs_ref_root_v0(eb, ref0), 146 btrfs_ref_root_v0(eb, ref0),
152 (unsigned long long)btrfs_ref_generation_v0(eb, ref0), 147 btrfs_ref_generation_v0(eb, ref0),
153 (unsigned long long)btrfs_ref_objectid_v0(eb, ref0), 148 btrfs_ref_objectid_v0(eb, ref0),
154 (unsigned long)btrfs_ref_count_v0(eb, ref0)); 149 (unsigned long)btrfs_ref_count_v0(eb, ref0));
155} 150}
156#endif 151#endif
157 152
153static void print_uuid_item(struct extent_buffer *l, unsigned long offset,
154 u32 item_size)
155{
156 if (!IS_ALIGNED(item_size, sizeof(u64))) {
157 pr_warn("btrfs: uuid item with illegal size %lu!\n",
158 (unsigned long)item_size);
159 return;
160 }
161 while (item_size) {
162 __le64 subvol_id;
163
164 read_extent_buffer(l, &subvol_id, offset, sizeof(subvol_id));
165 printk(KERN_INFO "\t\tsubvol_id %llu\n",
166 (unsigned long long)le64_to_cpu(subvol_id));
167 item_size -= sizeof(u64);
168 offset += sizeof(u64);
169 }
170}
171
158void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) 172void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
159{ 173{
160 int i; 174 int i;
@@ -177,39 +191,34 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
177 nr = btrfs_header_nritems(l); 191 nr = btrfs_header_nritems(l);
178 192
179 btrfs_info(root->fs_info, "leaf %llu total ptrs %d free space %d", 193 btrfs_info(root->fs_info, "leaf %llu total ptrs %d free space %d",
180 (unsigned long long)btrfs_header_bytenr(l), nr, 194 btrfs_header_bytenr(l), nr, btrfs_leaf_free_space(root, l));
181 btrfs_leaf_free_space(root, l));
182 for (i = 0 ; i < nr ; i++) { 195 for (i = 0 ; i < nr ; i++) {
183 item = btrfs_item_nr(l, i); 196 item = btrfs_item_nr(l, i);
184 btrfs_item_key_to_cpu(l, &key, i); 197 btrfs_item_key_to_cpu(l, &key, i);
185 type = btrfs_key_type(&key); 198 type = btrfs_key_type(&key);
186 printk(KERN_INFO "\titem %d key (%llu %x %llu) itemoff %d " 199 printk(KERN_INFO "\titem %d key (%llu %u %llu) itemoff %d "
187 "itemsize %d\n", 200 "itemsize %d\n",
188 i, 201 i, key.objectid, type, key.offset,
189 (unsigned long long)key.objectid, type,
190 (unsigned long long)key.offset,
191 btrfs_item_offset(l, item), btrfs_item_size(l, item)); 202 btrfs_item_offset(l, item), btrfs_item_size(l, item));
192 switch (type) { 203 switch (type) {
193 case BTRFS_INODE_ITEM_KEY: 204 case BTRFS_INODE_ITEM_KEY:
194 ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); 205 ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
195 printk(KERN_INFO "\t\tinode generation %llu size %llu " 206 printk(KERN_INFO "\t\tinode generation %llu size %llu "
196 "mode %o\n", 207 "mode %o\n",
197 (unsigned long long)
198 btrfs_inode_generation(l, ii), 208 btrfs_inode_generation(l, ii),
199 (unsigned long long)btrfs_inode_size(l, ii), 209 btrfs_inode_size(l, ii),
200 btrfs_inode_mode(l, ii)); 210 btrfs_inode_mode(l, ii));
201 break; 211 break;
202 case BTRFS_DIR_ITEM_KEY: 212 case BTRFS_DIR_ITEM_KEY:
203 di = btrfs_item_ptr(l, i, struct btrfs_dir_item); 213 di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
204 btrfs_dir_item_key_to_cpu(l, di, &found_key); 214 btrfs_dir_item_key_to_cpu(l, di, &found_key);
205 printk(KERN_INFO "\t\tdir oid %llu type %u\n", 215 printk(KERN_INFO "\t\tdir oid %llu type %u\n",
206 (unsigned long long)found_key.objectid, 216 found_key.objectid,
207 btrfs_dir_type(l, di)); 217 btrfs_dir_type(l, di));
208 break; 218 break;
209 case BTRFS_ROOT_ITEM_KEY: 219 case BTRFS_ROOT_ITEM_KEY:
210 ri = btrfs_item_ptr(l, i, struct btrfs_root_item); 220 ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
211 printk(KERN_INFO "\t\troot data bytenr %llu refs %u\n", 221 printk(KERN_INFO "\t\troot data bytenr %llu refs %u\n",
212 (unsigned long long)
213 btrfs_disk_root_bytenr(l, ri), 222 btrfs_disk_root_bytenr(l, ri),
214 btrfs_disk_root_refs(l, ri)); 223 btrfs_disk_root_refs(l, ri));
215 break; 224 break;
@@ -245,17 +254,12 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
245 } 254 }
246 printk(KERN_INFO "\t\textent data disk bytenr %llu " 255 printk(KERN_INFO "\t\textent data disk bytenr %llu "
247 "nr %llu\n", 256 "nr %llu\n",
248 (unsigned long long)
249 btrfs_file_extent_disk_bytenr(l, fi), 257 btrfs_file_extent_disk_bytenr(l, fi),
250 (unsigned long long)
251 btrfs_file_extent_disk_num_bytes(l, fi)); 258 btrfs_file_extent_disk_num_bytes(l, fi));
252 printk(KERN_INFO "\t\textent data offset %llu " 259 printk(KERN_INFO "\t\textent data offset %llu "
253 "nr %llu ram %llu\n", 260 "nr %llu ram %llu\n",
254 (unsigned long long)
255 btrfs_file_extent_offset(l, fi), 261 btrfs_file_extent_offset(l, fi),
256 (unsigned long long)
257 btrfs_file_extent_num_bytes(l, fi), 262 btrfs_file_extent_num_bytes(l, fi),
258 (unsigned long long)
259 btrfs_file_extent_ram_bytes(l, fi)); 263 btrfs_file_extent_ram_bytes(l, fi));
260 break; 264 break;
261 case BTRFS_EXTENT_REF_V0_KEY: 265 case BTRFS_EXTENT_REF_V0_KEY:
@@ -269,7 +273,6 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
269 bi = btrfs_item_ptr(l, i, 273 bi = btrfs_item_ptr(l, i,
270 struct btrfs_block_group_item); 274 struct btrfs_block_group_item);
271 printk(KERN_INFO "\t\tblock group used %llu\n", 275 printk(KERN_INFO "\t\tblock group used %llu\n",
272 (unsigned long long)
273 btrfs_disk_block_group_used(l, bi)); 276 btrfs_disk_block_group_used(l, bi));
274 break; 277 break;
275 case BTRFS_CHUNK_ITEM_KEY: 278 case BTRFS_CHUNK_ITEM_KEY:
@@ -286,13 +289,9 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
286 printk(KERN_INFO "\t\tdev extent chunk_tree %llu\n" 289 printk(KERN_INFO "\t\tdev extent chunk_tree %llu\n"
287 "\t\tchunk objectid %llu chunk offset %llu " 290 "\t\tchunk objectid %llu chunk offset %llu "
288 "length %llu\n", 291 "length %llu\n",
289 (unsigned long long)
290 btrfs_dev_extent_chunk_tree(l, dev_extent), 292 btrfs_dev_extent_chunk_tree(l, dev_extent),
291 (unsigned long long)
292 btrfs_dev_extent_chunk_objectid(l, dev_extent), 293 btrfs_dev_extent_chunk_objectid(l, dev_extent),
293 (unsigned long long)
294 btrfs_dev_extent_chunk_offset(l, dev_extent), 294 btrfs_dev_extent_chunk_offset(l, dev_extent),
295 (unsigned long long)
296 btrfs_dev_extent_length(l, dev_extent)); 295 btrfs_dev_extent_length(l, dev_extent));
297 break; 296 break;
298 case BTRFS_DEV_STATS_KEY: 297 case BTRFS_DEV_STATS_KEY:
@@ -301,6 +300,11 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
301 case BTRFS_DEV_REPLACE_KEY: 300 case BTRFS_DEV_REPLACE_KEY:
302 printk(KERN_INFO "\t\tdev replace\n"); 301 printk(KERN_INFO "\t\tdev replace\n");
303 break; 302 break;
303 case BTRFS_UUID_KEY_SUBVOL:
304 case BTRFS_UUID_KEY_RECEIVED_SUBVOL:
305 print_uuid_item(l, btrfs_item_ptr_offset(l, i),
306 btrfs_item_size_nr(l, i));
307 break;
304 }; 308 };
305 } 309 }
306} 310}
@@ -320,16 +324,13 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *c)
320 return; 324 return;
321 } 325 }
322 btrfs_info(root->fs_info, "node %llu level %d total ptrs %d free spc %u", 326 btrfs_info(root->fs_info, "node %llu level %d total ptrs %d free spc %u",
323 (unsigned long long)btrfs_header_bytenr(c), 327 btrfs_header_bytenr(c), level, nr,
324 level, nr, (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr); 328 (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr);
325 for (i = 0; i < nr; i++) { 329 for (i = 0; i < nr; i++) {
326 btrfs_node_key_to_cpu(c, &key, i); 330 btrfs_node_key_to_cpu(c, &key, i);
327 printk(KERN_INFO "\tkey %d (%llu %u %llu) block %llu\n", 331 printk(KERN_INFO "\tkey %d (%llu %u %llu) block %llu\n",
328 i, 332 i, key.objectid, key.type, key.offset,
329 (unsigned long long)key.objectid, 333 btrfs_node_blockptr(c, i));
330 key.type,
331 (unsigned long long)key.offset,
332 (unsigned long long)btrfs_node_blockptr(c, i));
333 } 334 }
334 for (i = 0; i < nr; i++) { 335 for (i = 0; i < nr; i++) {
335 struct extent_buffer *next = read_tree_block(root, 336 struct extent_buffer *next = read_tree_block(root,