1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2d4a704afSMarek Behún /* 3d4a704afSMarek Behún * From linux/include/uapi/linux/btrfs_tree.h 4d4a704afSMarek Behún */ 5d4a704afSMarek Behún 6d4a704afSMarek Behún #ifndef __BTRFS_BTRFS_TREE_H__ 7d4a704afSMarek Behún #define __BTRFS_BTRFS_TREE_H__ 8d4a704afSMarek Behún 9d4a704afSMarek Behún #include <common.h> 10d4a704afSMarek Behún 11d4a704afSMarek Behún #define BTRFS_VOL_NAME_MAX 255 12d4a704afSMarek Behún #define BTRFS_NAME_MAX 255 13d4a704afSMarek Behún #define BTRFS_LABEL_SIZE 256 14d4a704afSMarek Behún #define BTRFS_FSID_SIZE 16 15d4a704afSMarek Behún #define BTRFS_UUID_SIZE 16 16d4a704afSMarek Behún 17d4a704afSMarek Behún /* 18d4a704afSMarek Behún * This header contains the structure definitions and constants used 19d4a704afSMarek Behún * by file system objects that can be retrieved using 20d4a704afSMarek Behún * the BTRFS_IOC_SEARCH_TREE ioctl. That means basically anything that 21d4a704afSMarek Behún * is needed to describe a leaf node's key or item contents. 22d4a704afSMarek Behún */ 23d4a704afSMarek Behún 24d4a704afSMarek Behún /* holds pointers to all of the tree roots */ 25d4a704afSMarek Behún #define BTRFS_ROOT_TREE_OBJECTID 1ULL 26d4a704afSMarek Behún 27d4a704afSMarek Behún /* stores information about which extents are in use, and reference counts */ 28d4a704afSMarek Behún #define BTRFS_EXTENT_TREE_OBJECTID 2ULL 29d4a704afSMarek Behún 30d4a704afSMarek Behún /* 31d4a704afSMarek Behún * chunk tree stores translations from logical -> physical block numbering 32d4a704afSMarek Behún * the super block points to the chunk tree 33d4a704afSMarek Behún */ 34d4a704afSMarek Behún #define BTRFS_CHUNK_TREE_OBJECTID 3ULL 35d4a704afSMarek Behún 36d4a704afSMarek Behún /* 37d4a704afSMarek Behún * stores information about which areas of a given device are in use. 38d4a704afSMarek Behún * one per device. The tree of tree roots points to the device tree 39d4a704afSMarek Behún */ 40d4a704afSMarek Behún #define BTRFS_DEV_TREE_OBJECTID 4ULL 41d4a704afSMarek Behún 42d4a704afSMarek Behún /* one per subvolume, storing files and directories */ 43d4a704afSMarek Behún #define BTRFS_FS_TREE_OBJECTID 5ULL 44d4a704afSMarek Behún 45d4a704afSMarek Behún /* directory objectid inside the root tree */ 46d4a704afSMarek Behún #define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL 47d4a704afSMarek Behún 48d4a704afSMarek Behún /* holds checksums of all the data extents */ 49d4a704afSMarek Behún #define BTRFS_CSUM_TREE_OBJECTID 7ULL 50d4a704afSMarek Behún 51d4a704afSMarek Behún /* holds quota configuration and tracking */ 52d4a704afSMarek Behún #define BTRFS_QUOTA_TREE_OBJECTID 8ULL 53d4a704afSMarek Behún 54d4a704afSMarek Behún /* for storing items that use the BTRFS_UUID_KEY* types */ 55d4a704afSMarek Behún #define BTRFS_UUID_TREE_OBJECTID 9ULL 56d4a704afSMarek Behún 57d4a704afSMarek Behún /* tracks free space in block groups. */ 58d4a704afSMarek Behún #define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL 59d4a704afSMarek Behún 60d4a704afSMarek Behún /* device stats in the device tree */ 61d4a704afSMarek Behún #define BTRFS_DEV_STATS_OBJECTID 0ULL 62d4a704afSMarek Behún 63d4a704afSMarek Behún /* for storing balance parameters in the root tree */ 64d4a704afSMarek Behún #define BTRFS_BALANCE_OBJECTID -4ULL 65d4a704afSMarek Behún 66d4a704afSMarek Behún /* orhpan objectid for tracking unlinked/truncated files */ 67d4a704afSMarek Behún #define BTRFS_ORPHAN_OBJECTID -5ULL 68d4a704afSMarek Behún 69d4a704afSMarek Behún /* does write ahead logging to speed up fsyncs */ 70d4a704afSMarek Behún #define BTRFS_TREE_LOG_OBJECTID -6ULL 71d4a704afSMarek Behún #define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL 72d4a704afSMarek Behún 73d4a704afSMarek Behún /* for space balancing */ 74d4a704afSMarek Behún #define BTRFS_TREE_RELOC_OBJECTID -8ULL 75d4a704afSMarek Behún #define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL 76d4a704afSMarek Behún 77d4a704afSMarek Behún /* 78d4a704afSMarek Behún * extent checksums all have this objectid 79d4a704afSMarek Behún * this allows them to share the logging tree 80d4a704afSMarek Behún * for fsyncs 81d4a704afSMarek Behún */ 82d4a704afSMarek Behún #define BTRFS_EXTENT_CSUM_OBJECTID -10ULL 83d4a704afSMarek Behún 84d4a704afSMarek Behún /* For storing free space cache */ 85d4a704afSMarek Behún #define BTRFS_FREE_SPACE_OBJECTID -11ULL 86d4a704afSMarek Behún 87d4a704afSMarek Behún /* 88d4a704afSMarek Behún * The inode number assigned to the special inode for storing 89d4a704afSMarek Behún * free ino cache 90d4a704afSMarek Behún */ 91d4a704afSMarek Behún #define BTRFS_FREE_INO_OBJECTID -12ULL 92d4a704afSMarek Behún 93d4a704afSMarek Behún /* dummy objectid represents multiple objectids */ 94d4a704afSMarek Behún #define BTRFS_MULTIPLE_OBJECTIDS -255ULL 95d4a704afSMarek Behún 96d4a704afSMarek Behún /* 97d4a704afSMarek Behún * All files have objectids in this range. 98d4a704afSMarek Behún */ 99d4a704afSMarek Behún #define BTRFS_FIRST_FREE_OBJECTID 256ULL 100d4a704afSMarek Behún #define BTRFS_LAST_FREE_OBJECTID -256ULL 101d4a704afSMarek Behún #define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL 102d4a704afSMarek Behún 103d4a704afSMarek Behún 104d4a704afSMarek Behún /* 105d4a704afSMarek Behún * the device items go into the chunk tree. The key is in the form 106d4a704afSMarek Behún * [ 1 BTRFS_DEV_ITEM_KEY device_id ] 107d4a704afSMarek Behún */ 108d4a704afSMarek Behún #define BTRFS_DEV_ITEMS_OBJECTID 1ULL 109d4a704afSMarek Behún 110d4a704afSMarek Behún #define BTRFS_BTREE_INODE_OBJECTID 1 111d4a704afSMarek Behún 112d4a704afSMarek Behún #define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2 113d4a704afSMarek Behún 114d4a704afSMarek Behún #define BTRFS_DEV_REPLACE_DEVID 0ULL 115d4a704afSMarek Behún 116d4a704afSMarek Behún /* 117d4a704afSMarek Behún * inode items have the data typically returned from stat and store other 118d4a704afSMarek Behún * info about object characteristics. There is one for every file and dir in 119d4a704afSMarek Behún * the FS 120d4a704afSMarek Behún */ 121d4a704afSMarek Behún #define BTRFS_INODE_ITEM_KEY 1 122d4a704afSMarek Behún #define BTRFS_INODE_REF_KEY 12 123d4a704afSMarek Behún #define BTRFS_INODE_EXTREF_KEY 13 124d4a704afSMarek Behún #define BTRFS_XATTR_ITEM_KEY 24 125d4a704afSMarek Behún #define BTRFS_ORPHAN_ITEM_KEY 48 126d4a704afSMarek Behún /* reserve 2-15 close to the inode for later flexibility */ 127d4a704afSMarek Behún 128d4a704afSMarek Behún /* 129d4a704afSMarek Behún * dir items are the name -> inode pointers in a directory. There is one 130d4a704afSMarek Behún * for every name in a directory. 131d4a704afSMarek Behún */ 132d4a704afSMarek Behún #define BTRFS_DIR_LOG_ITEM_KEY 60 133d4a704afSMarek Behún #define BTRFS_DIR_LOG_INDEX_KEY 72 134d4a704afSMarek Behún #define BTRFS_DIR_ITEM_KEY 84 135d4a704afSMarek Behún #define BTRFS_DIR_INDEX_KEY 96 136d4a704afSMarek Behún /* 137d4a704afSMarek Behún * extent data is for file data 138d4a704afSMarek Behún */ 139d4a704afSMarek Behún #define BTRFS_EXTENT_DATA_KEY 108 140d4a704afSMarek Behún 141d4a704afSMarek Behún /* 142d4a704afSMarek Behún * extent csums are stored in a separate tree and hold csums for 143d4a704afSMarek Behún * an entire extent on disk. 144d4a704afSMarek Behún */ 145d4a704afSMarek Behún #define BTRFS_EXTENT_CSUM_KEY 128 146d4a704afSMarek Behún 147d4a704afSMarek Behún /* 148d4a704afSMarek Behún * root items point to tree roots. They are typically in the root 149d4a704afSMarek Behún * tree used by the super block to find all the other trees 150d4a704afSMarek Behún */ 151d4a704afSMarek Behún #define BTRFS_ROOT_ITEM_KEY 132 152d4a704afSMarek Behún 153d4a704afSMarek Behún /* 154d4a704afSMarek Behún * root backrefs tie subvols and snapshots to the directory entries that 155d4a704afSMarek Behún * reference them 156d4a704afSMarek Behún */ 157d4a704afSMarek Behún #define BTRFS_ROOT_BACKREF_KEY 144 158d4a704afSMarek Behún 159d4a704afSMarek Behún /* 160d4a704afSMarek Behún * root refs make a fast index for listing all of the snapshots and 161d4a704afSMarek Behún * subvolumes referenced by a given root. They point directly to the 162d4a704afSMarek Behún * directory item in the root that references the subvol 163d4a704afSMarek Behún */ 164d4a704afSMarek Behún #define BTRFS_ROOT_REF_KEY 156 165d4a704afSMarek Behún 166d4a704afSMarek Behún /* 167d4a704afSMarek Behún * extent items are in the extent map tree. These record which blocks 168d4a704afSMarek Behún * are used, and how many references there are to each block 169d4a704afSMarek Behún */ 170d4a704afSMarek Behún #define BTRFS_EXTENT_ITEM_KEY 168 171d4a704afSMarek Behún 172d4a704afSMarek Behún /* 173d4a704afSMarek Behún * The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know 174d4a704afSMarek Behún * the length, so we save the level in key->offset instead of the length. 175d4a704afSMarek Behún */ 176d4a704afSMarek Behún #define BTRFS_METADATA_ITEM_KEY 169 177d4a704afSMarek Behún 178d4a704afSMarek Behún #define BTRFS_TREE_BLOCK_REF_KEY 176 179d4a704afSMarek Behún 180d4a704afSMarek Behún #define BTRFS_EXTENT_DATA_REF_KEY 178 181d4a704afSMarek Behún 182d4a704afSMarek Behún #define BTRFS_EXTENT_REF_V0_KEY 180 183d4a704afSMarek Behún 184d4a704afSMarek Behún #define BTRFS_SHARED_BLOCK_REF_KEY 182 185d4a704afSMarek Behún 186d4a704afSMarek Behún #define BTRFS_SHARED_DATA_REF_KEY 184 187d4a704afSMarek Behún 188d4a704afSMarek Behún /* 189d4a704afSMarek Behún * block groups give us hints into the extent allocation trees. Which 190d4a704afSMarek Behún * blocks are free etc etc 191d4a704afSMarek Behún */ 192d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_ITEM_KEY 192 193d4a704afSMarek Behún 194d4a704afSMarek Behún /* 195d4a704afSMarek Behún * Every block group is represented in the free space tree by a free space info 196d4a704afSMarek Behún * item, which stores some accounting information. It is keyed on 197d4a704afSMarek Behún * (block_group_start, FREE_SPACE_INFO, block_group_length). 198d4a704afSMarek Behún */ 199d4a704afSMarek Behún #define BTRFS_FREE_SPACE_INFO_KEY 198 200d4a704afSMarek Behún 201d4a704afSMarek Behún /* 202d4a704afSMarek Behún * A free space extent tracks an extent of space that is free in a block group. 203d4a704afSMarek Behún * It is keyed on (start, FREE_SPACE_EXTENT, length). 204d4a704afSMarek Behún */ 205d4a704afSMarek Behún #define BTRFS_FREE_SPACE_EXTENT_KEY 199 206d4a704afSMarek Behún 207d4a704afSMarek Behún /* 208d4a704afSMarek Behún * When a block group becomes very fragmented, we convert it to use bitmaps 209d4a704afSMarek Behún * instead of extents. A free space bitmap is keyed on 210d4a704afSMarek Behún * (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with 211d4a704afSMarek Behún * (length / sectorsize) bits. 212d4a704afSMarek Behún */ 213d4a704afSMarek Behún #define BTRFS_FREE_SPACE_BITMAP_KEY 200 214d4a704afSMarek Behún 215d4a704afSMarek Behún #define BTRFS_DEV_EXTENT_KEY 204 216d4a704afSMarek Behún #define BTRFS_DEV_ITEM_KEY 216 217d4a704afSMarek Behún #define BTRFS_CHUNK_ITEM_KEY 228 218d4a704afSMarek Behún 219d4a704afSMarek Behún /* 220d4a704afSMarek Behún * Records the overall state of the qgroups. 221d4a704afSMarek Behún * There's only one instance of this key present, 222d4a704afSMarek Behún * (0, BTRFS_QGROUP_STATUS_KEY, 0) 223d4a704afSMarek Behún */ 224d4a704afSMarek Behún #define BTRFS_QGROUP_STATUS_KEY 240 225d4a704afSMarek Behún /* 226d4a704afSMarek Behún * Records the currently used space of the qgroup. 227d4a704afSMarek Behún * One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid). 228d4a704afSMarek Behún */ 229d4a704afSMarek Behún #define BTRFS_QGROUP_INFO_KEY 242 230d4a704afSMarek Behún /* 231d4a704afSMarek Behún * Contains the user configured limits for the qgroup. 232d4a704afSMarek Behún * One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid). 233d4a704afSMarek Behún */ 234d4a704afSMarek Behún #define BTRFS_QGROUP_LIMIT_KEY 244 235d4a704afSMarek Behún /* 236d4a704afSMarek Behún * Records the child-parent relationship of qgroups. For 237d4a704afSMarek Behún * each relation, 2 keys are present: 238d4a704afSMarek Behún * (childid, BTRFS_QGROUP_RELATION_KEY, parentid) 239d4a704afSMarek Behún * (parentid, BTRFS_QGROUP_RELATION_KEY, childid) 240d4a704afSMarek Behún */ 241d4a704afSMarek Behún #define BTRFS_QGROUP_RELATION_KEY 246 242d4a704afSMarek Behún 243d4a704afSMarek Behún /* 244d4a704afSMarek Behún * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY. 245d4a704afSMarek Behún */ 246d4a704afSMarek Behún #define BTRFS_BALANCE_ITEM_KEY 248 247d4a704afSMarek Behún 248d4a704afSMarek Behún /* 249d4a704afSMarek Behún * The key type for tree items that are stored persistently, but do not need to 250d4a704afSMarek Behún * exist for extended period of time. The items can exist in any tree. 251d4a704afSMarek Behún * 252d4a704afSMarek Behún * [subtype, BTRFS_TEMPORARY_ITEM_KEY, data] 253d4a704afSMarek Behún * 254d4a704afSMarek Behún * Existing items: 255d4a704afSMarek Behún * 256d4a704afSMarek Behún * - balance status item 257d4a704afSMarek Behún * (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0) 258d4a704afSMarek Behún */ 259d4a704afSMarek Behún #define BTRFS_TEMPORARY_ITEM_KEY 248 260d4a704afSMarek Behún 261d4a704afSMarek Behún /* 262d4a704afSMarek Behún * Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY 263d4a704afSMarek Behún */ 264d4a704afSMarek Behún #define BTRFS_DEV_STATS_KEY 249 265d4a704afSMarek Behún 266d4a704afSMarek Behún /* 267d4a704afSMarek Behún * The key type for tree items that are stored persistently and usually exist 268d4a704afSMarek Behún * for a long period, eg. filesystem lifetime. The item kinds can be status 269d4a704afSMarek Behún * information, stats or preference values. The item can exist in any tree. 270d4a704afSMarek Behún * 271d4a704afSMarek Behún * [subtype, BTRFS_PERSISTENT_ITEM_KEY, data] 272d4a704afSMarek Behún * 273d4a704afSMarek Behún * Existing items: 274d4a704afSMarek Behún * 275d4a704afSMarek Behún * - device statistics, store IO stats in the device tree, one key for all 276d4a704afSMarek Behún * stats 277d4a704afSMarek Behún * (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0) 278d4a704afSMarek Behún */ 279d4a704afSMarek Behún #define BTRFS_PERSISTENT_ITEM_KEY 249 280d4a704afSMarek Behún 281d4a704afSMarek Behún /* 282d4a704afSMarek Behún * Persistantly stores the device replace state in the device tree. 283d4a704afSMarek Behún * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0). 284d4a704afSMarek Behún */ 285d4a704afSMarek Behún #define BTRFS_DEV_REPLACE_KEY 250 286d4a704afSMarek Behún 287d4a704afSMarek Behún /* 288d4a704afSMarek Behún * Stores items that allow to quickly map UUIDs to something else. 289d4a704afSMarek Behún * These items are part of the filesystem UUID tree. 290d4a704afSMarek Behún * The key is built like this: 291d4a704afSMarek Behún * (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits). 292d4a704afSMarek Behún */ 293d4a704afSMarek Behún #if BTRFS_UUID_SIZE != 16 294d4a704afSMarek Behún #error "UUID items require BTRFS_UUID_SIZE == 16!" 295d4a704afSMarek Behún #endif 296d4a704afSMarek Behún #define BTRFS_UUID_KEY_SUBVOL 251 /* for UUIDs assigned to subvols */ 297d4a704afSMarek Behún #define BTRFS_UUID_KEY_RECEIVED_SUBVOL 252 /* for UUIDs assigned to 298d4a704afSMarek Behún * received subvols */ 299d4a704afSMarek Behún 300d4a704afSMarek Behún /* 301d4a704afSMarek Behún * string items are for debugging. They just store a short string of 302d4a704afSMarek Behún * data in the FS 303d4a704afSMarek Behún */ 304d4a704afSMarek Behún #define BTRFS_STRING_ITEM_KEY 253 305d4a704afSMarek Behún 306d4a704afSMarek Behún 307d4a704afSMarek Behún 308d4a704afSMarek Behún /* 32 bytes in various csum fields */ 309d4a704afSMarek Behún #define BTRFS_CSUM_SIZE 32 310d4a704afSMarek Behún 311d4a704afSMarek Behún /* csum types */ 312d4a704afSMarek Behún #define BTRFS_CSUM_TYPE_CRC32 0 313d4a704afSMarek Behún 314d4a704afSMarek Behún /* 315d4a704afSMarek Behún * flags definitions for directory entry item type 316d4a704afSMarek Behún * 317d4a704afSMarek Behún * Used by: 318d4a704afSMarek Behún * struct btrfs_dir_item.type 319d4a704afSMarek Behún */ 320d4a704afSMarek Behún #define BTRFS_FT_UNKNOWN 0 321d4a704afSMarek Behún #define BTRFS_FT_REG_FILE 1 322d4a704afSMarek Behún #define BTRFS_FT_DIR 2 323d4a704afSMarek Behún #define BTRFS_FT_CHRDEV 3 324d4a704afSMarek Behún #define BTRFS_FT_BLKDEV 4 325d4a704afSMarek Behún #define BTRFS_FT_FIFO 5 326d4a704afSMarek Behún #define BTRFS_FT_SOCK 6 327d4a704afSMarek Behún #define BTRFS_FT_SYMLINK 7 328d4a704afSMarek Behún #define BTRFS_FT_XATTR 8 329d4a704afSMarek Behún #define BTRFS_FT_MAX 9 330d4a704afSMarek Behún 331d4a704afSMarek Behún /* 332d4a704afSMarek Behún * The key defines the order in the tree, and so it also defines (optimal) 333d4a704afSMarek Behún * block layout. 334d4a704afSMarek Behún * 335d4a704afSMarek Behún * objectid corresponds to the inode number. 336d4a704afSMarek Behún * 337d4a704afSMarek Behún * type tells us things about the object, and is a kind of stream selector. 338d4a704afSMarek Behún * so for a given inode, keys with type of 1 might refer to the inode data, 339d4a704afSMarek Behún * type of 2 may point to file data in the btree and type == 3 may point to 340d4a704afSMarek Behún * extents. 341d4a704afSMarek Behún * 342d4a704afSMarek Behún * offset is the starting byte offset for this key in the stream. 343d4a704afSMarek Behún */ 344d4a704afSMarek Behún 345d4a704afSMarek Behún struct btrfs_key { 346d4a704afSMarek Behún __u64 objectid; 347d4a704afSMarek Behún __u8 type; 348d4a704afSMarek Behún __u64 offset; 349d4a704afSMarek Behún } __attribute__ ((__packed__)); 350d4a704afSMarek Behún 351d4a704afSMarek Behún struct btrfs_dev_item { 352d4a704afSMarek Behún /* the internal btrfs device id */ 353d4a704afSMarek Behún __u64 devid; 354d4a704afSMarek Behún 355d4a704afSMarek Behún /* size of the device */ 356d4a704afSMarek Behún __u64 total_bytes; 357d4a704afSMarek Behún 358d4a704afSMarek Behún /* bytes used */ 359d4a704afSMarek Behún __u64 bytes_used; 360d4a704afSMarek Behún 361d4a704afSMarek Behún /* optimal io alignment for this device */ 362d4a704afSMarek Behún __u32 io_align; 363d4a704afSMarek Behún 364d4a704afSMarek Behún /* optimal io width for this device */ 365d4a704afSMarek Behún __u32 io_width; 366d4a704afSMarek Behún 367d4a704afSMarek Behún /* minimal io size for this device */ 368d4a704afSMarek Behún __u32 sector_size; 369d4a704afSMarek Behún 370d4a704afSMarek Behún /* type and info about this device */ 371d4a704afSMarek Behún __u64 type; 372d4a704afSMarek Behún 373d4a704afSMarek Behún /* expected generation for this device */ 374d4a704afSMarek Behún __u64 generation; 375d4a704afSMarek Behún 376d4a704afSMarek Behún /* 377d4a704afSMarek Behún * starting byte of this partition on the device, 378d4a704afSMarek Behún * to allow for stripe alignment in the future 379d4a704afSMarek Behún */ 380d4a704afSMarek Behún __u64 start_offset; 381d4a704afSMarek Behún 382d4a704afSMarek Behún /* grouping information for allocation decisions */ 383d4a704afSMarek Behún __u32 dev_group; 384d4a704afSMarek Behún 385d4a704afSMarek Behún /* seek speed 0-100 where 100 is fastest */ 386d4a704afSMarek Behún __u8 seek_speed; 387d4a704afSMarek Behún 388d4a704afSMarek Behún /* bandwidth 0-100 where 100 is fastest */ 389d4a704afSMarek Behún __u8 bandwidth; 390d4a704afSMarek Behún 391d4a704afSMarek Behún /* btrfs generated uuid for this device */ 392d4a704afSMarek Behún __u8 uuid[BTRFS_UUID_SIZE]; 393d4a704afSMarek Behún 394d4a704afSMarek Behún /* uuid of FS who owns this device */ 395d4a704afSMarek Behún __u8 fsid[BTRFS_UUID_SIZE]; 396d4a704afSMarek Behún } __attribute__ ((__packed__)); 397d4a704afSMarek Behún 398d4a704afSMarek Behún struct btrfs_stripe { 399d4a704afSMarek Behún __u64 devid; 400d4a704afSMarek Behún __u64 offset; 401d4a704afSMarek Behún __u8 dev_uuid[BTRFS_UUID_SIZE]; 402d4a704afSMarek Behún } __attribute__ ((__packed__)); 403d4a704afSMarek Behún 404d4a704afSMarek Behún struct btrfs_chunk { 405d4a704afSMarek Behún /* size of this chunk in bytes */ 406d4a704afSMarek Behún __u64 length; 407d4a704afSMarek Behún 408d4a704afSMarek Behún /* objectid of the root referencing this chunk */ 409d4a704afSMarek Behún __u64 owner; 410d4a704afSMarek Behún 411d4a704afSMarek Behún __u64 stripe_len; 412d4a704afSMarek Behún __u64 type; 413d4a704afSMarek Behún 414d4a704afSMarek Behún /* optimal io alignment for this chunk */ 415d4a704afSMarek Behún __u32 io_align; 416d4a704afSMarek Behún 417d4a704afSMarek Behún /* optimal io width for this chunk */ 418d4a704afSMarek Behún __u32 io_width; 419d4a704afSMarek Behún 420d4a704afSMarek Behún /* minimal io size for this chunk */ 421d4a704afSMarek Behún __u32 sector_size; 422d4a704afSMarek Behún 423d4a704afSMarek Behún /* 2^16 stripes is quite a lot, a second limit is the size of a single 424d4a704afSMarek Behún * item in the btree 425d4a704afSMarek Behún */ 426d4a704afSMarek Behún __u16 num_stripes; 427d4a704afSMarek Behún 428d4a704afSMarek Behún /* sub stripes only matter for raid10 */ 429d4a704afSMarek Behún __u16 sub_stripes; 430d4a704afSMarek Behún struct btrfs_stripe stripe; 431d4a704afSMarek Behún /* additional stripes go here */ 432d4a704afSMarek Behún } __attribute__ ((__packed__)); 433d4a704afSMarek Behún 434d4a704afSMarek Behún #define BTRFS_FREE_SPACE_EXTENT 1 435d4a704afSMarek Behún #define BTRFS_FREE_SPACE_BITMAP 2 436d4a704afSMarek Behún 437d4a704afSMarek Behún struct btrfs_free_space_entry { 438d4a704afSMarek Behún __u64 offset; 439d4a704afSMarek Behún __u64 bytes; 440d4a704afSMarek Behún __u8 type; 441d4a704afSMarek Behún } __attribute__ ((__packed__)); 442d4a704afSMarek Behún 443d4a704afSMarek Behún struct btrfs_free_space_header { 444d4a704afSMarek Behún struct btrfs_key location; 445d4a704afSMarek Behún __u64 generation; 446d4a704afSMarek Behún __u64 num_entries; 447d4a704afSMarek Behún __u64 num_bitmaps; 448d4a704afSMarek Behún } __attribute__ ((__packed__)); 449d4a704afSMarek Behún 450d4a704afSMarek Behún #define BTRFS_HEADER_FLAG_WRITTEN (1ULL << 0) 451d4a704afSMarek Behún #define BTRFS_HEADER_FLAG_RELOC (1ULL << 1) 452d4a704afSMarek Behún 453d4a704afSMarek Behún /* Super block flags */ 454d4a704afSMarek Behún /* Errors detected */ 455d4a704afSMarek Behún #define BTRFS_SUPER_FLAG_ERROR (1ULL << 2) 456d4a704afSMarek Behún 457d4a704afSMarek Behún #define BTRFS_SUPER_FLAG_SEEDING (1ULL << 32) 458d4a704afSMarek Behún #define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33) 459d4a704afSMarek Behún 460d4a704afSMarek Behún 461d4a704afSMarek Behún /* 462d4a704afSMarek Behún * items in the extent btree are used to record the objectid of the 463d4a704afSMarek Behún * owner of the block and the number of references 464d4a704afSMarek Behún */ 465d4a704afSMarek Behún 466d4a704afSMarek Behún struct btrfs_extent_item { 467d4a704afSMarek Behún __u64 refs; 468d4a704afSMarek Behún __u64 generation; 469d4a704afSMarek Behún __u64 flags; 470d4a704afSMarek Behún } __attribute__ ((__packed__)); 471d4a704afSMarek Behún 472d4a704afSMarek Behún 473d4a704afSMarek Behún #define BTRFS_EXTENT_FLAG_DATA (1ULL << 0) 474d4a704afSMarek Behún #define BTRFS_EXTENT_FLAG_TREE_BLOCK (1ULL << 1) 475d4a704afSMarek Behún 476d4a704afSMarek Behún /* following flags only apply to tree blocks */ 477d4a704afSMarek Behún 478d4a704afSMarek Behún /* use full backrefs for extent pointers in the block */ 479d4a704afSMarek Behún #define BTRFS_BLOCK_FLAG_FULL_BACKREF (1ULL << 8) 480d4a704afSMarek Behún 481d4a704afSMarek Behún /* 482d4a704afSMarek Behún * this flag is only used internally by scrub and may be changed at any time 483d4a704afSMarek Behún * it is only declared here to avoid collisions 484d4a704afSMarek Behún */ 485d4a704afSMarek Behún #define BTRFS_EXTENT_FLAG_SUPER (1ULL << 48) 486d4a704afSMarek Behún 487d4a704afSMarek Behún struct btrfs_tree_block_info { 488d4a704afSMarek Behún struct btrfs_key key; 489d4a704afSMarek Behún __u8 level; 490d4a704afSMarek Behún } __attribute__ ((__packed__)); 491d4a704afSMarek Behún 492d4a704afSMarek Behún struct btrfs_extent_data_ref { 493d4a704afSMarek Behún __u64 root; 494d4a704afSMarek Behún __u64 objectid; 495d4a704afSMarek Behún __u64 offset; 496d4a704afSMarek Behún __u32 count; 497d4a704afSMarek Behún } __attribute__ ((__packed__)); 498d4a704afSMarek Behún 499d4a704afSMarek Behún struct btrfs_shared_data_ref { 500d4a704afSMarek Behún __u32 count; 501d4a704afSMarek Behún } __attribute__ ((__packed__)); 502d4a704afSMarek Behún 503d4a704afSMarek Behún struct btrfs_extent_inline_ref { 504d4a704afSMarek Behún __u8 type; 505d4a704afSMarek Behún __u64 offset; 506d4a704afSMarek Behún } __attribute__ ((__packed__)); 507d4a704afSMarek Behún 508d4a704afSMarek Behún /* dev extents record free space on individual devices. The owner 509d4a704afSMarek Behún * field points back to the chunk allocation mapping tree that allocated 510d4a704afSMarek Behún * the extent. The chunk tree uuid field is a way to double check the owner 511d4a704afSMarek Behún */ 512d4a704afSMarek Behún struct btrfs_dev_extent { 513d4a704afSMarek Behún __u64 chunk_tree; 514d4a704afSMarek Behún __u64 chunk_objectid; 515d4a704afSMarek Behún __u64 chunk_offset; 516d4a704afSMarek Behún __u64 length; 517d4a704afSMarek Behún __u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; 518d4a704afSMarek Behún } __attribute__ ((__packed__)); 519d4a704afSMarek Behún 520d4a704afSMarek Behún struct btrfs_inode_ref { 521d4a704afSMarek Behún __u64 index; 522d4a704afSMarek Behún __u16 name_len; 523d4a704afSMarek Behún /* name goes here */ 524d4a704afSMarek Behún } __attribute__ ((__packed__)); 525d4a704afSMarek Behún 526d4a704afSMarek Behún struct btrfs_inode_extref { 527d4a704afSMarek Behún __u64 parent_objectid; 528d4a704afSMarek Behún __u64 index; 529d4a704afSMarek Behún __u16 name_len; 530d4a704afSMarek Behún __u8 name[0]; 531d4a704afSMarek Behún /* name goes here */ 532d4a704afSMarek Behún } __attribute__ ((__packed__)); 533d4a704afSMarek Behún 534d4a704afSMarek Behún struct btrfs_timespec { 535d4a704afSMarek Behún __u64 sec; 536d4a704afSMarek Behún __u32 nsec; 537d4a704afSMarek Behún } __attribute__ ((__packed__)); 538d4a704afSMarek Behún 539d4a704afSMarek Behún struct btrfs_inode_item { 540d4a704afSMarek Behún /* nfs style generation number */ 541d4a704afSMarek Behún __u64 generation; 542d4a704afSMarek Behún /* transid that last touched this inode */ 543d4a704afSMarek Behún __u64 transid; 544d4a704afSMarek Behún __u64 size; 545d4a704afSMarek Behún __u64 nbytes; 546d4a704afSMarek Behún __u64 block_group; 547d4a704afSMarek Behún __u32 nlink; 548d4a704afSMarek Behún __u32 uid; 549d4a704afSMarek Behún __u32 gid; 550d4a704afSMarek Behún __u32 mode; 551d4a704afSMarek Behún __u64 rdev; 552d4a704afSMarek Behún __u64 flags; 553d4a704afSMarek Behún 554d4a704afSMarek Behún /* modification sequence number for NFS */ 555d4a704afSMarek Behún __u64 sequence; 556d4a704afSMarek Behún 557d4a704afSMarek Behún /* 558d4a704afSMarek Behún * a little future expansion, for more than this we can 559d4a704afSMarek Behún * just grow the inode item and version it 560d4a704afSMarek Behún */ 561d4a704afSMarek Behún __u64 reserved[4]; 562d4a704afSMarek Behún struct btrfs_timespec atime; 563d4a704afSMarek Behún struct btrfs_timespec ctime; 564d4a704afSMarek Behún struct btrfs_timespec mtime; 565d4a704afSMarek Behún struct btrfs_timespec otime; 566d4a704afSMarek Behún } __attribute__ ((__packed__)); 567d4a704afSMarek Behún 568d4a704afSMarek Behún struct btrfs_dir_log_item { 569d4a704afSMarek Behún __u64 end; 570d4a704afSMarek Behún } __attribute__ ((__packed__)); 571d4a704afSMarek Behún 572d4a704afSMarek Behún struct btrfs_dir_item { 573d4a704afSMarek Behún struct btrfs_key location; 574d4a704afSMarek Behún __u64 transid; 575d4a704afSMarek Behún __u16 data_len; 576d4a704afSMarek Behún __u16 name_len; 577d4a704afSMarek Behún __u8 type; 578d4a704afSMarek Behún } __attribute__ ((__packed__)); 579d4a704afSMarek Behún 580d4a704afSMarek Behún #define BTRFS_ROOT_SUBVOL_RDONLY (1ULL << 0) 581d4a704afSMarek Behún 582d4a704afSMarek Behún /* 583d4a704afSMarek Behún * Internal in-memory flag that a subvolume has been marked for deletion but 584d4a704afSMarek Behún * still visible as a directory 585d4a704afSMarek Behún */ 586d4a704afSMarek Behún #define BTRFS_ROOT_SUBVOL_DEAD (1ULL << 48) 587d4a704afSMarek Behún 588d4a704afSMarek Behún struct btrfs_root_item { 589d4a704afSMarek Behún struct btrfs_inode_item inode; 590d4a704afSMarek Behún __u64 generation; 591d4a704afSMarek Behún __u64 root_dirid; 592d4a704afSMarek Behún __u64 bytenr; 593d4a704afSMarek Behún __u64 byte_limit; 594d4a704afSMarek Behún __u64 bytes_used; 595d4a704afSMarek Behún __u64 last_snapshot; 596d4a704afSMarek Behún __u64 flags; 597d4a704afSMarek Behún __u32 refs; 598d4a704afSMarek Behún struct btrfs_key drop_progress; 599d4a704afSMarek Behún __u8 drop_level; 600d4a704afSMarek Behún __u8 level; 601d4a704afSMarek Behún 602d4a704afSMarek Behún /* 603d4a704afSMarek Behún * The following fields appear after subvol_uuids+subvol_times 604d4a704afSMarek Behún * were introduced. 605d4a704afSMarek Behún */ 606d4a704afSMarek Behún 607d4a704afSMarek Behún /* 608d4a704afSMarek Behún * This generation number is used to test if the new fields are valid 609d4a704afSMarek Behún * and up to date while reading the root item. Every time the root item 610d4a704afSMarek Behún * is written out, the "generation" field is copied into this field. If 611d4a704afSMarek Behún * anyone ever mounted the fs with an older kernel, we will have 612d4a704afSMarek Behún * mismatching generation values here and thus must invalidate the 613d4a704afSMarek Behún * new fields. See btrfs_update_root and btrfs_find_last_root for 614d4a704afSMarek Behún * details. 615d4a704afSMarek Behún * the offset of generation_v2 is also used as the start for the memset 616d4a704afSMarek Behún * when invalidating the fields. 617d4a704afSMarek Behún */ 618d4a704afSMarek Behún __u64 generation_v2; 619d4a704afSMarek Behún __u8 uuid[BTRFS_UUID_SIZE]; 620d4a704afSMarek Behún __u8 parent_uuid[BTRFS_UUID_SIZE]; 621d4a704afSMarek Behún __u8 received_uuid[BTRFS_UUID_SIZE]; 622d4a704afSMarek Behún __u64 ctransid; /* updated when an inode changes */ 623d4a704afSMarek Behún __u64 otransid; /* trans when created */ 624d4a704afSMarek Behún __u64 stransid; /* trans when sent. non-zero for received subvol */ 625d4a704afSMarek Behún __u64 rtransid; /* trans when received. non-zero for received subvol */ 626d4a704afSMarek Behún struct btrfs_timespec ctime; 627d4a704afSMarek Behún struct btrfs_timespec otime; 628d4a704afSMarek Behún struct btrfs_timespec stime; 629d4a704afSMarek Behún struct btrfs_timespec rtime; 630d4a704afSMarek Behún __u64 reserved[8]; /* for future */ 631d4a704afSMarek Behún } __attribute__ ((__packed__)); 632d4a704afSMarek Behún 633d4a704afSMarek Behún /* 634d4a704afSMarek Behún * this is used for both forward and backward root refs 635d4a704afSMarek Behún */ 636d4a704afSMarek Behún struct btrfs_root_ref { 637d4a704afSMarek Behún __u64 dirid; 638d4a704afSMarek Behún __u64 sequence; 639d4a704afSMarek Behún __u16 name_len; 640d4a704afSMarek Behún } __attribute__ ((__packed__)); 641d4a704afSMarek Behún 642d4a704afSMarek Behún #define BTRFS_FILE_EXTENT_INLINE 0 643d4a704afSMarek Behún #define BTRFS_FILE_EXTENT_REG 1 644d4a704afSMarek Behún #define BTRFS_FILE_EXTENT_PREALLOC 2 645d4a704afSMarek Behún 646d4a704afSMarek Behún enum btrfs_compression_type { 647d4a704afSMarek Behún BTRFS_COMPRESS_NONE = 0, 648d4a704afSMarek Behún BTRFS_COMPRESS_ZLIB = 1, 649d4a704afSMarek Behún BTRFS_COMPRESS_LZO = 2, 650d4a704afSMarek Behún BTRFS_COMPRESS_TYPES = 2, 651d4a704afSMarek Behún BTRFS_COMPRESS_LAST = 3, 652d4a704afSMarek Behún }; 653d4a704afSMarek Behún 654d4a704afSMarek Behún struct btrfs_file_extent_item { 655d4a704afSMarek Behún /* 656d4a704afSMarek Behún * transaction id that created this extent 657d4a704afSMarek Behún */ 658d4a704afSMarek Behún __u64 generation; 659d4a704afSMarek Behún /* 660d4a704afSMarek Behún * max number of bytes to hold this extent in ram 661d4a704afSMarek Behún * when we split a compressed extent we can't know how big 662d4a704afSMarek Behún * each of the resulting pieces will be. So, this is 663d4a704afSMarek Behún * an upper limit on the size of the extent in ram instead of 664d4a704afSMarek Behún * an exact limit. 665d4a704afSMarek Behún */ 666d4a704afSMarek Behún __u64 ram_bytes; 667d4a704afSMarek Behún 668d4a704afSMarek Behún /* 669d4a704afSMarek Behún * 32 bits for the various ways we might encode the data, 670d4a704afSMarek Behún * including compression and encryption. If any of these 671d4a704afSMarek Behún * are set to something a given disk format doesn't understand 672d4a704afSMarek Behún * it is treated like an incompat flag for reading and writing, 673d4a704afSMarek Behún * but not for stat. 674d4a704afSMarek Behún */ 675d4a704afSMarek Behún __u8 compression; 676d4a704afSMarek Behún __u8 encryption; 677d4a704afSMarek Behún __u16 other_encoding; /* spare for later use */ 678d4a704afSMarek Behún 679d4a704afSMarek Behún /* are we inline data or a real extent? */ 680d4a704afSMarek Behún __u8 type; 681d4a704afSMarek Behún 682d4a704afSMarek Behún /* 683d4a704afSMarek Behún * disk space consumed by the extent, checksum blocks are included 684d4a704afSMarek Behún * in these numbers 685d4a704afSMarek Behún * 686d4a704afSMarek Behún * At this offset in the structure, the inline extent data start. 687d4a704afSMarek Behún */ 688d4a704afSMarek Behún __u64 disk_bytenr; 689d4a704afSMarek Behún __u64 disk_num_bytes; 690d4a704afSMarek Behún /* 691d4a704afSMarek Behún * the logical offset in file blocks (no csums) 692d4a704afSMarek Behún * this extent record is for. This allows a file extent to point 693d4a704afSMarek Behún * into the middle of an existing extent on disk, sharing it 694d4a704afSMarek Behún * between two snapshots (useful if some bytes in the middle of the 695d4a704afSMarek Behún * extent have changed 696d4a704afSMarek Behún */ 697d4a704afSMarek Behún __u64 offset; 698d4a704afSMarek Behún /* 699d4a704afSMarek Behún * the logical number of file blocks (no csums included). This 700d4a704afSMarek Behún * always reflects the size uncompressed and without encoding. 701d4a704afSMarek Behún */ 702d4a704afSMarek Behún __u64 num_bytes; 703d4a704afSMarek Behún 704d4a704afSMarek Behún } __attribute__ ((__packed__)); 705d4a704afSMarek Behún 706d4a704afSMarek Behún struct btrfs_csum_item { 707d4a704afSMarek Behún __u8 csum; 708d4a704afSMarek Behún } __attribute__ ((__packed__)); 709d4a704afSMarek Behún 710d4a704afSMarek Behún /* different types of block groups (and chunks) */ 711d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_DATA (1ULL << 0) 712d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_SYSTEM (1ULL << 1) 713d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_METADATA (1ULL << 2) 714d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RAID0 (1ULL << 3) 715d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RAID1 (1ULL << 4) 716d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_DUP (1ULL << 5) 717d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6) 718d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7) 719d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8) 720d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RESERVED (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \ 721d4a704afSMarek Behún BTRFS_SPACE_INFO_GLOBAL_RSV) 722d4a704afSMarek Behún 723d4a704afSMarek Behún enum btrfs_raid_types { 724d4a704afSMarek Behún BTRFS_RAID_RAID10, 725d4a704afSMarek Behún BTRFS_RAID_RAID1, 726d4a704afSMarek Behún BTRFS_RAID_DUP, 727d4a704afSMarek Behún BTRFS_RAID_RAID0, 728d4a704afSMarek Behún BTRFS_RAID_SINGLE, 729d4a704afSMarek Behún BTRFS_RAID_RAID5, 730d4a704afSMarek Behún BTRFS_RAID_RAID6, 731d4a704afSMarek Behún BTRFS_NR_RAID_TYPES 732d4a704afSMarek Behún }; 733d4a704afSMarek Behún 734d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \ 735d4a704afSMarek Behún BTRFS_BLOCK_GROUP_SYSTEM | \ 736d4a704afSMarek Behún BTRFS_BLOCK_GROUP_METADATA) 737d4a704afSMarek Behún 738d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_PROFILE_MASK (BTRFS_BLOCK_GROUP_RAID0 | \ 739d4a704afSMarek Behún BTRFS_BLOCK_GROUP_RAID1 | \ 740d4a704afSMarek Behún BTRFS_BLOCK_GROUP_RAID5 | \ 741d4a704afSMarek Behún BTRFS_BLOCK_GROUP_RAID6 | \ 742d4a704afSMarek Behún BTRFS_BLOCK_GROUP_DUP | \ 743d4a704afSMarek Behún BTRFS_BLOCK_GROUP_RAID10) 744d4a704afSMarek Behún #define BTRFS_BLOCK_GROUP_RAID56_MASK (BTRFS_BLOCK_GROUP_RAID5 | \ 745d4a704afSMarek Behún BTRFS_BLOCK_GROUP_RAID6) 746d4a704afSMarek Behún 747d4a704afSMarek Behún /* 748d4a704afSMarek Behún * We need a bit for restriper to be able to tell when chunks of type 749d4a704afSMarek Behún * SINGLE are available. This "extended" profile format is used in 750d4a704afSMarek Behún * fs_info->avail_*_alloc_bits (in-memory) and balance item fields 751d4a704afSMarek Behún * (on-disk). The corresponding on-disk bit in chunk.type is reserved 752d4a704afSMarek Behún * to avoid remappings between two formats in future. 753d4a704afSMarek Behún */ 754d4a704afSMarek Behún #define BTRFS_AVAIL_ALLOC_BIT_SINGLE (1ULL << 48) 755d4a704afSMarek Behún 756d4a704afSMarek Behún /* 757d4a704afSMarek Behún * A fake block group type that is used to communicate global block reserve 758d4a704afSMarek Behún * size to userspace via the SPACE_INFO ioctl. 759d4a704afSMarek Behún */ 760d4a704afSMarek Behún #define BTRFS_SPACE_INFO_GLOBAL_RSV (1ULL << 49) 761d4a704afSMarek Behún 762d4a704afSMarek Behún #define BTRFS_EXTENDED_PROFILE_MASK (BTRFS_BLOCK_GROUP_PROFILE_MASK | \ 763d4a704afSMarek Behún BTRFS_AVAIL_ALLOC_BIT_SINGLE) 764d4a704afSMarek Behún 765d4a704afSMarek Behún #endif /* __BTRFS_BTRFS_TREE_H__ */ 766