2007-06-12 17:07:21 +04:00
/*
* Copyright ( C ) 2007 Oracle . All rights reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public
* License v2 as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public
* License along with this program ; if not , write to the
* Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
* Boston , MA 021110 - 1307 , USA .
*/
2007-02-24 14:24:44 +03:00
# include "ctree.h"
# include "disk-io.h"
2007-05-02 23:53:43 +04:00
# include "print-tree.h"
2007-02-24 14:24:44 +03:00
2008-03-24 22:01:56 +03:00
static void print_chunk ( struct extent_buffer * eb , struct btrfs_chunk * chunk )
{
int num_stripes = btrfs_chunk_num_stripes ( eb , chunk ) ;
int i ;
2008-04-15 23:41:47 +04:00
printk ( " \t \t chunk length %llu owner %llu type %llu num_stripes %d \n " ,
( unsigned long long ) btrfs_chunk_length ( eb , chunk ) ,
2008-03-24 22:01:56 +03:00
( unsigned long long ) btrfs_chunk_owner ( eb , chunk ) ,
( unsigned long long ) btrfs_chunk_type ( eb , chunk ) ,
num_stripes ) ;
for ( i = 0 ; i < num_stripes ; i + + ) {
printk ( " \t \t \t stripe %d devid %llu offset %llu \n " , i ,
( unsigned long long ) btrfs_stripe_devid_nr ( eb , chunk , i ) ,
( unsigned long long ) btrfs_stripe_offset_nr ( eb , chunk , i ) ) ;
}
}
static void print_dev_item ( struct extent_buffer * eb ,
struct btrfs_dev_item * dev_item )
{
2008-03-24 22:02:07 +03:00
printk ( " \t \t dev item devid %llu "
" total_bytes %llu bytes used %Lu \n " ,
2008-03-24 22:01:56 +03:00
( unsigned long long ) btrfs_device_id ( eb , dev_item ) ,
( unsigned long long ) btrfs_device_total_bytes ( eb , dev_item ) ,
( unsigned long long ) btrfs_device_bytes_used ( eb , dev_item ) ) ;
}
2007-10-16 00:14:19 +04:00
void btrfs_print_leaf ( struct btrfs_root * root , struct extent_buffer * l )
2007-02-24 14:24:44 +03:00
{
int i ;
2007-10-16 00:14:19 +04:00
u32 nr = btrfs_header_nritems ( l ) ;
2007-03-13 03:12:07 +03:00
struct btrfs_item * item ;
2007-03-13 17:46:10 +03:00
struct btrfs_extent_item * ei ;
2007-03-13 23:47:54 +03:00
struct btrfs_root_item * ri ;
2007-03-15 22:18:43 +03:00
struct btrfs_dir_item * di ;
2007-03-20 22:57:25 +03:00
struct btrfs_inode_item * ii ;
2007-04-27 00:46:15 +04:00
struct btrfs_block_group_item * bi ;
2007-06-18 17:57:58 +04:00
struct btrfs_file_extent_item * fi ;
2007-10-16 00:14:19 +04:00
struct btrfs_key key ;
struct btrfs_key found_key ;
2007-12-11 17:25:06 +03:00
struct btrfs_extent_ref * ref ;
2008-03-24 22:01:56 +03:00
struct btrfs_dev_extent * dev_extent ;
2007-03-15 19:56:47 +03:00
u32 type ;
2007-03-15 22:18:43 +03:00
2007-06-12 15:50:13 +04:00
printk ( " leaf %llu total ptrs %d free space %d \n " ,
2007-10-16 00:15:53 +04:00
( unsigned long long ) btrfs_header_bytenr ( l ) , nr ,
2007-03-14 21:14:43 +03:00
btrfs_leaf_free_space ( root , l ) ) ;
2007-02-24 14:24:44 +03:00
for ( i = 0 ; i < nr ; i + + ) {
2007-10-16 00:14:19 +04:00
item = btrfs_item_nr ( l , i ) ;
btrfs_item_key_to_cpu ( l , & key , i ) ;
type = btrfs_key_type ( & key ) ;
2007-06-12 15:50:13 +04:00
printk ( " \t item %d key (%llu %x %llu) itemoff %d itemsize %d \n " ,
2007-02-24 14:24:44 +03:00
i ,
2007-10-16 00:14:19 +04:00
( unsigned long long ) key . objectid , type ,
( unsigned long long ) key . offset ,
btrfs_item_offset ( l , item ) , btrfs_item_size ( l , item ) ) ;
2007-03-15 19:56:47 +03:00
switch ( type ) {
case BTRFS_INODE_ITEM_KEY :
2007-03-20 22:57:25 +03:00
ii = btrfs_item_ptr ( l , i , struct btrfs_inode_item ) ;
2007-06-12 15:50:13 +04:00
printk ( " \t \t inode generation %llu size %llu mode %o \n " ,
2007-10-16 00:14:19 +04:00
( unsigned long long ) btrfs_inode_generation ( l , ii ) ,
( unsigned long long ) btrfs_inode_size ( l , ii ) ,
btrfs_inode_mode ( l , ii ) ) ;
2007-03-15 19:56:47 +03:00
break ;
case BTRFS_DIR_ITEM_KEY :
2007-03-15 22:18:43 +03:00
di = btrfs_item_ptr ( l , i , struct btrfs_dir_item ) ;
2007-10-16 00:14:19 +04:00
btrfs_dir_item_key_to_cpu ( l , di , & found_key ) ;
2007-11-16 19:45:54 +03:00
printk ( " \t \t dir oid %llu type %u \n " ,
2007-10-16 00:14:19 +04:00
( unsigned long long ) found_key . objectid ,
btrfs_dir_type ( l , di ) ) ;
2007-03-15 19:56:47 +03:00
break ;
case BTRFS_ROOT_ITEM_KEY :
ri = btrfs_item_ptr ( l , i , struct btrfs_root_item ) ;
2007-10-16 00:15:53 +04:00
printk ( " \t \t root data bytenr %llu refs %u \n " ,
( unsigned long long ) btrfs_disk_root_bytenr ( l , ri ) ,
2007-10-16 00:14:19 +04:00
btrfs_disk_root_refs ( l , ri ) ) ;
2007-03-15 19:56:47 +03:00
break ;
case BTRFS_EXTENT_ITEM_KEY :
ei = btrfs_item_ptr ( l , i , struct btrfs_extent_item ) ;
2007-04-10 20:36:36 +04:00
printk ( " \t \t extent data refs %u \n " ,
2007-10-16 00:14:19 +04:00
btrfs_extent_refs ( l , ei ) ) ;
2007-03-15 19:56:47 +03:00
break ;
2007-12-11 17:25:06 +03:00
case BTRFS_EXTENT_REF_KEY :
ref = btrfs_item_ptr ( l , i , struct btrfs_extent_ref ) ;
printk ( " \t \t extent back ref root %llu gen %llu "
2008-09-23 21:14:14 +04:00
" owner %llu offset %llu num_refs %lu \n " ,
2007-12-11 17:25:06 +03:00
( unsigned long long ) btrfs_ref_root ( l , ref ) ,
( unsigned long long ) btrfs_ref_generation ( l , ref ) ,
( unsigned long long ) btrfs_ref_objectid ( l , ref ) ,
2008-09-23 21:14:14 +04:00
( unsigned long long ) btrfs_ref_offset ( l , ref ) ,
( unsigned long ) btrfs_ref_num_refs ( l , ref ) ) ;
2007-12-11 17:25:06 +03:00
break ;
2007-06-18 17:57:58 +04:00
case BTRFS_EXTENT_DATA_KEY :
fi = btrfs_item_ptr ( l , i ,
struct btrfs_file_extent_item ) ;
2007-10-16 00:14:19 +04:00
if ( btrfs_file_extent_type ( l , fi ) = =
2007-06-18 17:57:58 +04:00
BTRFS_FILE_EXTENT_INLINE ) {
printk ( " \t \t inline extent data size %u \n " ,
2007-10-16 00:14:19 +04:00
btrfs_file_extent_inline_len ( l , item ) ) ;
2007-06-18 17:57:58 +04:00
break ;
}
2007-10-16 00:15:53 +04:00
printk ( " \t \t extent data disk bytenr %llu nr %llu \n " ,
( unsigned long long ) btrfs_file_extent_disk_bytenr ( l , fi ) ,
( unsigned long long ) btrfs_file_extent_disk_num_bytes ( l , fi ) ) ;
2007-06-18 17:57:58 +04:00
printk ( " \t \t extent data offset %llu nr %llu \n " ,
2007-10-16 00:14:19 +04:00
( unsigned long long ) btrfs_file_extent_offset ( l , fi ) ,
2007-10-16 00:15:53 +04:00
( unsigned long long ) btrfs_file_extent_num_bytes ( l , fi ) ) ;
2007-06-18 17:57:58 +04:00
break ;
2007-04-27 00:46:15 +04:00
case BTRFS_BLOCK_GROUP_ITEM_KEY :
bi = btrfs_item_ptr ( l , i ,
struct btrfs_block_group_item ) ;
2007-06-12 15:50:13 +04:00
printk ( " \t \t block group used %llu \n " ,
2007-10-16 00:14:19 +04:00
( unsigned long long ) btrfs_disk_block_group_used ( l , bi ) ) ;
2007-03-15 19:56:47 +03:00
break ;
2008-03-24 22:01:56 +03:00
case BTRFS_CHUNK_ITEM_KEY :
print_chunk ( l , btrfs_item_ptr ( l , i , struct btrfs_chunk ) ) ;
break ;
case BTRFS_DEV_ITEM_KEY :
print_dev_item ( l , btrfs_item_ptr ( l , i ,
struct btrfs_dev_item ) ) ;
break ;
case BTRFS_DEV_EXTENT_KEY :
dev_extent = btrfs_item_ptr ( l , i ,
struct btrfs_dev_extent ) ;
2008-04-15 23:41:47 +04:00
printk ( " \t \t dev extent chunk_tree %llu \n "
" \t \t chunk objectid %llu chunk offset %llu "
" length %llu \n " ,
( unsigned long long )
btrfs_dev_extent_chunk_tree ( l , dev_extent ) ,
( unsigned long long )
btrfs_dev_extent_chunk_objectid ( l , dev_extent ) ,
( unsigned long long )
btrfs_dev_extent_chunk_offset ( l , dev_extent ) ,
( unsigned long long )
btrfs_dev_extent_length ( l , dev_extent ) ) ;
2007-03-15 19:56:47 +03:00
} ;
2007-02-24 14:24:44 +03:00
}
}
2007-03-22 19:13:20 +03:00
2007-10-16 00:14:19 +04:00
void btrfs_print_tree ( struct btrfs_root * root , struct extent_buffer * c )
2007-02-24 14:24:44 +03:00
{
2008-04-15 23:41:47 +04:00
int i ; u32 nr ;
2007-10-16 00:14:19 +04:00
struct btrfs_key key ;
2007-10-16 00:15:53 +04:00
int level ;
2007-02-24 14:24:44 +03:00
2007-10-16 00:14:19 +04:00
if ( ! c )
2007-02-24 14:24:44 +03:00
return ;
2007-10-16 00:14:19 +04:00
nr = btrfs_header_nritems ( c ) ;
2007-10-16 00:15:53 +04:00
level = btrfs_header_level ( c ) ;
if ( level = = 0 ) {
2007-10-16 00:14:19 +04:00
btrfs_print_leaf ( root , c ) ;
2007-02-24 14:24:44 +03:00
return ;
}
2007-06-12 15:50:13 +04:00
printk ( " node %llu level %d total ptrs %d free spc %u \n " ,
2007-10-16 00:15:53 +04:00
( unsigned long long ) btrfs_header_bytenr ( c ) ,
2007-10-16 00:14:19 +04:00
btrfs_header_level ( c ) , nr ,
2007-03-22 19:13:20 +03:00
( u32 ) BTRFS_NODEPTRS_PER_BLOCK ( root ) - nr ) ;
2007-02-24 14:24:44 +03:00
for ( i = 0 ; i < nr ; i + + ) {
2007-10-16 00:14:19 +04:00
btrfs_node_key_to_cpu ( c , & key , i ) ;
2007-06-12 15:50:13 +04:00
printk ( " \t key %d (%llu %u %llu) block %llu \n " ,
2007-02-24 14:24:44 +03:00
i ,
2007-10-16 00:14:19 +04:00
( unsigned long long ) key . objectid ,
key . type ,
( unsigned long long ) key . offset ,
2007-06-12 15:50:13 +04:00
( unsigned long long ) btrfs_node_blockptr ( c , i ) ) ;
2007-02-24 14:24:44 +03:00
}
for ( i = 0 ; i < nr ; i + + ) {
2007-10-16 00:14:19 +04:00
struct extent_buffer * next = read_tree_block ( root ,
2007-10-16 00:15:53 +04:00
btrfs_node_blockptr ( c , i ) ,
2008-05-12 20:59:19 +04:00
btrfs_level_size ( root , level - 1 ) ,
btrfs_node_ptr_generation ( c , i ) ) ;
2007-03-12 19:01:18 +03:00
if ( btrfs_is_leaf ( next ) & &
2007-10-16 00:14:19 +04:00
btrfs_header_level ( c ) ! = 1 )
2007-02-24 14:24:44 +03:00
BUG ( ) ;
2007-10-16 00:14:19 +04:00
if ( btrfs_header_level ( next ) ! =
btrfs_header_level ( c ) - 1 )
2007-02-24 14:24:44 +03:00
BUG ( ) ;
2007-10-16 00:14:19 +04:00
btrfs_print_tree ( root , next ) ;
free_extent_buffer ( next ) ;
2007-02-24 14:24:44 +03:00
}
}