2 * Copyright (C) 2007 Oracle. All rights reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
19 #include <linux/module.h>
22 #include "print-tree.h"
24 void btrfs_print_leaf(struct btrfs_root
*root
, struct btrfs_leaf
*l
)
27 u32 nr
= btrfs_header_nritems(&l
->header
);
28 struct btrfs_item
*item
;
29 struct btrfs_extent_item
*ei
;
30 struct btrfs_root_item
*ri
;
31 struct btrfs_dir_item
*di
;
32 struct btrfs_inode_item
*ii
;
33 struct btrfs_block_group_item
*bi
;
36 printk("leaf %llu total ptrs %d free space %d\n",
37 (unsigned long long)btrfs_header_blocknr(&l
->header
), nr
,
38 btrfs_leaf_free_space(root
, l
));
39 for (i
= 0 ; i
< nr
; i
++) {
41 type
= btrfs_disk_key_type(&item
->key
);
42 printk("\titem %d key (%llu %x %llu) itemoff %d itemsize %d\n",
44 (unsigned long long)btrfs_disk_key_objectid(&item
->key
),
45 btrfs_disk_key_flags(&item
->key
),
46 (unsigned long long)btrfs_disk_key_offset(&item
->key
),
47 btrfs_item_offset(item
),
48 btrfs_item_size(item
));
50 case BTRFS_INODE_ITEM_KEY
:
51 ii
= btrfs_item_ptr(l
, i
, struct btrfs_inode_item
);
52 printk("\t\tinode generation %llu size %llu mode %o\n",
53 (unsigned long long)btrfs_inode_generation(ii
),
54 (unsigned long long)btrfs_inode_size(ii
),
55 btrfs_inode_mode(ii
));
57 case BTRFS_DIR_ITEM_KEY
:
58 di
= btrfs_item_ptr(l
, i
, struct btrfs_dir_item
);
59 printk("\t\tdir oid %llu flags %u type %u\n",
60 (unsigned long long)btrfs_disk_key_objectid(
64 printk("\t\tname %.*s\n",
65 btrfs_dir_name_len(di
),(char *)(di
+ 1));
67 case BTRFS_ROOT_ITEM_KEY
:
68 ri
= btrfs_item_ptr(l
, i
, struct btrfs_root_item
);
69 printk("\t\troot data blocknr %llu refs %u\n",
70 (unsigned long long)btrfs_root_blocknr(ri
),
73 case BTRFS_EXTENT_ITEM_KEY
:
74 ei
= btrfs_item_ptr(l
, i
, struct btrfs_extent_item
);
75 printk("\t\textent data refs %u\n",
76 btrfs_extent_refs(ei
));
78 case BTRFS_BLOCK_GROUP_ITEM_KEY
:
79 bi
= btrfs_item_ptr(l
, i
,
80 struct btrfs_block_group_item
);
81 printk("\t\tblock group used %llu\n",
82 (unsigned long long)btrfs_block_group_used(bi
));
84 case BTRFS_STRING_ITEM_KEY
:
85 printk("\t\titem data %.*s\n", btrfs_item_size(item
),
86 btrfs_leaf_data(l
) + btrfs_item_offset(item
));
92 void btrfs_print_tree(struct btrfs_root
*root
, struct buffer_head
*t
)
100 c
= btrfs_buffer_node(t
);
101 nr
= btrfs_header_nritems(&c
->header
);
102 if (btrfs_is_leaf(c
)) {
103 btrfs_print_leaf(root
, (struct btrfs_leaf
*)c
);
106 printk("node %llu level %d total ptrs %d free spc %u\n",
107 (unsigned long long)btrfs_header_blocknr(&c
->header
),
108 btrfs_header_level(&c
->header
), nr
,
109 (u32
)BTRFS_NODEPTRS_PER_BLOCK(root
) - nr
);
110 for (i
= 0; i
< nr
; i
++) {
111 printk("\tkey %d (%llu %u %llu) block %llu\n",
113 (unsigned long long)c
->ptrs
[i
].key
.objectid
,
114 c
->ptrs
[i
].key
.flags
,
115 (unsigned long long)c
->ptrs
[i
].key
.offset
,
116 (unsigned long long)btrfs_node_blockptr(c
, i
));
118 for (i
= 0; i
< nr
; i
++) {
119 struct buffer_head
*next_buf
= read_tree_block(root
,
120 btrfs_node_blockptr(c
, i
));
121 struct btrfs_node
*next
= btrfs_buffer_node(next_buf
);
122 if (btrfs_is_leaf(next
) &&
123 btrfs_header_level(&c
->header
) != 1)
125 if (btrfs_header_level(&next
->header
) !=
126 btrfs_header_level(&c
->header
) - 1)
128 btrfs_print_tree(root
, next_buf
);
129 btrfs_block_release(root
, next_buf
);