2007-03-21 18:12:56 +03:00
# include <linux/module.h>
2007-02-24 14:24:44 +03:00
# include "ctree.h"
# include "disk-io.h"
2007-03-14 21:14:43 +03:00
void btrfs_print_leaf ( struct btrfs_root * root , struct btrfs_leaf * l )
2007-02-24 14:24:44 +03:00
{
int i ;
2007-03-12 19:01:18 +03:00
u32 nr = btrfs_header_nritems ( & l - > header ) ;
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 21:38:32 +03:00
struct btrfs_inode_map_item * mi ;
2007-03-20 22:57:25 +03:00
struct btrfs_inode_item * ii ;
2007-03-15 19:56:47 +03:00
u32 type ;
2007-03-15 22:18:43 +03:00
2007-03-21 18:12:56 +03:00
printk ( " leaf %Lu total ptrs %d free space %d \n " ,
2007-03-14 21:14:43 +03:00
btrfs_header_blocknr ( & l - > header ) , nr ,
btrfs_leaf_free_space ( root , l ) ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
for ( i = 0 ; i < nr ; i + + ) {
item = l - > items + i ;
2007-03-15 19:56:47 +03:00
type = btrfs_disk_key_type ( & item - > key ) ;
2007-03-21 18:12:56 +03:00
printk ( " \t item %d key (%Lu %u %Lu) itemoff %d itemsize %d \n " ,
2007-02-24 14:24:44 +03:00
i ,
2007-03-15 19:56:47 +03:00
btrfs_disk_key_objectid ( & item - > key ) ,
btrfs_disk_key_flags ( & item - > key ) ,
2007-03-16 15:46:49 +03:00
btrfs_disk_key_offset ( & item - > key ) ,
2007-03-13 03:12:07 +03:00
btrfs_item_offset ( item ) ,
btrfs_item_size ( 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-03-21 18:12:56 +03:00
printk ( " \t \t inode generation %Lu size %Lu mode %o \n " ,
2007-03-20 22:57:25 +03:00
btrfs_inode_generation ( ii ) ,
2007-03-21 18:12:56 +03:00
btrfs_inode_size ( ii ) ,
btrfs_inode_mode ( 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-03-21 18:12:56 +03:00
printk ( " \t \t dir oid %Lu flags %u type %u \n " ,
2007-03-15 22:18:43 +03:00
btrfs_dir_objectid ( di ) ,
btrfs_dir_flags ( di ) ,
btrfs_dir_type ( di ) ) ;
2007-03-21 18:12:56 +03:00
printk ( " \t \t name %.*s \n " ,
2007-03-20 21:38:32 +03:00
btrfs_dir_name_len ( di ) , ( char * ) ( di + 1 ) ) ;
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-03-21 18:12:56 +03:00
printk ( " \t \t root data blocknr %Lu refs %u \n " ,
2007-03-15 19:56:47 +03:00
btrfs_root_blocknr ( ri ) , btrfs_root_refs ( ri ) ) ;
break ;
case BTRFS_EXTENT_ITEM_KEY :
ei = btrfs_item_ptr ( l , i , struct btrfs_extent_item ) ;
2007-03-21 18:12:56 +03:00
printk ( " \t \t extent data refs %u owner %Lu \n " ,
2007-03-15 19:56:47 +03:00
btrfs_extent_refs ( ei ) , btrfs_extent_owner ( ei ) ) ;
break ;
2007-03-20 21:38:32 +03:00
case BTRFS_INODE_MAP_ITEM_KEY :
mi = btrfs_item_ptr ( l , i , struct btrfs_inode_map_item ) ;
2007-03-21 18:12:56 +03:00
printk ( " \t \t inode map key %Lu %u %Lu \n " ,
2007-03-20 21:38:32 +03:00
btrfs_disk_key_objectid ( & mi - > key ) ,
btrfs_disk_key_flags ( & mi - > key ) ,
btrfs_disk_key_offset ( & mi - > key ) ) ;
break ;
2007-03-15 19:56:47 +03:00
case BTRFS_STRING_ITEM_KEY :
2007-03-21 18:12:56 +03:00
printk ( " \t \t item data %.*s \n " , btrfs_item_size ( item ) ,
2007-03-15 19:56:47 +03:00
btrfs_leaf_data ( l ) + btrfs_item_offset ( item ) ) ;
break ;
} ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
}
}
2007-03-13 17:46:10 +03:00
void btrfs_print_tree ( struct btrfs_root * root , struct btrfs_buffer * t )
2007-02-24 14:24:44 +03:00
{
int i ;
2007-03-12 19:01:18 +03:00
u32 nr ;
2007-03-13 17:46:10 +03:00
struct btrfs_node * c ;
2007-02-24 14:24:44 +03:00
if ( ! t )
return ;
c = & t - > node ;
2007-03-12 19:01:18 +03:00
nr = btrfs_header_nritems ( & c - > header ) ;
if ( btrfs_is_leaf ( c ) ) {
2007-03-14 21:14:43 +03:00
btrfs_print_leaf ( root , ( struct btrfs_leaf * ) c ) ;
2007-02-24 14:24:44 +03:00
return ;
}
2007-03-21 18:12:56 +03:00
printk ( " node %Lu level %d total ptrs %d free spc %u \n " , t - > blocknr ,
2007-03-12 19:01:18 +03:00
btrfs_header_level ( & c - > header ) , nr ,
2007-03-14 21:14:43 +03:00
( u32 ) BTRFS_NODEPTRS_PER_BLOCK ( root ) - nr ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
for ( i = 0 ; i < nr ; i + + ) {
2007-03-21 18:12:56 +03:00
printk ( " \t key %d (%Lu %u %Lu) block %Lu \n " ,
2007-02-24 14:24:44 +03:00
i ,
2007-03-14 21:26:53 +03:00
c - > ptrs [ i ] . key . objectid ,
c - > ptrs [ i ] . key . flags ,
2007-03-16 15:46:49 +03:00
c - > ptrs [ i ] . key . offset ,
2007-03-14 21:26:53 +03:00
btrfs_node_blockptr ( c , i ) ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
}
for ( i = 0 ; i < nr ; i + + ) {
2007-03-13 17:46:10 +03:00
struct btrfs_buffer * next_buf = read_tree_block ( root ,
2007-03-13 16:28:32 +03:00
btrfs_node_blockptr ( c , i ) ) ;
2007-03-13 17:46:10 +03:00
struct btrfs_node * next = & next_buf - > node ;
2007-03-12 19:01:18 +03:00
if ( btrfs_is_leaf ( next ) & &
btrfs_header_level ( & c - > header ) ! = 1 )
2007-02-24 14:24:44 +03:00
BUG ( ) ;
2007-03-12 19:01:18 +03:00
if ( btrfs_header_level ( & next - > header ) ! =
btrfs_header_level ( & c - > header ) - 1 )
2007-02-24 14:24:44 +03:00
BUG ( ) ;
2007-03-13 17:46:10 +03:00
btrfs_print_tree ( root , next_buf ) ;
btrfs_block_release ( root , next_buf ) ;
2007-02-24 14:24:44 +03:00
}
}