Btrfs: start of block group code
[linux-2.6] / fs / btrfs / print-tree.c
1 #include <linux/module.h>
2 #include "ctree.h"
3 #include "disk-io.h"
4
5 void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l)
6 {
7         int i;
8         u32 nr = btrfs_header_nritems(&l->header);
9         struct btrfs_item *item;
10         struct btrfs_extent_item *ei;
11         struct btrfs_root_item *ri;
12         struct btrfs_dir_item *di;
13         struct btrfs_inode_item *ii;
14         struct btrfs_block_group_item *bi;
15         u32 type;
16
17         printk("leaf %Lu total ptrs %d free space %d\n",
18                 btrfs_header_blocknr(&l->header), nr,
19                 btrfs_leaf_free_space(root, l));
20         for (i = 0 ; i < nr ; i++) {
21                 item = l->items + i;
22                 type = btrfs_disk_key_type(&item->key);
23                 printk("\titem %d key (%Lu %x %Lu) itemoff %d itemsize %d\n",
24                         i,
25                         btrfs_disk_key_objectid(&item->key),
26                         btrfs_disk_key_flags(&item->key),
27                         btrfs_disk_key_offset(&item->key),
28                         btrfs_item_offset(item),
29                         btrfs_item_size(item));
30                 switch (type) {
31                 case BTRFS_INODE_ITEM_KEY:
32                         ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
33                         printk("\t\tinode generation %Lu size %Lu mode %o\n",
34                                btrfs_inode_generation(ii),
35                                btrfs_inode_size(ii),
36                                btrfs_inode_mode(ii));
37                         break;
38                 case BTRFS_DIR_ITEM_KEY:
39                         di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
40                         printk("\t\tdir oid %Lu flags %u type %u\n",
41                                 btrfs_disk_key_objectid(&di->location),
42                                 btrfs_dir_flags(di),
43                                 btrfs_dir_type(di));
44                         printk("\t\tname %.*s\n",
45                                btrfs_dir_name_len(di),(char *)(di + 1));
46                         break;
47                 case BTRFS_ROOT_ITEM_KEY:
48                         ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
49                         printk("\t\troot data blocknr %Lu refs %u\n",
50                                 btrfs_root_blocknr(ri), btrfs_root_refs(ri));
51                         break;
52                 case BTRFS_EXTENT_ITEM_KEY:
53                         ei = btrfs_item_ptr(l, i, struct btrfs_extent_item);
54                         printk("\t\textent data refs %u\n",
55                                 btrfs_extent_refs(ei));
56                         break;
57                 case BTRFS_BLOCK_GROUP_ITEM_KEY:
58                         bi = btrfs_item_ptr(l, i,
59                                             struct btrfs_block_group_item);
60                         printk("\t\tblock group used %Lu\n",
61                                btrfs_block_group_used(bi));
62                         break;
63                 case BTRFS_STRING_ITEM_KEY:
64                         printk("\t\titem data %.*s\n", btrfs_item_size(item),
65                                 btrfs_leaf_data(l) + btrfs_item_offset(item));
66                         break;
67                 };
68         }
69 }
70
71 void btrfs_print_tree(struct btrfs_root *root, struct buffer_head *t)
72 {
73         int i;
74         u32 nr;
75         struct btrfs_node *c;
76
77         if (!t)
78                 return;
79         c = btrfs_buffer_node(t);
80         nr = btrfs_header_nritems(&c->header);
81         if (btrfs_is_leaf(c)) {
82                 btrfs_print_leaf(root, (struct btrfs_leaf *)c);
83                 return;
84         }
85         printk("node %Lu level %d total ptrs %d free spc %u\n",
86                btrfs_header_blocknr(&c->header),
87                btrfs_header_level(&c->header), nr,
88                (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr);
89         for (i = 0; i < nr; i++) {
90                 printk("\tkey %d (%Lu %u %Lu) block %Lu\n",
91                        i,
92                        c->ptrs[i].key.objectid,
93                        c->ptrs[i].key.flags,
94                        c->ptrs[i].key.offset,
95                        btrfs_node_blockptr(c, i));
96         }
97         for (i = 0; i < nr; i++) {
98                 struct buffer_head *next_buf = read_tree_block(root,
99                                                 btrfs_node_blockptr(c, i));
100                 struct btrfs_node *next = btrfs_buffer_node(next_buf);
101                 if (btrfs_is_leaf(next) &&
102                     btrfs_header_level(&c->header) != 1)
103                         BUG();
104                 if (btrfs_header_level(&next->header) !=
105                         btrfs_header_level(&c->header) - 1)
106                         BUG();
107                 btrfs_print_tree(root, next_buf);
108                 btrfs_block_release(root, next_buf);
109         }
110 }
111