2007-02-24 14:24:44 +03:00
# include <stdio.h>
# include <stdlib.h>
# include "kerncompat.h"
# include "radix-tree.h"
# include "ctree.h"
# include "disk-io.h"
void print_leaf ( struct leaf * l )
{
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-02-24 14:24:44 +03:00
struct extent_item * ei ;
2007-03-12 19:01:18 +03:00
printf ( " leaf %Lu total ptrs %d free space %d \n " ,
btrfs_header_blocknr ( & l - > header ) , nr , leaf_free_space ( l ) ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
for ( i = 0 ; i < nr ; i + + ) {
item = l - > items + i ;
2007-02-26 18:55:01 +03:00
printf ( " \t item %d key (%Lu %u %Lu) itemoff %d itemsize %d \n " ,
2007-02-24 14:24:44 +03:00
i ,
2007-03-13 03:12:07 +03:00
btrfs_key_objectid ( & item - > key ) ,
btrfs_key_flags ( & item - > key ) ,
btrfs_key_offset ( & item - > key ) ,
btrfs_item_offset ( item ) ,
btrfs_item_size ( item ) ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
2007-03-13 03:12:07 +03:00
printf ( " \t \t item data %.*s \n " , btrfs_item_size ( item ) ,
l - > data + btrfs_item_offset ( item ) ) ;
ei = ( struct extent_item * ) ( l - > data + btrfs_item_offset ( item ) ) ;
2007-03-07 04:08:01 +03:00
printf ( " \t \t extent data refs %u owner %Lu \n " , ei - > refs ,
ei - > owner ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
}
}
void print_tree ( struct ctree_root * root , struct tree_buffer * t )
{
int i ;
2007-03-12 19:01:18 +03:00
u32 nr ;
2007-02-24 14:24:44 +03:00
struct node * c ;
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-02-24 14:24:44 +03:00
print_leaf ( ( struct leaf * ) c ) ;
return ;
}
2007-02-26 18:55:42 +03:00
printf ( " 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 ,
( u32 ) NODEPTRS_PER_BLOCK - nr ) ;
2007-02-24 14:24:44 +03:00
fflush ( stdout ) ;
for ( i = 0 ; i < nr ; i + + ) {
2007-02-26 18:55:01 +03:00
printf ( " \t key %d (%Lu %u %Lu) block %Lu \n " ,
2007-02-24 14:24:44 +03:00
i ,
c - > keys [ i ] . objectid , c - > keys [ i ] . flags , c - > keys [ i ] . offset ,
c - > blockptrs [ i ] ) ;
fflush ( stdout ) ;
}
for ( i = 0 ; i < nr ; i + + ) {
struct tree_buffer * next_buf = read_tree_block ( root ,
c - > blockptrs [ i ] ) ;
struct 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 ( ) ;
print_tree ( root , next_buf ) ;
tree_block_release ( root , next_buf ) ;
}
}