forked from RepoMirrors/btrfs
491 lines
15 KiB
Go
491 lines
15 KiB
Go
package btrfs
|
|
|
|
// This code was auto-generated; DO NOT EDIT!
|
|
|
|
// 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.
|
|
|
|
const (
|
|
// Holds pointers to all of the tree roots
|
|
rootTreeObjectid = 1
|
|
|
|
// Stores information about which extents are in use, and reference counts
|
|
extentTreeObjectid = 2
|
|
|
|
// Chunk tree stores translations from logical -> physical block numbering
|
|
// the super block points to the chunk tree
|
|
chunkTreeObjectid = 3
|
|
|
|
// 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
|
|
devTreeObjectid = 4
|
|
|
|
// One per subvolume, storing files and directories
|
|
fsTreeObjectid = 5
|
|
|
|
// Directory objectid inside the root tree
|
|
rootTreeDirObjectid = 6
|
|
|
|
// Holds checksums of all the data extents
|
|
csumTreeObjectid = 7
|
|
|
|
// Holds quota configuration and tracking
|
|
quotaTreeObjectid = 8
|
|
|
|
// For storing items that use the BTRFS_UUID_KEY* types
|
|
uuidTreeObjectid = 9
|
|
|
|
// Tracks free space in block groups.
|
|
freeSpaceTreeObjectid = 10
|
|
|
|
// Device stats in the device tree
|
|
devStatsObjectid = 0
|
|
|
|
// For storing balance parameters in the root tree
|
|
balanceObjectid = (1<<64 - 4)
|
|
|
|
// Orhpan objectid for tracking unlinked/truncated files
|
|
orphanObjectid = (1<<64 - 5)
|
|
|
|
// Does write ahead logging to speed up fsyncs
|
|
treeLogObjectid = (1<<64 - 6)
|
|
treeLogFixupObjectid = (1<<64 - 7)
|
|
|
|
// For space balancing
|
|
treeRelocObjectid = (1<<64 - 8)
|
|
dataRelocTreeObjectid = (1<<64 - 9)
|
|
|
|
// Extent checksums all have this objectid
|
|
// this allows them to share the logging tree
|
|
// for fsyncs
|
|
extentCsumObjectid = (1<<64 - 10)
|
|
|
|
// For storing free space cache
|
|
freeSpaceObjectid = (1<<64 - 11)
|
|
|
|
// The inode number assigned to the special inode for storing
|
|
// free ino cache
|
|
freeInoObjectid = (1<<64 - 12)
|
|
|
|
// Dummy objectid represents multiple objectids
|
|
multipleObjectids = (1<<64 - 255)
|
|
|
|
// All files have objectids in this range.
|
|
firstFreeObjectid = 256
|
|
lastFreeObjectid = (1<<64 - 256)
|
|
firstChunkTreeObjectid = 256
|
|
|
|
// The device items go into the chunk tree. The key is in the form
|
|
// [ 1 BTRFS_DEV_ITEM_KEY device_id ]
|
|
devItemsObjectid = 1
|
|
|
|
btreeInodeObjectid = 1
|
|
|
|
emptySubvolDirObjectid = 2
|
|
|
|
devReplaceDevid = 0
|
|
|
|
// 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
|
|
inodeItemKey = 1
|
|
inodeRefKey = 12
|
|
inodeExtrefKey = 13
|
|
xattrItemKey = 24
|
|
orphanItemKey = 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.
|
|
dirLogItemKey = 60
|
|
dirLogIndexKey = 72
|
|
dirItemKey = 84
|
|
dirIndexKey = 96
|
|
// Extent data is for file data
|
|
extentDataKey = 108
|
|
|
|
// Extent csums are stored in a separate tree and hold csums for
|
|
// an entire extent on disk.
|
|
extentCsumKey = 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
|
|
rootItemKey = 132
|
|
|
|
// Root backrefs tie subvols and snapshots to the directory entries that
|
|
// reference them
|
|
rootBackrefKey = 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
|
|
rootRefKey = 156
|
|
|
|
// Extent items are in the extent map tree. These record which blocks
|
|
// are used, and how many references there are to each block
|
|
extentItemKey = 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.
|
|
metadataItemKey = 169
|
|
|
|
treeBlockRefKey = 176
|
|
|
|
extentDataRefKey = 178
|
|
|
|
extentRefV0Key = 180
|
|
|
|
sharedBlockRefKey = 182
|
|
|
|
sharedDataRefKey = 184
|
|
|
|
// Block groups give us hints into the extent allocation trees. Which
|
|
// blocks are free etc etc
|
|
blockGroupItemKey = 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).
|
|
freeSpaceInfoKey = 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).
|
|
freeSpaceExtentKey = 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.
|
|
freeSpaceBitmapKey = 200
|
|
|
|
devExtentKey = 204
|
|
devItemKey = 216
|
|
chunkItemKey = 228
|
|
|
|
// Records the overall state of the qgroups.
|
|
// There's only one instance of this key present,
|
|
// (0, BTRFS_QGROUP_STATUS_KEY, 0)
|
|
qgroupStatusKey = 240
|
|
// Records the currently used space of the qgroup.
|
|
// One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid).
|
|
qgroupInfoKey = 242
|
|
// Contains the user configured limits for the qgroup.
|
|
// One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid).
|
|
qgroupLimitKey = 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)
|
|
qgroupRelationKey = 246
|
|
|
|
// Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY.
|
|
balanceItemKey = 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)
|
|
temporaryItemKey = 248
|
|
|
|
// Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY
|
|
devStatsKey = 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)
|
|
persistentItemKey = 249
|
|
|
|
// Persistantly stores the device replace state in the device tree.
|
|
// The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0).
|
|
devReplaceKey = 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).
|
|
uuidKeySubvol = 251
|
|
uuidKeyReceivedSubvol = 252
|
|
|
|
// String items are for debugging. They just store a short string of
|
|
// data in the FS
|
|
stringItemKey = 253
|
|
|
|
// 32 bytes in various csum fields
|
|
csumSize = 32
|
|
|
|
// Csum types
|
|
csumTypeCrc32 = 0
|
|
|
|
// Flags definitions for directory entry item type
|
|
// Used by:
|
|
// struct btrfs_dir_item.type
|
|
ftUnknown = 0
|
|
ftRegFile = 1
|
|
ftDir = 2
|
|
ftChrdev = 3
|
|
ftBlkdev = 4
|
|
ftFifo = 5
|
|
ftSock = 6
|
|
ftSymlink = 7
|
|
ftXattr = 8
|
|
ftMax = 9
|
|
|
|
// 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)
|
|
|
|
// The internal btrfs device id
|
|
|
|
// Size of the device
|
|
|
|
// Bytes used
|
|
|
|
// Optimal io alignment for this device
|
|
|
|
// Optimal io width for this device
|
|
|
|
// Minimal io size for this device
|
|
|
|
// Type and info about this device
|
|
|
|
// Expected generation for this device
|
|
|
|
// Starting byte of this partition on the device,
|
|
// to allow for stripe alignment in the future
|
|
|
|
// Grouping information for allocation decisions
|
|
|
|
// Seek speed 0-100 where 100 is fastest
|
|
|
|
// Bandwidth 0-100 where 100 is fastest
|
|
|
|
// Btrfs generated uuid for this device
|
|
|
|
// Uuid of FS who owns this device
|
|
|
|
// Size of this chunk in bytes
|
|
|
|
// Objectid of the root referencing this chunk
|
|
|
|
// Optimal io alignment for this chunk
|
|
|
|
// Optimal io width for this chunk
|
|
|
|
// Minimal io size for this chunk
|
|
|
|
// 2^16 stripes is quite a lot, a second limit is the size of a single
|
|
// item in the btree
|
|
|
|
// Sub stripes only matter for raid10
|
|
// Additional stripes go here
|
|
|
|
freeSpaceExtent = 1
|
|
freeSpaceBitmap = 2
|
|
|
|
headerFlagWritten = (1 << 0)
|
|
headerFlagReloc = (1 << 1)
|
|
|
|
// Super block flags
|
|
// Errors detected
|
|
superFlagError = (1 << 2)
|
|
|
|
superFlagSeeding = (1 << 32)
|
|
superFlagMetadump = (1 << 33)
|
|
|
|
// Items in the extent btree are used to record the objectid of the
|
|
// owner of the block and the number of references
|
|
|
|
extentFlagData = (1 << 0)
|
|
extentFlagTreeBlock = (1 << 1)
|
|
|
|
// Following flags only apply to tree blocks
|
|
|
|
// Use full backrefs for extent pointers in the block
|
|
blockFlagFullBackref = (1 << 8)
|
|
|
|
// This flag is only used internally by scrub and may be changed at any time
|
|
// it is only declared here to avoid collisions
|
|
extentFlagSuper = (1 << 48)
|
|
|
|
// Old style backrefs item
|
|
|
|
// Dev extents record free space on individual devices. The owner
|
|
// field points back to the chunk allocation mapping tree that allocated
|
|
// the extent. The chunk tree uuid field is a way to double check the owner
|
|
|
|
// Name goes here
|
|
|
|
// Name goes here
|
|
|
|
// Nfs style generation number
|
|
// Transid that last touched this inode
|
|
|
|
// Modification sequence number for NFS
|
|
|
|
// A little future expansion, for more than this we can
|
|
// just grow the inode item and version it
|
|
|
|
rootSubvolRdonly = (1 << 0)
|
|
|
|
// Internal in-memory flag that a subvolume has been marked for deletion but
|
|
// still visible as a directory
|
|
rootSubvolDead = (1 << 48)
|
|
|
|
// The following fields appear after subvol_uuids+subvol_times
|
|
// were introduced.
|
|
|
|
// This generation number is used to test if the new fields are valid
|
|
// and up to date while reading the root item. Every time the root item
|
|
// is written out, the "generation" field is copied into this field. If
|
|
// anyone ever mounted the fs with an older kernel, we will have
|
|
// mismatching generation values here and thus must invalidate the
|
|
// new fields. See btrfs_update_root and btrfs_find_last_root for
|
|
// details.
|
|
// the offset of generation_v2 is also used as the start for the memset
|
|
// when invalidating the fields.
|
|
|
|
// This is used for both forward and backward root refs
|
|
|
|
// Profiles to operate on, single is denoted by
|
|
// BTRFS_AVAIL_ALLOC_BIT_SINGLE
|
|
|
|
// Usage filter
|
|
// BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N'
|
|
// BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max
|
|
|
|
// Devid filter
|
|
|
|
// Devid subset filter [pstart..pend)
|
|
|
|
// Btrfs virtual address space subset filter [vstart..vend)
|
|
|
|
// Profile to convert to, single is denoted by
|
|
// BTRFS_AVAIL_ALLOC_BIT_SINGLE
|
|
|
|
// BTRFS_BALANCE_ARGS_*
|
|
|
|
// BTRFS_BALANCE_ARGS_LIMIT with value 'limit'
|
|
// BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum
|
|
// and maximum
|
|
|
|
// Process chunks that cross stripes_min..stripes_max devices,
|
|
// BTRFS_BALANCE_ARGS_STRIPES_RANGE
|
|
|
|
// Store balance parameters to disk so that balance can be properly
|
|
// resumed after crash or unmount
|
|
// BTRFS_BALANCE_*
|
|
|
|
fileExtentInline = 0
|
|
fileExtentReg = 1
|
|
fileExtentPrealloc = 2
|
|
|
|
// Transaction id that created this extent
|
|
// Max number of bytes to hold this extent in ram
|
|
// when we split a compressed extent we can't know how big
|
|
// each of the resulting pieces will be. So, this is
|
|
// an upper limit on the size of the extent in ram instead of
|
|
// an exact limit.
|
|
|
|
// 32 bits for the various ways we might encode the data,
|
|
// including compression and encryption. If any of these
|
|
// are set to something a given disk format doesn't understand
|
|
// it is treated like an incompat flag for reading and writing,
|
|
// but not for stat.
|
|
|
|
// Are we inline data or a real extent?
|
|
|
|
// Disk space consumed by the extent, checksum blocks are included
|
|
// in these numbers
|
|
// At this offset in the structure, the inline extent data start.
|
|
// The logical offset in file blocks (no csums)
|
|
// this extent record is for. This allows a file extent to point
|
|
// into the middle of an existing extent on disk, sharing it
|
|
// between two snapshots (useful if some bytes in the middle of the
|
|
// extent have changed
|
|
// The logical number of file blocks (no csums included). This
|
|
// always reflects the size uncompressed and without encoding.
|
|
|
|
// Grow this item struct at the end for future enhancements and keep
|
|
// the existing values unchanged
|
|
|
|
devReplaceItemContReadingFromSrcdevModeAlways = 0
|
|
devReplaceItemContReadingFromSrcdevModeAvoid = 1
|
|
devReplaceItemStateNeverStarted = 0
|
|
devReplaceItemStateStarted = 1
|
|
devReplaceItemStateSuspended = 2
|
|
devReplaceItemStateFinished = 3
|
|
devReplaceItemStateCanceled = 4
|
|
|
|
// Grow this item struct at the end for future enhancements and keep
|
|
// the existing values unchanged
|
|
|
|
// Different types of block groups (and chunks)
|
|
blockGroupData = (1 << 0)
|
|
blockGroupSystem = (1 << 1)
|
|
blockGroupMetadata = (1 << 2)
|
|
blockGroupRaid0 = (1 << 3)
|
|
blockGroupRaid1 = (1 << 4)
|
|
blockGroupDup = (1 << 5)
|
|
blockGroupRaid10 = (1 << 6)
|
|
blockGroupRaid5 = (1 << 7)
|
|
blockGroupRaid6 = (1 << 8)
|
|
|
|
// We need a bit for restriper to be able to tell when chunks of type
|
|
// SINGLE are available. This "extended" profile format is used in
|
|
// fs_info->avail_*_alloc_bits (in-memory) and balance item fields
|
|
// (on-disk). The corresponding on-disk bit in chunk.type is reserved
|
|
// to avoid remappings between two formats in future.
|
|
availAllocBitSingle = (1 << 48)
|
|
|
|
// A fake block group type that is used to communicate global block reserve
|
|
// size to userspace via the SPACE_INFO ioctl.
|
|
spaceInfoGlobalRsv = (1 << 49)
|
|
|
|
freeSpaceUsingBitmaps = (1 << 0)
|
|
|
|
qgroupLevelShift = 48
|
|
|
|
// Is subvolume quota turned on?
|
|
qgroupStatusFlagOn = (1 << 0)
|
|
// RESCAN is set during the initialization phase
|
|
qgroupStatusFlagRescan = (1 << 1)
|
|
// Some qgroup entries are known to be out of date,
|
|
// either because the configuration has changed in a way that
|
|
// makes a rescan necessary, or because the fs has been mounted
|
|
// with a non-qgroup-aware version.
|
|
// Turning qouta off and on again makes it inconsistent, too.
|
|
qgroupStatusFlagInconsistent = (1 << 2)
|
|
|
|
qgroupStatusVersion = 1
|
|
|
|
// The generation is updated during every commit. As older
|
|
// versions of btrfs are not aware of qgroups, it will be
|
|
// possible to detect inconsistencies by checking the
|
|
// generation on mount time
|
|
|
|
// Flag definitions see above
|
|
|
|
// Only used during scanning to record the progress
|
|
// of the scan. It contains a logical address
|
|
|
|
// Only updated when any of the other values change
|
|
|
|
)
|