1313#include "volumes.h"
1414#include "raid-stripe-tree.h"
1515
16+ /*
17+ * Large enough buffer size for the stringification of any key type yet short
18+ * enough to use the stack and avoid allocations.
19+ */
20+ #define KEY_TYPE_BUF_SIZE 32
21+
1622struct root_name_map {
1723 u64 id ;
1824 const char * name ;
@@ -366,6 +372,60 @@ static void print_file_extent_item(const struct extent_buffer *eb, int i)
366372 btrfs_file_extent_compression (eb , fi ));
367373}
368374
375+ static void key_type_string (const struct btrfs_key * key , char * buf , int buf_size )
376+ {
377+ static const char * key_to_str [256 ] = {
378+ [BTRFS_INODE_ITEM_KEY ] = "INODE_ITEM" ,
379+ [BTRFS_INODE_REF_KEY ] = "INODE_REF" ,
380+ [BTRFS_INODE_EXTREF_KEY ] = "INODE_EXTREF" ,
381+ [BTRFS_DIR_ITEM_KEY ] = "DIR_ITEM" ,
382+ [BTRFS_DIR_INDEX_KEY ] = "DIR_INDEX" ,
383+ [BTRFS_DIR_LOG_ITEM_KEY ] = "DIR_LOG_ITEM" ,
384+ [BTRFS_DIR_LOG_INDEX_KEY ] = "DIR_LOG_INDEX" ,
385+ [BTRFS_XATTR_ITEM_KEY ] = "XATTR_ITEM" ,
386+ [BTRFS_VERITY_DESC_ITEM_KEY ] = "VERITY_DESC_ITEM" ,
387+ [BTRFS_VERITY_MERKLE_ITEM_KEY ] = "VERITY_MERKLE_ITEM" ,
388+ [BTRFS_ORPHAN_ITEM_KEY ] = "ORPHAN_ITEM" ,
389+ [BTRFS_ROOT_ITEM_KEY ] = "ROOT_ITEM" ,
390+ [BTRFS_ROOT_REF_KEY ] = "ROOT_REF" ,
391+ [BTRFS_ROOT_BACKREF_KEY ] = "ROOT_BACKREF" ,
392+ [BTRFS_EXTENT_ITEM_KEY ] = "EXTENT_ITEM" ,
393+ [BTRFS_METADATA_ITEM_KEY ] = "METADATA_ITEM" ,
394+ [BTRFS_TREE_BLOCK_REF_KEY ] = "TREE_BLOCK_REF" ,
395+ [BTRFS_SHARED_BLOCK_REF_KEY ] = "SHARED_BLOCK_REF" ,
396+ [BTRFS_EXTENT_DATA_REF_KEY ] = "EXTENT_DATA_REF" ,
397+ [BTRFS_SHARED_DATA_REF_KEY ] = "SHARED_DATA_REF" ,
398+ [BTRFS_EXTENT_OWNER_REF_KEY ] = "EXTENT_OWNER_REF" ,
399+ [BTRFS_EXTENT_CSUM_KEY ] = "EXTENT_CSUM" ,
400+ [BTRFS_EXTENT_DATA_KEY ] = "EXTENT_DATA" ,
401+ [BTRFS_BLOCK_GROUP_ITEM_KEY ] = "BLOCK_GROUP_ITEM" ,
402+ [BTRFS_FREE_SPACE_INFO_KEY ] = "FREE_SPACE_INFO" ,
403+ [BTRFS_FREE_SPACE_EXTENT_KEY ] = "FREE_SPACE_EXTENT" ,
404+ [BTRFS_FREE_SPACE_BITMAP_KEY ] = "FREE_SPACE_BITMAP" ,
405+ [BTRFS_CHUNK_ITEM_KEY ] = "CHUNK_ITEM" ,
406+ [BTRFS_DEV_ITEM_KEY ] = "DEV_ITEM" ,
407+ [BTRFS_DEV_EXTENT_KEY ] = "DEV_EXTENT" ,
408+ [BTRFS_TEMPORARY_ITEM_KEY ] = "TEMPORARY_ITEM" ,
409+ [BTRFS_DEV_REPLACE_KEY ] = "DEV_REPLACE" ,
410+ [BTRFS_STRING_ITEM_KEY ] = "STRING_ITEM" ,
411+ [BTRFS_QGROUP_STATUS_KEY ] = "QGROUP_STATUS" ,
412+ [BTRFS_QGROUP_RELATION_KEY ] = "QGROUP_RELATION" ,
413+ [BTRFS_QGROUP_INFO_KEY ] = "QGROUP_INFO" ,
414+ [BTRFS_QGROUP_LIMIT_KEY ] = "QGROUP_LIMIT" ,
415+ [BTRFS_PERSISTENT_ITEM_KEY ] = "PERSISTENT_ITEM" ,
416+ [BTRFS_UUID_KEY_SUBVOL ] = "UUID_KEY_SUBVOL" ,
417+ [BTRFS_UUID_KEY_RECEIVED_SUBVOL ] = "UUID_KEY_RECEIVED_SUBVOL" ,
418+ [BTRFS_RAID_STRIPE_KEY ] = "RAID_STRIPE" ,
419+ };
420+
421+ if (key -> type == 0 && key -> objectid == BTRFS_FREE_SPACE_OBJECTID )
422+ scnprintf (buf , buf_size , "UNTYPED" );
423+ else if (key_to_str [key -> type ])
424+ scnprintf (buf , buf_size , key_to_str [key -> type ]);
425+ else
426+ scnprintf (buf , buf_size , "UNKNOWN.%d" , key -> type );
427+ }
428+
369429void btrfs_print_leaf (const struct extent_buffer * l )
370430{
371431 struct btrfs_fs_info * fs_info ;
@@ -390,10 +450,14 @@ void btrfs_print_leaf(const struct extent_buffer *l)
390450 btrfs_leaf_free_space (l ), btrfs_header_owner (l ));
391451 print_eb_refs_lock (l );
392452 for (i = 0 ; i < nr ; i ++ ) {
453+ char key_buf [KEY_TYPE_BUF_SIZE ];
454+
393455 btrfs_item_key_to_cpu (l , & key , i );
394456 type = key .type ;
395- pr_info ("\titem %d key (%llu %u %llu) itemoff %d itemsize %d\n" ,
396- i , key .objectid , type , key .offset ,
457+ key_type_string (& key , key_buf , KEY_TYPE_BUF_SIZE );
458+
459+ pr_info ("\titem %d key (%llu %s %llu) itemoff %d itemsize %d\n" ,
460+ i , key .objectid , key_buf , key .offset ,
397461 btrfs_item_offset (l , i ), btrfs_item_size (l , i ));
398462 switch (type ) {
399463 case BTRFS_INODE_ITEM_KEY :
0 commit comments