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-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-05-02 23:53:43 +04:00
# include "print-tree.h"
2007-02-24 14:24:44 +03:00
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 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-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 " ,
( unsigned long long ) btrfs_header_blocknr ( & l - > header ) , 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 + + ) {
item = l - > items + i ;
2007-03-15 19:56:47 +03:00
type = btrfs_disk_key_type ( & item - > 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-06-12 15:50:13 +04:00
( unsigned long long ) btrfs_disk_key_objectid ( & item - > key ) ,
2007-03-15 19:56:47 +03:00
btrfs_disk_key_flags ( & item - > key ) ,
2007-06-12 15:50:13 +04:00
( unsigned long long ) 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-06-12 15:50:13 +04:00
printk ( " \t \t inode generation %llu size %llu mode %o \n " ,
( unsigned long long ) btrfs_inode_generation ( ii ) ,
( unsigned long long ) btrfs_inode_size ( ii ) ,
2007-03-21 18:12:56 +03:00
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-06-12 15:50:13 +04:00
printk ( " \t \t dir oid %llu flags %u type %u \n " ,
( unsigned long long ) btrfs_disk_key_objectid (
& di - > location ) ,
2007-03-15 22:18:43 +03:00
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-06-12 15:50:13 +04:00
printk ( " \t \t root data blocknr %llu refs %u \n " ,
( unsigned long long ) btrfs_root_blocknr ( ri ) ,
btrfs_root_refs ( 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 " ,
btrfs_extent_refs ( ei ) ) ;
2007-03-15 19:56:47 +03: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 " ,
( unsigned long long ) btrfs_block_group_used ( bi ) ) ;
2007-04-27 00:46:15 +04:00
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
}
}
2007-03-22 19:13:20 +03:00
void btrfs_print_tree ( struct btrfs_root * root , struct buffer_head * 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 ;
2007-03-22 19:13:20 +03:00
c = btrfs_buffer_node ( t ) ;
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-06-12 15:50:13 +04:00
printk ( " node %llu level %d total ptrs %d free spc %u \n " ,
( unsigned long long ) btrfs_header_blocknr ( & c - > header ) ,
2007-03-22 19:13:20 +03:00
btrfs_header_level ( & c - > header ) , nr ,
( u32 ) BTRFS_NODEPTRS_PER_BLOCK ( root ) - nr ) ;
2007-02-24 14:24:44 +03:00
for ( i = 0 ; i < nr ; 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-06-12 15:50:13 +04:00
( unsigned long long ) c - > ptrs [ i ] . key . objectid ,
2007-03-14 21:26:53 +03:00
c - > ptrs [ i ] . key . flags ,
2007-06-12 15:50:13 +04:00
( unsigned long long ) c - > ptrs [ i ] . key . offset ,
( unsigned long long ) btrfs_node_blockptr ( c , i ) ) ;
2007-02-24 14:24:44 +03:00
}
for ( i = 0 ; i < nr ; i + + ) {
2007-03-22 19:13:20 +03:00
struct buffer_head * next_buf = read_tree_block ( root ,
2007-03-13 16:28:32 +03:00
btrfs_node_blockptr ( c , i ) ) ;
2007-03-22 19:13:20 +03:00
struct btrfs_node * next = btrfs_buffer_node ( next_buf ) ;
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
}
}