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