1326 lines · 34.8 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */#ifndef _BTRFS_CTREE_H_#define _BTRFS_CTREE_H_ #include <linux/btrfs.h>#include <linux/types.h>#ifdef __KERNEL__#include <linux/stddef.h>#else#include <stddef.h>#endif /* ASCII for _BHRfS_M, no terminating nul */#define BTRFS_MAGIC 0x4D5F53665248425FULL #define BTRFS_MAX_LEVEL 8 /* * We can actually store much bigger names, but lets not confuse the rest of * linux. */#define BTRFS_NAME_LEN 255 /* * Theoretical limit is larger, but we keep this down to a sane value. That * should limit greatly the possibility of collisions on inode ref items. */#define BTRFS_LINK_MAX 65535U /* * This header contains the structure definitions and constants used * by file system objects that can be retrieved using * the BTRFS_IOC_SEARCH_TREE ioctl.  That means basically anything that * is needed to describe a leaf node's key or item contents. */ /* holds pointers to all of the tree roots */#define BTRFS_ROOT_TREE_OBJECTID 1ULL /* stores information about which extents are in use, and reference counts */#define BTRFS_EXTENT_TREE_OBJECTID 2ULL /* * chunk tree stores translations from logical -> physical block numbering * the super block points to the chunk tree */#define BTRFS_CHUNK_TREE_OBJECTID 3ULL /* * stores information about which areas of a given device are in use. * one per device.  The tree of tree roots points to the device tree */#define BTRFS_DEV_TREE_OBJECTID 4ULL /* one per subvolume, storing files and directories */#define BTRFS_FS_TREE_OBJECTID 5ULL /* directory objectid inside the root tree */#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL /* holds checksums of all the data extents */#define BTRFS_CSUM_TREE_OBJECTID 7ULL /* holds quota configuration and tracking */#define BTRFS_QUOTA_TREE_OBJECTID 8ULL /* for storing items that use the BTRFS_UUID_KEY* types */#define BTRFS_UUID_TREE_OBJECTID 9ULL /* tracks free space in block groups. */#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL /* Holds the block group items for extent tree v2. */#define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL /* Tracks RAID stripes in block groups. */#define BTRFS_RAID_STRIPE_TREE_OBJECTID 12ULL /* device stats in the device tree */#define BTRFS_DEV_STATS_OBJECTID 0ULL /* for storing balance parameters in the root tree */#define BTRFS_BALANCE_OBJECTID -4ULL /* orphan objectid for tracking unlinked/truncated files */#define BTRFS_ORPHAN_OBJECTID -5ULL /* does write ahead logging to speed up fsyncs */#define BTRFS_TREE_LOG_OBJECTID -6ULL#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL /* for space balancing */#define BTRFS_TREE_RELOC_OBJECTID -8ULL#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL /* * extent checksums all have this objectid * this allows them to share the logging tree * for fsyncs */#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL /* For storing free space cache */#define BTRFS_FREE_SPACE_OBJECTID -11ULL /* * The inode number assigned to the special inode for storing * free ino cache */#define BTRFS_FREE_INO_OBJECTID -12ULL /* dummy objectid represents multiple objectids */#define BTRFS_MULTIPLE_OBJECTIDS -255ULL /* * All files have objectids in this range. */#define BTRFS_FIRST_FREE_OBJECTID 256ULL#define BTRFS_LAST_FREE_OBJECTID -256ULL#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL  /* * the device items go into the chunk tree.  The key is in the form * [ 1 BTRFS_DEV_ITEM_KEY device_id ] */#define BTRFS_DEV_ITEMS_OBJECTID 1ULL #define BTRFS_BTREE_INODE_OBJECTID 1 #define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2 #define BTRFS_DEV_REPLACE_DEVID 0ULL /* * inode items have the data typically returned from stat and store other * info about object characteristics.  There is one for every file and dir in * the FS */#define BTRFS_INODE_ITEM_KEY		1#define BTRFS_INODE_REF_KEY		12#define BTRFS_INODE_EXTREF_KEY		13#define BTRFS_XATTR_ITEM_KEY		24 /* * fs verity items are stored under two different key types on disk. * The descriptor items: * [ inode objectid, BTRFS_VERITY_DESC_ITEM_KEY, offset ] * * At offset 0, we store a btrfs_verity_descriptor_item which tracks the size * of the descriptor item and some extra data for encryption. * Starting at offset 1, these hold the generic fs verity descriptor.  The * latter are opaque to btrfs, we just read and write them as a blob for the * higher level verity code.  The most common descriptor size is 256 bytes. * * The merkle tree items: * [ inode objectid, BTRFS_VERITY_MERKLE_ITEM_KEY, offset ] * * These also start at offset 0, and correspond to the merkle tree bytes.  When * fsverity asks for page 0 of the merkle tree, we pull up one page starting at * offset 0 for this key type.  These are also opaque to btrfs, we're blindly * storing whatever fsverity sends down. */#define BTRFS_VERITY_DESC_ITEM_KEY	36#define BTRFS_VERITY_MERKLE_ITEM_KEY	37 #define BTRFS_ORPHAN_ITEM_KEY		48/* reserve 2-15 close to the inode for later flexibility */ /* * dir items are the name -> inode pointers in a directory.  There is one * for every name in a directory.  BTRFS_DIR_LOG_ITEM_KEY is no longer used * but it's still defined here for documentation purposes and to help avoid * having its numerical value reused in the future. */#define BTRFS_DIR_LOG_ITEM_KEY  60#define BTRFS_DIR_LOG_INDEX_KEY 72#define BTRFS_DIR_ITEM_KEY	84#define BTRFS_DIR_INDEX_KEY	96/* * extent data is for file data */#define BTRFS_EXTENT_DATA_KEY	108 /* * extent csums are stored in a separate tree and hold csums for * an entire extent on disk. */#define BTRFS_EXTENT_CSUM_KEY	128 /* * root items point to tree roots.  They are typically in the root * tree used by the super block to find all the other trees */#define BTRFS_ROOT_ITEM_KEY	132 /* * root backrefs tie subvols and snapshots to the directory entries that * reference them */#define BTRFS_ROOT_BACKREF_KEY	144 /* * root refs make a fast index for listing all of the snapshots and * subvolumes referenced by a given root.  They point directly to the * directory item in the root that references the subvol */#define BTRFS_ROOT_REF_KEY	156 /* * extent items are in the extent map tree.  These record which blocks * are used, and how many references there are to each block */#define BTRFS_EXTENT_ITEM_KEY	168 /* * The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know * the length, so we save the level in key->offset instead of the length. */#define BTRFS_METADATA_ITEM_KEY	169 /* * Special inline ref key which stores the id of the subvolume which originally * created the extent. This subvolume owns the extent permanently from the * perspective of simple quotas. Needed to know which subvolume to free quota * usage from when the extent is deleted. * * Stored as an inline ref rather to avoid wasting space on a separate item on * top of the existing extent item. However, unlike the other inline refs, * there is one one owner ref per extent rather than one per extent. * * Because of this, it goes at the front of the list of inline refs, and thus * must have a lower type value than any other inline ref type (to satisfy the * disk format rule that inline refs have non-decreasing type). */#define BTRFS_EXTENT_OWNER_REF_KEY	172 #define BTRFS_TREE_BLOCK_REF_KEY	176 #define BTRFS_EXTENT_DATA_REF_KEY	178 /* * Obsolete key. Defintion removed in 6.6, value may be reused in the future. * * #define BTRFS_EXTENT_REF_V0_KEY	180 */ #define BTRFS_SHARED_BLOCK_REF_KEY	182 #define BTRFS_SHARED_DATA_REF_KEY	184 /* * block groups give us hints into the extent allocation trees.  Which * blocks are free etc etc */#define BTRFS_BLOCK_GROUP_ITEM_KEY 192 /* * Every block group is represented in the free space tree by a free space info * item, which stores some accounting information. It is keyed on * (block_group_start, FREE_SPACE_INFO, block_group_length). */#define BTRFS_FREE_SPACE_INFO_KEY 198 /* * A free space extent tracks an extent of space that is free in a block group. * It is keyed on (start, FREE_SPACE_EXTENT, length). */#define BTRFS_FREE_SPACE_EXTENT_KEY 199 /* * When a block group becomes very fragmented, we convert it to use bitmaps * instead of extents. A free space bitmap is keyed on * (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with * (length / sectorsize) bits. */#define BTRFS_FREE_SPACE_BITMAP_KEY 200 #define BTRFS_DEV_EXTENT_KEY	204#define BTRFS_DEV_ITEM_KEY	216#define BTRFS_CHUNK_ITEM_KEY	228 #define BTRFS_RAID_STRIPE_KEY	230 /* * Records the overall state of the qgroups. * There's only one instance of this key present, * (0, BTRFS_QGROUP_STATUS_KEY, 0) */#define BTRFS_QGROUP_STATUS_KEY         240/* * Records the currently used space of the qgroup. * One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid). */#define BTRFS_QGROUP_INFO_KEY           242/* * Contains the user configured limits for the qgroup. * One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid). */#define BTRFS_QGROUP_LIMIT_KEY          244/* * Records the child-parent relationship of qgroups. For * each relation, 2 keys are present: * (childid, BTRFS_QGROUP_RELATION_KEY, parentid) * (parentid, BTRFS_QGROUP_RELATION_KEY, childid) */#define BTRFS_QGROUP_RELATION_KEY       246 /* * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY. */#define BTRFS_BALANCE_ITEM_KEY	248 /* * The key type for tree items that are stored persistently, but do not need to * exist for extended period of time. The items can exist in any tree. * * [subtype, BTRFS_TEMPORARY_ITEM_KEY, data] * * Existing items: * * - balance status item *   (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0) */#define BTRFS_TEMPORARY_ITEM_KEY	248 /* * Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY */#define BTRFS_DEV_STATS_KEY		249 /* * The key type for tree items that are stored persistently and usually exist * for a long period, eg. filesystem lifetime. The item kinds can be status * information, stats or preference values. The item can exist in any tree. * * [subtype, BTRFS_PERSISTENT_ITEM_KEY, data] * * Existing items: * * - device statistics, store IO stats in the device tree, one key for all *   stats *   (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0) */#define BTRFS_PERSISTENT_ITEM_KEY	249 /* * Persistently stores the device replace state in the device tree. * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0). */#define BTRFS_DEV_REPLACE_KEY	250 /* * Stores items that allow to quickly map UUIDs to something else. * These items are part of the filesystem UUID tree. * The key is built like this: * (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits). */#if BTRFS_UUID_SIZE != 16#error "UUID items require BTRFS_UUID_SIZE == 16!"#endif#define BTRFS_UUID_KEY_SUBVOL	251	/* for UUIDs assigned to subvols */#define BTRFS_UUID_KEY_RECEIVED_SUBVOL	252	/* for UUIDs assigned to						 * received subvols */ /* * string items are for debugging.  They just store a short string of * data in the FS */#define BTRFS_STRING_ITEM_KEY	253 /* Maximum metadata block size (nodesize) */#define BTRFS_MAX_METADATA_BLOCKSIZE			65536 /* 32 bytes in various csum fields */#define BTRFS_CSUM_SIZE 32 /* csum types */enum btrfs_csum_type {	BTRFS_CSUM_TYPE_CRC32	= 0,	BTRFS_CSUM_TYPE_XXHASH	= 1,	BTRFS_CSUM_TYPE_SHA256	= 2,	BTRFS_CSUM_TYPE_BLAKE2	= 3,}; /* * flags definitions for directory entry item type * * Used by: * struct btrfs_dir_item.type * * Values 0..7 must match common file type values in fs_types.h. */#define BTRFS_FT_UNKNOWN	0#define BTRFS_FT_REG_FILE	1#define BTRFS_FT_DIR		2#define BTRFS_FT_CHRDEV		3#define BTRFS_FT_BLKDEV		4#define BTRFS_FT_FIFO		5#define BTRFS_FT_SOCK		6#define BTRFS_FT_SYMLINK	7#define BTRFS_FT_XATTR		8#define BTRFS_FT_MAX		9/* Directory contains encrypted data */#define BTRFS_FT_ENCRYPTED	0x80 static inline __u8 btrfs_dir_flags_to_ftype(__u8 flags){	return flags & ~BTRFS_FT_ENCRYPTED;} /* * Inode flags */#define BTRFS_INODE_NODATASUM		(1U << 0)#define BTRFS_INODE_NODATACOW		(1U << 1)#define BTRFS_INODE_READONLY		(1U << 2)#define BTRFS_INODE_NOCOMPRESS		(1U << 3)#define BTRFS_INODE_PREALLOC		(1U << 4)#define BTRFS_INODE_SYNC		(1U << 5)#define BTRFS_INODE_IMMUTABLE		(1U << 6)#define BTRFS_INODE_APPEND		(1U << 7)#define BTRFS_INODE_NODUMP		(1U << 8)#define BTRFS_INODE_NOATIME		(1U << 9)#define BTRFS_INODE_DIRSYNC		(1U << 10)#define BTRFS_INODE_COMPRESS		(1U << 11) #define BTRFS_INODE_ROOT_ITEM_INIT	(1U << 31) #define BTRFS_INODE_FLAG_MASK						\	(BTRFS_INODE_NODATASUM |					\	 BTRFS_INODE_NODATACOW |					\	 BTRFS_INODE_READONLY |						\	 BTRFS_INODE_NOCOMPRESS |					\	 BTRFS_INODE_PREALLOC |						\	 BTRFS_INODE_SYNC |						\	 BTRFS_INODE_IMMUTABLE |					\	 BTRFS_INODE_APPEND |						\	 BTRFS_INODE_NODUMP |						\	 BTRFS_INODE_NOATIME |						\	 BTRFS_INODE_DIRSYNC |						\	 BTRFS_INODE_COMPRESS |						\	 BTRFS_INODE_ROOT_ITEM_INIT) #define BTRFS_INODE_RO_VERITY		(1U << 0) #define BTRFS_INODE_RO_FLAG_MASK	(BTRFS_INODE_RO_VERITY) /* * The key defines the order in the tree, and so it also defines (optimal) * block layout. * * objectid corresponds to the inode number. * * type tells us things about the object, and is a kind of stream selector. * so for a given inode, keys with type of 1 might refer to the inode data, * type of 2 may point to file data in the btree and type == 3 may point to * extents. * * offset is the starting byte offset for this key in the stream. * * btrfs_disk_key is in disk byte order.  struct btrfs_key is always * in cpu native order.  Otherwise they are identical and their sizes * should be the same (ie both packed) */struct btrfs_disk_key {	__le64 objectid;	__u8 type;	__le64 offset;} __attribute__ ((__packed__)); struct btrfs_key {	__u64 objectid;	__u8 type;	__u64 offset;} __attribute__ ((__packed__)); /* * Every tree block (leaf or node) starts with this header. */struct btrfs_header {	/* These first four must match the super block */	__u8 csum[BTRFS_CSUM_SIZE];	/* FS specific uuid */	__u8 fsid[BTRFS_FSID_SIZE];	/* Which block this node is supposed to live in */	__le64 bytenr;	__le64 flags; 	/* Allowed to be different from the super from here on down */	__u8 chunk_tree_uuid[BTRFS_UUID_SIZE];	__le64 generation;	__le64 owner;	__le32 nritems;	__u8 level;} __attribute__ ((__packed__)); /* * This is a very generous portion of the super block, giving us room to * translate 14 chunks with 3 stripes each.

Lines 1–500 of 1326.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t