diff options
Diffstat (limited to 'fs/btrfs/print-tree.c')
-rw-r--r-- | fs/btrfs/print-tree.c | 155 |
1 files changed, 138 insertions, 17 deletions
diff --git a/fs/btrfs/print-tree.c b/fs/btrfs/print-tree.c index 5f8f218c1005..6d6523da0a30 100644 --- a/fs/btrfs/print-tree.c +++ b/fs/btrfs/print-tree.c | |||
@@ -45,22 +45,132 @@ static void print_dev_item(struct extent_buffer *eb, | |||
45 | (unsigned long long)btrfs_device_total_bytes(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)); | 46 | (unsigned long long)btrfs_device_bytes_used(eb, dev_item)); |
47 | } | 47 | } |
48 | static void print_extent_data_ref(struct extent_buffer *eb, | ||
49 | struct btrfs_extent_data_ref *ref) | ||
50 | { | ||
51 | printk(KERN_INFO "\t\textent data backref root %llu " | ||
52 | "objectid %llu offset %llu count %u\n", | ||
53 | (unsigned long long)btrfs_extent_data_ref_root(eb, ref), | ||
54 | (unsigned long long)btrfs_extent_data_ref_objectid(eb, ref), | ||
55 | (unsigned long long)btrfs_extent_data_ref_offset(eb, ref), | ||
56 | btrfs_extent_data_ref_count(eb, ref)); | ||
57 | } | ||
58 | |||
59 | static void print_extent_item(struct extent_buffer *eb, int slot) | ||
60 | { | ||
61 | struct btrfs_extent_item *ei; | ||
62 | struct btrfs_extent_inline_ref *iref; | ||
63 | struct btrfs_extent_data_ref *dref; | ||
64 | struct btrfs_shared_data_ref *sref; | ||
65 | struct btrfs_disk_key key; | ||
66 | unsigned long end; | ||
67 | unsigned long ptr; | ||
68 | int type; | ||
69 | u32 item_size = btrfs_item_size_nr(eb, slot); | ||
70 | u64 flags; | ||
71 | u64 offset; | ||
72 | |||
73 | if (item_size < sizeof(*ei)) { | ||
74 | #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 | ||
75 | struct btrfs_extent_item_v0 *ei0; | ||
76 | BUG_ON(item_size != sizeof(*ei0)); | ||
77 | ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0); | ||
78 | printk(KERN_INFO "\t\textent refs %u\n", | ||
79 | btrfs_extent_refs_v0(eb, ei0)); | ||
80 | return; | ||
81 | #else | ||
82 | BUG(); | ||
83 | #endif | ||
84 | } | ||
85 | |||
86 | ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item); | ||
87 | flags = btrfs_extent_flags(eb, ei); | ||
88 | |||
89 | printk(KERN_INFO "\t\textent refs %llu gen %llu flags %llu\n", | ||
90 | (unsigned long long)btrfs_extent_refs(eb, ei), | ||
91 | (unsigned long long)btrfs_extent_generation(eb, ei), | ||
92 | (unsigned long long)flags); | ||
93 | |||
94 | if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { | ||
95 | struct btrfs_tree_block_info *info; | ||
96 | info = (struct btrfs_tree_block_info *)(ei + 1); | ||
97 | btrfs_tree_block_key(eb, info, &key); | ||
98 | printk(KERN_INFO "\t\ttree block key (%llu %x %llu) " | ||
99 | "level %d\n", | ||
100 | (unsigned long long)btrfs_disk_key_objectid(&key), | ||
101 | key.type, | ||
102 | (unsigned long long)btrfs_disk_key_offset(&key), | ||
103 | btrfs_tree_block_level(eb, info)); | ||
104 | iref = (struct btrfs_extent_inline_ref *)(info + 1); | ||
105 | } else { | ||
106 | iref = (struct btrfs_extent_inline_ref *)(ei + 1); | ||
107 | } | ||
108 | |||
109 | ptr = (unsigned long)iref; | ||
110 | end = (unsigned long)ei + item_size; | ||
111 | while (ptr < end) { | ||
112 | iref = (struct btrfs_extent_inline_ref *)ptr; | ||
113 | type = btrfs_extent_inline_ref_type(eb, iref); | ||
114 | offset = btrfs_extent_inline_ref_offset(eb, iref); | ||
115 | switch (type) { | ||
116 | case BTRFS_TREE_BLOCK_REF_KEY: | ||
117 | printk(KERN_INFO "\t\ttree block backref " | ||
118 | "root %llu\n", (unsigned long long)offset); | ||
119 | break; | ||
120 | case BTRFS_SHARED_BLOCK_REF_KEY: | ||
121 | printk(KERN_INFO "\t\tshared block backref " | ||
122 | "parent %llu\n", (unsigned long long)offset); | ||
123 | break; | ||
124 | case BTRFS_EXTENT_DATA_REF_KEY: | ||
125 | dref = (struct btrfs_extent_data_ref *)(&iref->offset); | ||
126 | print_extent_data_ref(eb, dref); | ||
127 | break; | ||
128 | case BTRFS_SHARED_DATA_REF_KEY: | ||
129 | sref = (struct btrfs_shared_data_ref *)(iref + 1); | ||
130 | printk(KERN_INFO "\t\tshared data backref " | ||
131 | "parent %llu count %u\n", | ||
132 | (unsigned long long)offset, | ||
133 | btrfs_shared_data_ref_count(eb, sref)); | ||
134 | break; | ||
135 | default: | ||
136 | BUG(); | ||
137 | } | ||
138 | ptr += btrfs_extent_inline_ref_size(type); | ||
139 | } | ||
140 | WARN_ON(ptr > end); | ||
141 | } | ||
142 | |||
143 | #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 | ||
144 | static void print_extent_ref_v0(struct extent_buffer *eb, int slot) | ||
145 | { | ||
146 | struct btrfs_extent_ref_v0 *ref0; | ||
147 | |||
148 | ref0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_ref_v0); | ||
149 | printk("\t\textent back ref root %llu gen %llu " | ||
150 | "owner %llu num_refs %lu\n", | ||
151 | (unsigned long long)btrfs_ref_root_v0(eb, ref0), | ||
152 | (unsigned long long)btrfs_ref_generation_v0(eb, ref0), | ||
153 | (unsigned long long)btrfs_ref_objectid_v0(eb, ref0), | ||
154 | (unsigned long)btrfs_ref_count_v0(eb, ref0)); | ||
155 | } | ||
156 | #endif | ||
157 | |||
48 | void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) | 158 | void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) |
49 | { | 159 | { |
50 | int i; | 160 | int i; |
161 | u32 type; | ||
51 | u32 nr = btrfs_header_nritems(l); | 162 | u32 nr = btrfs_header_nritems(l); |
52 | struct btrfs_item *item; | 163 | struct btrfs_item *item; |
53 | struct btrfs_extent_item *ei; | ||
54 | struct btrfs_root_item *ri; | 164 | struct btrfs_root_item *ri; |
55 | struct btrfs_dir_item *di; | 165 | struct btrfs_dir_item *di; |
56 | struct btrfs_inode_item *ii; | 166 | struct btrfs_inode_item *ii; |
57 | struct btrfs_block_group_item *bi; | 167 | struct btrfs_block_group_item *bi; |
58 | struct btrfs_file_extent_item *fi; | 168 | struct btrfs_file_extent_item *fi; |
169 | struct btrfs_extent_data_ref *dref; | ||
170 | struct btrfs_shared_data_ref *sref; | ||
171 | struct btrfs_dev_extent *dev_extent; | ||
59 | struct btrfs_key key; | 172 | struct btrfs_key key; |
60 | struct btrfs_key found_key; | 173 | struct btrfs_key found_key; |
61 | struct btrfs_extent_ref *ref; | ||
62 | struct btrfs_dev_extent *dev_extent; | ||
63 | u32 type; | ||
64 | 174 | ||
65 | printk(KERN_INFO "leaf %llu total ptrs %d free space %d\n", | 175 | printk(KERN_INFO "leaf %llu total ptrs %d free space %d\n", |
66 | (unsigned long long)btrfs_header_bytenr(l), nr, | 176 | (unsigned long long)btrfs_header_bytenr(l), nr, |
@@ -100,20 +210,25 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) | |||
100 | btrfs_disk_root_refs(l, ri)); | 210 | btrfs_disk_root_refs(l, ri)); |
101 | break; | 211 | break; |
102 | case BTRFS_EXTENT_ITEM_KEY: | 212 | case BTRFS_EXTENT_ITEM_KEY: |
103 | ei = btrfs_item_ptr(l, i, struct btrfs_extent_item); | 213 | print_extent_item(l, i); |
104 | printk(KERN_INFO "\t\textent data refs %u\n", | 214 | break; |
105 | btrfs_extent_refs(l, ei)); | 215 | case BTRFS_TREE_BLOCK_REF_KEY: |
106 | break; | 216 | printk(KERN_INFO "\t\ttree block backref\n"); |
107 | case BTRFS_EXTENT_REF_KEY: | 217 | break; |
108 | ref = btrfs_item_ptr(l, i, struct btrfs_extent_ref); | 218 | case BTRFS_SHARED_BLOCK_REF_KEY: |
109 | printk(KERN_INFO "\t\textent back ref root %llu " | 219 | printk(KERN_INFO "\t\tshared block backref\n"); |
110 | "gen %llu owner %llu num_refs %lu\n", | 220 | break; |
111 | (unsigned long long)btrfs_ref_root(l, ref), | 221 | case BTRFS_EXTENT_DATA_REF_KEY: |
112 | (unsigned long long)btrfs_ref_generation(l, ref), | 222 | dref = btrfs_item_ptr(l, i, |
113 | (unsigned long long)btrfs_ref_objectid(l, ref), | 223 | struct btrfs_extent_data_ref); |
114 | (unsigned long)btrfs_ref_num_refs(l, ref)); | 224 | print_extent_data_ref(l, dref); |
225 | break; | ||
226 | case BTRFS_SHARED_DATA_REF_KEY: | ||
227 | sref = btrfs_item_ptr(l, i, | ||
228 | struct btrfs_shared_data_ref); | ||
229 | printk(KERN_INFO "\t\tshared data backref count %u\n", | ||
230 | btrfs_shared_data_ref_count(l, sref)); | ||
115 | break; | 231 | break; |
116 | |||
117 | case BTRFS_EXTENT_DATA_KEY: | 232 | case BTRFS_EXTENT_DATA_KEY: |
118 | fi = btrfs_item_ptr(l, i, | 233 | fi = btrfs_item_ptr(l, i, |
119 | struct btrfs_file_extent_item); | 234 | struct btrfs_file_extent_item); |
@@ -139,6 +254,12 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) | |||
139 | (unsigned long long) | 254 | (unsigned long long) |
140 | btrfs_file_extent_ram_bytes(l, fi)); | 255 | btrfs_file_extent_ram_bytes(l, fi)); |
141 | break; | 256 | break; |
257 | case BTRFS_EXTENT_REF_V0_KEY: | ||
258 | #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 | ||
259 | print_extent_ref_v0(l, i); | ||
260 | #else | ||
261 | BUG(); | ||
262 | #endif | ||
142 | case BTRFS_BLOCK_GROUP_ITEM_KEY: | 263 | case BTRFS_BLOCK_GROUP_ITEM_KEY: |
143 | bi = btrfs_item_ptr(l, i, | 264 | bi = btrfs_item_ptr(l, i, |
144 | struct btrfs_block_group_item); | 265 | struct btrfs_block_group_item); |