^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2007 Oracle. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include "ctree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include "disk-io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "print-tree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) struct root_name_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) u64 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) char name[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) static const struct root_name_map root_map[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) { BTRFS_ROOT_TREE_OBJECTID, "ROOT_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) { BTRFS_EXTENT_TREE_OBJECTID, "EXTENT_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) { BTRFS_CHUNK_TREE_OBJECTID, "CHUNK_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) { BTRFS_DEV_TREE_OBJECTID, "DEV_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) { BTRFS_FS_TREE_OBJECTID, "FS_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) { BTRFS_CSUM_TREE_OBJECTID, "CSUM_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) { BTRFS_TREE_LOG_OBJECTID, "TREE_LOG" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) { BTRFS_QUOTA_TREE_OBJECTID, "QUOTA_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) { BTRFS_UUID_TREE_OBJECTID, "UUID_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) { BTRFS_FREE_SPACE_TREE_OBJECTID, "FREE_SPACE_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) { BTRFS_DATA_RELOC_TREE_OBJECTID, "DATA_RELOC_TREE" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) const char *btrfs_root_name(const struct btrfs_key *key, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (key->objectid == BTRFS_TREE_RELOC_OBJECTID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) snprintf(buf, BTRFS_ROOT_NAME_BUF_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) "TREE_RELOC offset=%llu", key->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) for (i = 0; i < ARRAY_SIZE(root_map); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) if (root_map[i].id == key->objectid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) return root_map[i].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) snprintf(buf, BTRFS_ROOT_NAME_BUF_LEN, "%llu", key->objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) return buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int num_stripes = btrfs_chunk_num_stripes(eb, chunk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) pr_info("\t\tchunk length %llu owner %llu type %llu num_stripes %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) btrfs_chunk_length(eb, chunk), btrfs_chunk_owner(eb, chunk),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) btrfs_chunk_type(eb, chunk), num_stripes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) for (i = 0 ; i < num_stripes ; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) pr_info("\t\t\tstripe %d devid %llu offset %llu\n", i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) btrfs_stripe_devid_nr(eb, chunk, i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) btrfs_stripe_offset_nr(eb, chunk, i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static void print_dev_item(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct btrfs_dev_item *dev_item)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) pr_info("\t\tdev item devid %llu total_bytes %llu bytes used %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) btrfs_device_id(eb, dev_item),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) btrfs_device_total_bytes(eb, dev_item),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) btrfs_device_bytes_used(eb, dev_item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) static void print_extent_data_ref(struct extent_buffer *eb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct btrfs_extent_data_ref *ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) pr_cont("extent data backref root %llu objectid %llu offset %llu count %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) btrfs_extent_data_ref_root(eb, ref),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) btrfs_extent_data_ref_objectid(eb, ref),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) btrfs_extent_data_ref_offset(eb, ref),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) btrfs_extent_data_ref_count(eb, ref));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static void print_extent_item(struct extent_buffer *eb, int slot, int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct btrfs_extent_item *ei;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct btrfs_extent_inline_ref *iref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct btrfs_extent_data_ref *dref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct btrfs_shared_data_ref *sref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct btrfs_disk_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) unsigned long end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned long ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u32 item_size = btrfs_item_size_nr(eb, slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u64 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u64 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int ref_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if (unlikely(item_size < sizeof(*ei))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) btrfs_print_v0_err(eb->fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) btrfs_handle_fs_error(eb->fs_info, -EINVAL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) flags = btrfs_extent_flags(eb, ei);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) pr_info("\t\textent refs %llu gen %llu flags %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) btrfs_extent_refs(eb, ei), btrfs_extent_generation(eb, ei),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) if ((type == BTRFS_EXTENT_ITEM_KEY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct btrfs_tree_block_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) info = (struct btrfs_tree_block_info *)(ei + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) btrfs_tree_block_key(eb, info, &key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) pr_info("\t\ttree block key (%llu %u %llu) level %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) btrfs_disk_key_objectid(&key), key.type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) btrfs_disk_key_offset(&key),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) btrfs_tree_block_level(eb, info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) iref = (struct btrfs_extent_inline_ref *)(info + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) iref = (struct btrfs_extent_inline_ref *)(ei + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ptr = (unsigned long)iref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) end = (unsigned long)ei + item_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) while (ptr < end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) iref = (struct btrfs_extent_inline_ref *)ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) type = btrfs_extent_inline_ref_type(eb, iref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) offset = btrfs_extent_inline_ref_offset(eb, iref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) pr_info("\t\tref#%d: ", ref_index++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) case BTRFS_TREE_BLOCK_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) pr_cont("tree block backref root %llu\n", offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) case BTRFS_SHARED_BLOCK_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) pr_cont("shared block backref parent %llu\n", offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * offset is supposed to be a tree block which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * must be aligned to nodesize.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (!IS_ALIGNED(offset, eb->fs_info->sectorsize))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) pr_info(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) "\t\t\t(parent %llu not aligned to sectorsize %u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) offset, eb->fs_info->sectorsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) case BTRFS_EXTENT_DATA_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) dref = (struct btrfs_extent_data_ref *)(&iref->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) print_extent_data_ref(eb, dref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) case BTRFS_SHARED_DATA_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) sref = (struct btrfs_shared_data_ref *)(iref + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) pr_cont("shared data backref parent %llu count %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) offset, btrfs_shared_data_ref_count(eb, sref));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * offset is supposed to be a tree block which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * must be aligned to nodesize.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) pr_info(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) "\t\t\t(parent %llu not aligned to sectorsize %u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) offset, eb->fs_info->sectorsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) pr_cont("(extent %llu has INVALID ref type %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) eb->start, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ptr += btrfs_extent_inline_ref_size(type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) WARN_ON(ptr > end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static void print_uuid_item(struct extent_buffer *l, unsigned long offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) u32 item_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (!IS_ALIGNED(item_size, sizeof(u64))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) pr_warn("BTRFS: uuid item with illegal size %lu!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) (unsigned long)item_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) while (item_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) __le64 subvol_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) read_extent_buffer(l, &subvol_id, offset, sizeof(subvol_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) pr_info("\t\tsubvol_id %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) (unsigned long long)le64_to_cpu(subvol_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) item_size -= sizeof(u64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) offset += sizeof(u64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * Helper to output refs and locking status of extent buffer. Useful to debug
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * race condition related problems.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static void print_eb_refs_lock(struct extent_buffer *eb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) btrfs_info(eb->fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) "refs %u lock (w:%d r:%d bw:%d br:%d sw:%d sr:%d) lock_owner %u current %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) atomic_read(&eb->refs), eb->write_locks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) atomic_read(&eb->read_locks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) eb->blocking_writers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) atomic_read(&eb->blocking_readers),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) eb->spinning_writers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) atomic_read(&eb->spinning_readers),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) eb->lock_owner, current->pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) void btrfs_print_leaf(struct extent_buffer *l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) struct btrfs_fs_info *fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) u32 type, nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct btrfs_item *item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct btrfs_root_item *ri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct btrfs_dir_item *di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct btrfs_inode_item *ii;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct btrfs_block_group_item *bi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct btrfs_file_extent_item *fi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct btrfs_extent_data_ref *dref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct btrfs_shared_data_ref *sref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct btrfs_dev_extent *dev_extent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct btrfs_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct btrfs_key found_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (!l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) fs_info = l->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) nr = btrfs_header_nritems(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) btrfs_info(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) "leaf %llu gen %llu total ptrs %d free space %d owner %llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) btrfs_header_bytenr(l), btrfs_header_generation(l), nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) btrfs_leaf_free_space(l), btrfs_header_owner(l));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) print_eb_refs_lock(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) for (i = 0 ; i < nr ; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) item = btrfs_item_nr(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) btrfs_item_key_to_cpu(l, &key, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) type = key.type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) pr_info("\titem %d key (%llu %u %llu) itemoff %d itemsize %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) i, key.objectid, type, key.offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) btrfs_item_offset(l, item), btrfs_item_size(l, item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) case BTRFS_INODE_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) ii = btrfs_item_ptr(l, i, struct btrfs_inode_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) pr_info("\t\tinode generation %llu size %llu mode %o\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) btrfs_inode_generation(l, ii),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) btrfs_inode_size(l, ii),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) btrfs_inode_mode(l, ii));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) case BTRFS_DIR_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) di = btrfs_item_ptr(l, i, struct btrfs_dir_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) btrfs_dir_item_key_to_cpu(l, di, &found_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) pr_info("\t\tdir oid %llu type %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) found_key.objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) btrfs_dir_type(l, di));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) case BTRFS_ROOT_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) ri = btrfs_item_ptr(l, i, struct btrfs_root_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) pr_info("\t\troot data bytenr %llu refs %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) btrfs_disk_root_bytenr(l, ri),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) btrfs_disk_root_refs(l, ri));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) case BTRFS_EXTENT_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) case BTRFS_METADATA_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) print_extent_item(l, i, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) case BTRFS_TREE_BLOCK_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) pr_info("\t\ttree block backref\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) case BTRFS_SHARED_BLOCK_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) pr_info("\t\tshared block backref\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) case BTRFS_EXTENT_DATA_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) dref = btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct btrfs_extent_data_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) print_extent_data_ref(l, dref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) case BTRFS_SHARED_DATA_REF_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) sref = btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) struct btrfs_shared_data_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) pr_info("\t\tshared data backref count %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) btrfs_shared_data_ref_count(l, sref));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) case BTRFS_EXTENT_DATA_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) fi = btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) struct btrfs_file_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (btrfs_file_extent_type(l, fi) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) BTRFS_FILE_EXTENT_INLINE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) pr_info("\t\tinline extent data size %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) btrfs_file_extent_ram_bytes(l, fi));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) pr_info("\t\textent data disk bytenr %llu nr %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) btrfs_file_extent_disk_bytenr(l, fi),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) btrfs_file_extent_disk_num_bytes(l, fi));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) pr_info("\t\textent data offset %llu nr %llu ram %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) btrfs_file_extent_offset(l, fi),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) btrfs_file_extent_num_bytes(l, fi),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) btrfs_file_extent_ram_bytes(l, fi));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) case BTRFS_EXTENT_REF_V0_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) btrfs_print_v0_err(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) btrfs_handle_fs_error(fs_info, -EINVAL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) case BTRFS_BLOCK_GROUP_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) bi = btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) struct btrfs_block_group_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) pr_info(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) "\t\tblock group used %llu chunk_objectid %llu flags %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) btrfs_block_group_used(l, bi),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) btrfs_block_group_chunk_objectid(l, bi),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) btrfs_block_group_flags(l, bi));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) case BTRFS_CHUNK_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) print_chunk(l, btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) struct btrfs_chunk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) case BTRFS_DEV_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) print_dev_item(l, btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) struct btrfs_dev_item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) case BTRFS_DEV_EXTENT_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) dev_extent = btrfs_item_ptr(l, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) struct btrfs_dev_extent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) pr_info("\t\tdev extent chunk_tree %llu\n\t\tchunk objectid %llu chunk offset %llu length %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) btrfs_dev_extent_chunk_tree(l, dev_extent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) btrfs_dev_extent_chunk_objectid(l, dev_extent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) btrfs_dev_extent_chunk_offset(l, dev_extent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) btrfs_dev_extent_length(l, dev_extent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) case BTRFS_PERSISTENT_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) pr_info("\t\tpersistent item objectid %llu offset %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) key.objectid, key.offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) switch (key.objectid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) case BTRFS_DEV_STATS_OBJECTID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) pr_info("\t\tdevice stats\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) pr_info("\t\tunknown persistent item\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) case BTRFS_TEMPORARY_ITEM_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) pr_info("\t\ttemporary item objectid %llu offset %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) key.objectid, key.offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) switch (key.objectid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) case BTRFS_BALANCE_OBJECTID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) pr_info("\t\tbalance status\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) pr_info("\t\tunknown temporary item\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) case BTRFS_DEV_REPLACE_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) pr_info("\t\tdev replace\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) case BTRFS_UUID_KEY_SUBVOL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) case BTRFS_UUID_KEY_RECEIVED_SUBVOL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) print_uuid_item(l, btrfs_item_ptr_offset(l, i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) btrfs_item_size_nr(l, i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) void btrfs_print_tree(struct extent_buffer *c, bool follow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct btrfs_fs_info *fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) int i; u32 nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct btrfs_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (!c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) fs_info = c->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) nr = btrfs_header_nritems(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) level = btrfs_header_level(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (level == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) btrfs_print_leaf(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) btrfs_info(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) "node %llu level %d gen %llu total ptrs %d free spc %u owner %llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) btrfs_header_bytenr(c), level, btrfs_header_generation(c),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) nr, (u32)BTRFS_NODEPTRS_PER_BLOCK(fs_info) - nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) btrfs_header_owner(c));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) print_eb_refs_lock(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) for (i = 0; i < nr; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) btrfs_node_key_to_cpu(c, &key, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) pr_info("\tkey %d (%llu %u %llu) block %llu gen %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) i, key.objectid, key.type, key.offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) btrfs_node_blockptr(c, i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) btrfs_node_ptr_generation(c, i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (!follow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) for (i = 0; i < nr; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) struct btrfs_key first_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct extent_buffer *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) btrfs_node_key_to_cpu(c, &first_key, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) next = read_tree_block(fs_info, btrfs_node_blockptr(c, i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) btrfs_node_ptr_generation(c, i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) level - 1, &first_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (IS_ERR(next)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) } else if (!extent_buffer_uptodate(next)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) free_extent_buffer(next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (btrfs_is_leaf(next) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) level != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) if (btrfs_header_level(next) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) level - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) btrfs_print_tree(next, follow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) free_extent_buffer(next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) }