void btrfs_print_key(struct btrfs_disk_key *disk_key) { u64 objectid = btrfs_disk_key_objectid(disk_key); u8 type = btrfs_disk_key_type(disk_key); u64 offset = btrfs_disk_key_offset(disk_key); printf("key ("); print_objectid(objectid, type); printf(" "); print_key_type(objectid, type); switch (type) { case BTRFS_QGROUP_RELATION_KEY: case BTRFS_QGROUP_INFO_KEY: case BTRFS_QGROUP_LIMIT_KEY: printf(" %llu/%llu)", (unsigned long long)(offset >> 48), (unsigned long long)(offset & ((1ll << 48) - 1))); break; default: if (offset == (u64)-1) printf(" -1)"); else printf(" %llu)", (unsigned long long)offset); break; } }
void btrfs_print_key(struct btrfs_disk_key *disk_key) { u64 objectid = btrfs_disk_key_objectid(disk_key); u8 type = btrfs_disk_key_type(disk_key); u64 offset = btrfs_disk_key_offset(disk_key); printf("key ("); print_objectid(objectid, type); printf(" "); print_key_type(objectid, type); switch (type) { case BTRFS_QGROUP_RELATION_KEY: case BTRFS_QGROUP_INFO_KEY: case BTRFS_QGROUP_LIMIT_KEY: printf(" %llu/%llu)", btrfs_qgroup_level(offset), btrfs_qgroup_subvid(offset)); break; case BTRFS_UUID_KEY_SUBVOL: case BTRFS_UUID_KEY_RECEIVED_SUBVOL: printf(" 0x%016llx)", (unsigned long long)offset); break; default: if (offset == (u64)-1) printf(" -1)"); else printf(" %llu)", (unsigned long long)offset); break; } }
void btrfs_print_key(struct btrfs_disk_key *disk_key) { u8 type; printf("key ("); type = btrfs_disk_key_type(disk_key); print_objectid((unsigned long long)btrfs_disk_key_objectid(disk_key), type); printf(" "); print_key_type(type); printf(" %llu)", (unsigned long long)btrfs_disk_key_offset(disk_key)); }
static void print_extent_item(struct extent_buffer *eb, int slot) { struct btrfs_extent_item *ei; struct btrfs_extent_inline_ref *iref; struct btrfs_extent_data_ref *dref; struct btrfs_shared_data_ref *sref; struct btrfs_disk_key key; unsigned long end; unsigned long ptr; int type; u32 item_size = btrfs_item_size_nr(eb, slot); u64 flags; u64 offset; if (item_size < sizeof(*ei)) { #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 struct btrfs_extent_item_v0 *ei0; BUG_ON(item_size != sizeof(*ei0)); ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0); printk(KERN_INFO "\t\textent refs %u\n", btrfs_extent_refs_v0(eb, ei0)); return; #else BUG(); #endif } ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item); flags = btrfs_extent_flags(eb, ei); printk(KERN_INFO "\t\textent refs %llu gen %llu flags %llu\n", (unsigned long long)btrfs_extent_refs(eb, ei), (unsigned long long)btrfs_extent_generation(eb, ei), (unsigned long long)flags); if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { struct btrfs_tree_block_info *info; info = (struct btrfs_tree_block_info *)(ei + 1); btrfs_tree_block_key(eb, info, &key); printk(KERN_INFO "\t\ttree block key (%llu %x %llu) " "level %d\n", (unsigned long long)btrfs_disk_key_objectid(&key), key.type, (unsigned long long)btrfs_disk_key_offset(&key), btrfs_tree_block_level(eb, info)); iref = (struct btrfs_extent_inline_ref *)(info + 1); } else { iref = (struct btrfs_extent_inline_ref *)(ei + 1); } ptr = (unsigned long)iref; end = (unsigned long)ei + item_size; while (ptr < end) { iref = (struct btrfs_extent_inline_ref *)ptr; type = btrfs_extent_inline_ref_type(eb, iref); offset = btrfs_extent_inline_ref_offset(eb, iref); switch (type) { case BTRFS_TREE_BLOCK_REF_KEY: printk(KERN_INFO "\t\ttree block backref " "root %llu\n", (unsigned long long)offset); break; case BTRFS_SHARED_BLOCK_REF_KEY: printk(KERN_INFO "\t\tshared block backref " "parent %llu\n", (unsigned long long)offset); break; case BTRFS_EXTENT_DATA_REF_KEY: dref = (struct btrfs_extent_data_ref *)(&iref->offset); print_extent_data_ref(eb, dref); break; case BTRFS_SHARED_DATA_REF_KEY: sref = (struct btrfs_shared_data_ref *)(iref + 1); printk(KERN_INFO "\t\tshared data backref " "parent %llu count %u\n", (unsigned long long)offset, btrfs_shared_data_ref_count(eb, sref)); break; default: BUG(); } ptr += btrfs_extent_inline_ref_size(type); } WARN_ON(ptr > end); }
void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l) { unsigned int i; u32 nr = btrfs_header_nritems(&l->header); struct btrfs_item *item; struct btrfs_extent_item *ei; struct btrfs_root_item *ri; struct btrfs_dir_item *di; struct btrfs_inode_item *ii; struct btrfs_file_extent_item *fi; struct btrfs_csum_item *ci; struct btrfs_block_group_item *bi; u32 type; printf("leaf %llu ptrs %d free space %d generation %llu owner %llu\n", (u64)btrfs_header_blocknr(&l->header), nr, btrfs_leaf_free_space(root, l), (u64)btrfs_header_generation(&l->header), (u64)btrfs_header_owner(&l->header)); fflush(stdout); for (i = 0 ; i < nr ; i++) { item = l->items + i; type = btrfs_disk_key_type(&item->key); printf("\titem %d key (%llu %x %llu) itemoff %d itemsize %d\n", i, (u64)btrfs_disk_key_objectid(&item->key), btrfs_disk_key_flags(&item->key), (u64)btrfs_disk_key_offset(&item->key), btrfs_item_offset(item), btrfs_item_size(item)); switch (type) { case BTRFS_INODE_ITEM_KEY: ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); printf("\t\tinode generation %llu size %llu block group %llu mode %o\n", (u64)btrfs_inode_generation(ii), (u64)btrfs_inode_size(ii), (u64)btrfs_inode_block_group(ii), btrfs_inode_mode(ii)); break; case BTRFS_DIR_ITEM_KEY: di = btrfs_item_ptr(l, i, struct btrfs_dir_item); print_dir_item(l->items + i, di); break; case BTRFS_DIR_INDEX_KEY: di = btrfs_item_ptr(l, i, struct btrfs_dir_item); print_dir_item(l->items + i, di); break; case BTRFS_ROOT_ITEM_KEY: ri = btrfs_item_ptr(l, i, struct btrfs_root_item); printf("\t\troot data blocknr %llu dirid %llu refs %u\n", (u64)btrfs_root_blocknr(ri), (u64)btrfs_root_dirid(ri), btrfs_root_refs(ri)); break; case BTRFS_EXTENT_ITEM_KEY: ei = btrfs_item_ptr(l, i, struct btrfs_extent_item); printf("\t\textent data refs %u owner %llu\n", btrfs_extent_refs(ei), (u64)btrfs_extent_owner(ei)); break; case BTRFS_CSUM_ITEM_KEY: ci = btrfs_item_ptr(l, i, struct btrfs_csum_item); printf("\t\tcsum item\n"); break; case BTRFS_EXTENT_DATA_KEY: fi = btrfs_item_ptr(l, i, struct btrfs_file_extent_item); if (btrfs_file_extent_type(fi) == BTRFS_FILE_EXTENT_INLINE) { printf("\t\tinline extent data size %u\n", btrfs_file_extent_inline_len(l->items + i)); break; } printf("\t\textent data disk block %llu nr %llu\n", (u64)btrfs_file_extent_disk_blocknr(fi), (u64)btrfs_file_extent_disk_num_blocks(fi)); printf("\t\textent data offset %llu nr %llu\n", (u64)btrfs_file_extent_offset(fi), (u64)btrfs_file_extent_num_blocks(fi)); break; case BTRFS_BLOCK_GROUP_ITEM_KEY: bi = btrfs_item_ptr(l, i, struct btrfs_block_group_item); printf("\t\tblock group used %llu flags %x\n", (u64)btrfs_block_group_used(bi), bi->flags); break; case BTRFS_STRING_ITEM_KEY: printf("\t\titem data %.*s\n", btrfs_item_size(item), btrfs_leaf_data(l) + btrfs_item_offset(item)); break; }; fflush(stdout); } }
void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *eb) { struct btrfs_item *item; struct btrfs_disk_key disk_key; u32 i; u32 nr; nr = btrfs_header_nritems(eb); printf("leaf %llu items %d free space %d generation %llu owner %llu\n", (unsigned long long)btrfs_header_bytenr(eb), nr, btrfs_leaf_free_space(root, eb), (unsigned long long)btrfs_header_generation(eb), (unsigned long long)btrfs_header_owner(eb)); print_uuids(eb); fflush(stdout); for (i = 0; i < nr; i++) { u32 item_size; void *ptr; u64 objectid; u32 type; u64 offset; char flags_str[256]; char uuid_str[BTRFS_UUID_UNPARSED_SIZE]; u8 uuid[BTRFS_UUID_SIZE]; item = btrfs_item_nr(i); item_size = btrfs_item_size(eb, item); /* Untyped extraction of slot from btrfs_item_ptr */ ptr = btrfs_item_ptr(eb, i, void*); btrfs_item_key(eb, &disk_key, i); objectid = btrfs_disk_key_objectid(&disk_key); type = btrfs_disk_key_type(&disk_key); offset = btrfs_disk_key_offset(&disk_key); printf("\titem %d ", i); btrfs_print_key(&disk_key); printf(" itemoff %d itemsize %d\n", btrfs_item_offset(eb, item), btrfs_item_size(eb, item)); if (type == 0 && objectid == BTRFS_FREE_SPACE_OBJECTID) print_free_space_header(eb, i); switch (type) { case BTRFS_INODE_ITEM_KEY: print_inode_item(eb, ptr); break; case BTRFS_INODE_REF_KEY: print_inode_ref_item(eb, item_size, ptr); break; case BTRFS_INODE_EXTREF_KEY: print_inode_extref_item(eb, item_size, ptr); break; case BTRFS_DIR_ITEM_KEY: case BTRFS_DIR_INDEX_KEY: case BTRFS_XATTR_ITEM_KEY: print_dir_item(eb, item_size, ptr); break; case BTRFS_DIR_LOG_INDEX_KEY: case BTRFS_DIR_LOG_ITEM_KEY: { struct btrfs_dir_log_item *dlog; dlog = btrfs_item_ptr(eb, i, struct btrfs_dir_log_item); printf("\t\tdir log end %Lu\n", (unsigned long long)btrfs_dir_log_end(eb, dlog)); break; } case BTRFS_ORPHAN_ITEM_KEY: printf("\t\torphan item\n"); break; case BTRFS_ROOT_ITEM_KEY: print_root(eb, i); break; case BTRFS_ROOT_REF_KEY: print_root_ref(eb, i, "ref"); break; case BTRFS_ROOT_BACKREF_KEY: print_root_ref(eb, i, "backref"); break; case BTRFS_EXTENT_ITEM_KEY: print_extent_item(eb, i, 0); break; case BTRFS_METADATA_ITEM_KEY: print_extent_item(eb, i, 1); break; case BTRFS_TREE_BLOCK_REF_KEY: printf("\t\ttree block backref\n"); break; case BTRFS_SHARED_BLOCK_REF_KEY: printf("\t\tshared block backref\n"); break; case BTRFS_EXTENT_DATA_REF_KEY: { struct btrfs_extent_data_ref *dref; dref = btrfs_item_ptr(eb, i, struct btrfs_extent_data_ref); printf("\t\textent data backref root %llu " "objectid %llu offset %llu count %u\n", (unsigned long long)btrfs_extent_data_ref_root(eb, dref), (unsigned long long)btrfs_extent_data_ref_objectid(eb, dref), (unsigned long long)btrfs_extent_data_ref_offset(eb, dref), btrfs_extent_data_ref_count(eb, dref)); break; } case BTRFS_SHARED_DATA_REF_KEY: { struct btrfs_shared_data_ref *sref; sref = btrfs_item_ptr(eb, i, struct btrfs_shared_data_ref); printf("\t\tshared data backref count %u\n", btrfs_shared_data_ref_count(eb, sref)); break; } case BTRFS_EXTENT_REF_V0_KEY: #ifdef BTRFS_COMPAT_EXTENT_TREE_V0 print_extent_ref_v0(eb, i); #else BUG(); #endif break; case BTRFS_CSUM_ITEM_KEY: printf("\t\tcsum item\n"); break; case BTRFS_EXTENT_CSUM_KEY: printf("\t\textent csum item\n"); break; case BTRFS_EXTENT_DATA_KEY: print_file_extent_item(eb, item, i, ptr); break; case BTRFS_BLOCK_GROUP_ITEM_KEY: { struct btrfs_block_group_item bg_item; read_extent_buffer(eb, &bg_item, (unsigned long)ptr, sizeof(bg_item)); memset(flags_str, 0, sizeof(flags_str)); bg_flags_to_str(btrfs_block_group_flags(&bg_item), flags_str); printf("\t\tblock group used %llu chunk_objectid %llu flags %s\n", (unsigned long long)btrfs_block_group_used(&bg_item), (unsigned long long)btrfs_block_group_chunk_objectid(&bg_item), flags_str); break; } case BTRFS_FREE_SPACE_INFO_KEY: { struct btrfs_free_space_info *free_info; free_info = btrfs_item_ptr(eb, i, struct btrfs_free_space_info); printf("\t\tfree space info extent count %u flags %u\n", (unsigned)btrfs_free_space_extent_count(eb, free_info), (unsigned)btrfs_free_space_flags(eb, free_info)); break; } case BTRFS_FREE_SPACE_EXTENT_KEY: printf("\t\tfree space extent\n"); break; case BTRFS_FREE_SPACE_BITMAP_KEY: printf("\t\tfree space bitmap\n"); break; case BTRFS_CHUNK_ITEM_KEY: print_chunk(eb, ptr); break; case BTRFS_DEV_ITEM_KEY: print_dev_item(eb, ptr); break; case BTRFS_DEV_EXTENT_KEY: { struct btrfs_dev_extent *dev_extent; dev_extent = btrfs_item_ptr(eb, i, struct btrfs_dev_extent); read_extent_buffer(eb, uuid, (unsigned long)btrfs_dev_extent_chunk_tree_uuid(dev_extent), BTRFS_UUID_SIZE); uuid_unparse(uuid, uuid_str); printf("\t\tdev extent chunk_tree %llu\n" "\t\tchunk_objectid %llu chunk_offset %llu " "length %llu\n" "\t\tchunk_tree_uuid %s\n", (unsigned long long) btrfs_dev_extent_chunk_tree(eb, dev_extent), (unsigned long long) btrfs_dev_extent_chunk_objectid(eb, dev_extent), (unsigned long long) btrfs_dev_extent_chunk_offset(eb, dev_extent), (unsigned long long) btrfs_dev_extent_length(eb, dev_extent), uuid_str); break; } case BTRFS_QGROUP_STATUS_KEY: { struct btrfs_qgroup_status_item *qg_status; qg_status = btrfs_item_ptr(eb, i, struct btrfs_qgroup_status_item); memset(flags_str, 0, sizeof(flags_str)); qgroup_flags_to_str(btrfs_qgroup_status_flags(eb, qg_status), flags_str); printf("\t\tversion %llu generation %llu flags %s " "scan %lld\n", (unsigned long long) btrfs_qgroup_status_version(eb, qg_status), (unsigned long long) btrfs_qgroup_status_generation(eb, qg_status), flags_str, (unsigned long long) btrfs_qgroup_status_rescan(eb, qg_status)); break; } case BTRFS_QGROUP_RELATION_KEY: break; case BTRFS_QGROUP_INFO_KEY: { struct btrfs_qgroup_info_item *qg_info; qg_info = btrfs_item_ptr(eb, i, struct btrfs_qgroup_info_item); printf("\t\tgeneration %llu\n" "\t\treferenced %llu referenced_compressed %llu\n" "\t\texclusive %llu exclusive_compressed %llu\n", (unsigned long long) btrfs_qgroup_info_generation(eb, qg_info), (unsigned long long) btrfs_qgroup_info_referenced(eb, qg_info), (unsigned long long) btrfs_qgroup_info_referenced_compressed(eb, qg_info), (unsigned long long) btrfs_qgroup_info_exclusive(eb, qg_info), (unsigned long long) btrfs_qgroup_info_exclusive_compressed(eb, qg_info)); break; } case BTRFS_QGROUP_LIMIT_KEY: { struct btrfs_qgroup_limit_item *qg_limit; qg_limit = btrfs_item_ptr(eb, i, struct btrfs_qgroup_limit_item); printf("\t\tflags %llx\n" "\t\tmax_referenced %lld max_exclusive %lld\n" "\t\trsv_referenced %lld rsv_exclusive %lld\n", (unsigned long long) btrfs_qgroup_limit_flags(eb, qg_limit), (long long) btrfs_qgroup_limit_max_referenced(eb, qg_limit), (long long) btrfs_qgroup_limit_max_exclusive(eb, qg_limit), (long long) btrfs_qgroup_limit_rsv_referenced(eb, qg_limit), (long long) btrfs_qgroup_limit_rsv_exclusive(eb, qg_limit)); break; } case BTRFS_UUID_KEY_SUBVOL: case BTRFS_UUID_KEY_RECEIVED_SUBVOL: print_uuid_item(eb, btrfs_item_ptr_offset(eb, i), btrfs_item_size_nr(eb, i)); break; case BTRFS_STRING_ITEM_KEY: { const char *str = eb->data + btrfs_item_ptr_offset(eb, i); printf("\t\titem data %.*s\n", item_size, str); break; } case BTRFS_PERSISTENT_ITEM_KEY: printf("\t\tpersistent item objectid "); print_objectid(stdout, objectid, BTRFS_PERSISTENT_ITEM_KEY); printf(" offset %llu\n", (unsigned long long)offset); switch (objectid) { case BTRFS_DEV_STATS_OBJECTID: print_dev_stats(eb, ptr, item_size); break; default: printf("\t\tunknown persistent item objectid %llu\n", objectid); } break; case BTRFS_TEMPORARY_ITEM_KEY: printf("\t\ttemporary item objectid "); print_objectid(stdout, objectid, BTRFS_TEMPORARY_ITEM_KEY); printf(" offset %llu\n", (unsigned long long)offset); switch (objectid) { case BTRFS_BALANCE_OBJECTID: print_balance_item(eb, ptr); break; default: printf("\t\tunknown temporary item objectid %llu\n", objectid); } break; }; fflush(stdout); } }