2007-06-12 09: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 06:24:44 -05:00
# include "ctree.h"
# include "disk-io.h"
2007-05-02 15:53:43 -04:00
# include "print-tree.h"
2007-02-24 06:24:44 -05:00
2008-03-24 15:01:56 -04: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 15: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 15:01:56 -04: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 15:02:07 -04:00
printk ( " \t \t dev item devid %llu "
" total_bytes %llu bytes used %Lu \n " ,
2008-03-24 15:01:56 -04: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-15 16:14:19 -04:00
void btrfs_print_leaf ( struct btrfs_root * root , struct extent_buffer * l )
2007-02-24 06:24:44 -05:00
{
int i ;
2007-10-15 16:14:19 -04:00
u32 nr = btrfs_header_nritems ( l ) ;
2007-03-12 20:12:07 -04:00
struct btrfs_item * item ;
2007-03-13 10:46:10 -04:00
struct btrfs_extent_item * ei ;
2007-03-13 16:47:54 -04:00
struct btrfs_root_item * ri ;
2007-03-15 15:18:43 -04:00
struct btrfs_dir_item * di ;
2007-03-20 15:57:25 -04:00
struct btrfs_inode_item * ii ;
2007-04-26 16:46:15 -04:00
struct btrfs_block_group_item * bi ;
2007-06-18 09:57:58 -04:00
struct btrfs_file_extent_item * fi ;
2007-10-15 16:14:19 -04:00
struct btrfs_key key ;
struct btrfs_key found_key ;
2007-12-11 09:25:06 -05:00
struct btrfs_extent_ref * ref ;
2008-03-24 15:01:56 -04:00
struct btrfs_dev_extent * dev_extent ;
2007-03-15 12:56:47 -04:00
u32 type ;
2007-03-15 15:18:43 -04:00
2007-06-12 07:50:13 -04:00
printk ( " leaf %llu total ptrs %d free space %d \n " ,
2007-10-15 16:15:53 -04:00
( unsigned long long ) btrfs_header_bytenr ( l ) , nr ,
2007-03-14 14:14:43 -04:00
btrfs_leaf_free_space ( root , l ) ) ;
2007-02-24 06:24:44 -05:00
for ( i = 0 ; i < nr ; i + + ) {
2007-10-15 16: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 07:50:13 -04:00
printk ( " \t item %d key (%llu %x %llu) itemoff %d itemsize %d \n " ,
2007-02-24 06:24:44 -05:00
i ,
2007-10-15 16: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 12:56:47 -04:00
switch ( type ) {
case BTRFS_INODE_ITEM_KEY :
2007-03-20 15:57:25 -04:00
ii = btrfs_item_ptr ( l , i , struct btrfs_inode_item ) ;
2007-06-12 07:50:13 -04:00
printk ( " \t \t inode generation %llu size %llu mode %o \n " ,
2007-10-15 16: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 12:56:47 -04:00
break ;
case BTRFS_DIR_ITEM_KEY :
2007-03-15 15:18:43 -04:00
di = btrfs_item_ptr ( l , i , struct btrfs_dir_item ) ;
2007-10-15 16:14:19 -04:00
btrfs_dir_item_key_to_cpu ( l , di , & found_key ) ;
2007-11-16 11:45:54 -05:00
printk ( " \t \t dir oid %llu type %u \n " ,
2007-10-15 16:14:19 -04:00
( unsigned long long ) found_key . objectid ,
btrfs_dir_type ( l , di ) ) ;
2007-03-15 12:56:47 -04:00
break ;
case BTRFS_ROOT_ITEM_KEY :
ri = btrfs_item_ptr ( l , i , struct btrfs_root_item ) ;
2007-10-15 16: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-15 16:14:19 -04:00
btrfs_disk_root_refs ( l , ri ) ) ;
2007-03-15 12:56:47 -04:00
break ;
case BTRFS_EXTENT_ITEM_KEY :
ei = btrfs_item_ptr ( l , i , struct btrfs_extent_item ) ;
2007-04-10 12:36:36 -04:00
printk ( " \t \t extent data refs %u \n " ,
2007-10-15 16:14:19 -04:00
btrfs_extent_refs ( l , ei ) ) ;
2007-03-15 12:56:47 -04:00
break ;
2007-12-11 09:25:06 -05: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-10-09 11:46:24 -04:00
" owner %llu num_refs %lu \n " ,
2007-12-11 09:25:06 -05: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 13:14:14 -04:00
( unsigned long ) btrfs_ref_num_refs ( l , ref ) ) ;
2007-12-11 09:25:06 -05:00
break ;
2007-06-18 09:57:58 -04:00
case BTRFS_EXTENT_DATA_KEY :
fi = btrfs_item_ptr ( l , i ,
struct btrfs_file_extent_item ) ;
2007-10-15 16:14:19 -04:00
if ( btrfs_file_extent_type ( l , fi ) = =
2007-06-18 09:57:58 -04:00
BTRFS_FILE_EXTENT_INLINE ) {
printk ( " \t \t inline extent data size %u \n " ,
2007-10-15 16:14:19 -04:00
btrfs_file_extent_inline_len ( l , item ) ) ;
2007-06-18 09:57:58 -04:00
break ;
}
2007-10-15 16: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 09:57:58 -04:00
printk ( " \t \t extent data offset %llu nr %llu \n " ,
2007-10-15 16:14:19 -04:00
( unsigned long long ) btrfs_file_extent_offset ( l , fi ) ,
2007-10-15 16:15:53 -04:00
( unsigned long long ) btrfs_file_extent_num_bytes ( l , fi ) ) ;
2007-06-18 09:57:58 -04:00
break ;
2007-04-26 16:46:15 -04:00
case BTRFS_BLOCK_GROUP_ITEM_KEY :
bi = btrfs_item_ptr ( l , i ,
struct btrfs_block_group_item ) ;
2007-06-12 07:50:13 -04:00
printk ( " \t \t block group used %llu \n " ,
2007-10-15 16:14:19 -04:00
( unsigned long long ) btrfs_disk_block_group_used ( l , bi ) ) ;
2007-03-15 12:56:47 -04:00
break ;
2008-03-24 15:01:56 -04: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 15: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 12:56:47 -04:00
} ;
2007-02-24 06:24:44 -05:00
}
}
2007-03-22 12:13:20 -04:00
2007-10-15 16:14:19 -04:00
void btrfs_print_tree ( struct btrfs_root * root , struct extent_buffer * c )
2007-02-24 06:24:44 -05:00
{
2008-04-15 15:41:47 -04:00
int i ; u32 nr ;
2007-10-15 16:14:19 -04:00
struct btrfs_key key ;
2007-10-15 16:15:53 -04:00
int level ;
2007-02-24 06:24:44 -05:00
2007-10-15 16:14:19 -04:00
if ( ! c )
2007-02-24 06:24:44 -05:00
return ;
2007-10-15 16:14:19 -04:00
nr = btrfs_header_nritems ( c ) ;
2007-10-15 16:15:53 -04:00
level = btrfs_header_level ( c ) ;
if ( level = = 0 ) {
2007-10-15 16:14:19 -04:00
btrfs_print_leaf ( root , c ) ;
2007-02-24 06:24:44 -05:00
return ;
}
2007-06-12 07:50:13 -04:00
printk ( " node %llu level %d total ptrs %d free spc %u \n " ,
2007-10-15 16:15:53 -04:00
( unsigned long long ) btrfs_header_bytenr ( c ) ,
2007-10-15 16:14:19 -04:00
btrfs_header_level ( c ) , nr ,
2007-03-22 12:13:20 -04:00
( u32 ) BTRFS_NODEPTRS_PER_BLOCK ( root ) - nr ) ;
2007-02-24 06:24:44 -05:00
for ( i = 0 ; i < nr ; i + + ) {
2007-10-15 16:14:19 -04:00
btrfs_node_key_to_cpu ( c , & key , i ) ;
2007-06-12 07:50:13 -04:00
printk ( " \t key %d (%llu %u %llu) block %llu \n " ,
2007-02-24 06:24:44 -05:00
i ,
2007-10-15 16:14:19 -04:00
( unsigned long long ) key . objectid ,
key . type ,
( unsigned long long ) key . offset ,
2007-06-12 07:50:13 -04:00
( unsigned long long ) btrfs_node_blockptr ( c , i ) ) ;
2007-02-24 06:24:44 -05:00
}
for ( i = 0 ; i < nr ; i + + ) {
2007-10-15 16:14:19 -04:00
struct extent_buffer * next = read_tree_block ( root ,
2007-10-15 16:15:53 -04:00
btrfs_node_blockptr ( c , i ) ,
2008-05-12 12:59:19 -04:00
btrfs_level_size ( root , level - 1 ) ,
btrfs_node_ptr_generation ( c , i ) ) ;
2007-03-12 12:01:18 -04:00
if ( btrfs_is_leaf ( next ) & &
2007-10-15 16:14:19 -04:00
btrfs_header_level ( c ) ! = 1 )
2007-02-24 06:24:44 -05:00
BUG ( ) ;
2007-10-15 16:14:19 -04:00
if ( btrfs_header_level ( next ) ! =
btrfs_header_level ( c ) - 1 )
2007-02-24 06:24:44 -05:00
BUG ( ) ;
2007-10-15 16:14:19 -04:00
btrfs_print_tree ( root , next ) ;
free_extent_buffer ( next ) ;
2007-02-24 06:24:44 -05:00
}
}