xref: /linux/include/uapi/linux/btrfs_tree.h (revision 1a9fd4172d5c8ba64735b3aef7eed643d398ce05)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2db671160SJeff Mahoney #ifndef _BTRFS_CTREE_H_
3db671160SJeff Mahoney #define _BTRFS_CTREE_H_
4db671160SJeff Mahoney 
53a4e7f56SNicolas Dichtel #include <linux/btrfs.h>
69078b4eeSNicolas Dichtel #include <linux/types.h>
71465af12SQu Wenruo #ifdef __KERNEL__
81465af12SQu Wenruo #include <linux/stddef.h>
91465af12SQu Wenruo #else
101465af12SQu Wenruo #include <stddef.h>
111465af12SQu Wenruo #endif
129078b4eeSNicolas Dichtel 
13db671160SJeff Mahoney /*
14db671160SJeff Mahoney  * This header contains the structure definitions and constants used
15db671160SJeff Mahoney  * by file system objects that can be retrieved using
16db671160SJeff Mahoney  * the BTRFS_IOC_SEARCH_TREE ioctl.  That means basically anything that
17db671160SJeff Mahoney  * is needed to describe a leaf node's key or item contents.
18db671160SJeff Mahoney  */
19db671160SJeff Mahoney 
20db671160SJeff Mahoney /* holds pointers to all of the tree roots */
21db671160SJeff Mahoney #define BTRFS_ROOT_TREE_OBJECTID 1ULL
22db671160SJeff Mahoney 
23db671160SJeff Mahoney /* stores information about which extents are in use, and reference counts */
24db671160SJeff Mahoney #define BTRFS_EXTENT_TREE_OBJECTID 2ULL
25db671160SJeff Mahoney 
26db671160SJeff Mahoney /*
27db671160SJeff Mahoney  * chunk tree stores translations from logical -> physical block numbering
28db671160SJeff Mahoney  * the super block points to the chunk tree
29db671160SJeff Mahoney  */
30db671160SJeff Mahoney #define BTRFS_CHUNK_TREE_OBJECTID 3ULL
31db671160SJeff Mahoney 
32db671160SJeff Mahoney /*
33db671160SJeff Mahoney  * stores information about which areas of a given device are in use.
34db671160SJeff Mahoney  * one per device.  The tree of tree roots points to the device tree
35db671160SJeff Mahoney  */
36db671160SJeff Mahoney #define BTRFS_DEV_TREE_OBJECTID 4ULL
37db671160SJeff Mahoney 
38db671160SJeff Mahoney /* one per subvolume, storing files and directories */
39db671160SJeff Mahoney #define BTRFS_FS_TREE_OBJECTID 5ULL
40db671160SJeff Mahoney 
41db671160SJeff Mahoney /* directory objectid inside the root tree */
42db671160SJeff Mahoney #define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
43db671160SJeff Mahoney 
44db671160SJeff Mahoney /* holds checksums of all the data extents */
45db671160SJeff Mahoney #define BTRFS_CSUM_TREE_OBJECTID 7ULL
46db671160SJeff Mahoney 
47db671160SJeff Mahoney /* holds quota configuration and tracking */
48db671160SJeff Mahoney #define BTRFS_QUOTA_TREE_OBJECTID 8ULL
49db671160SJeff Mahoney 
50db671160SJeff Mahoney /* for storing items that use the BTRFS_UUID_KEY* types */
51db671160SJeff Mahoney #define BTRFS_UUID_TREE_OBJECTID 9ULL
52db671160SJeff Mahoney 
53db671160SJeff Mahoney /* tracks free space in block groups. */
54db671160SJeff Mahoney #define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
55db671160SJeff Mahoney 
56db671160SJeff Mahoney /* device stats in the device tree */
57db671160SJeff Mahoney #define BTRFS_DEV_STATS_OBJECTID 0ULL
58db671160SJeff Mahoney 
59db671160SJeff Mahoney /* for storing balance parameters in the root tree */
60db671160SJeff Mahoney #define BTRFS_BALANCE_OBJECTID -4ULL
61db671160SJeff Mahoney 
62*1a9fd417SDavid Sterba /* orphan objectid for tracking unlinked/truncated files */
63db671160SJeff Mahoney #define BTRFS_ORPHAN_OBJECTID -5ULL
64db671160SJeff Mahoney 
65db671160SJeff Mahoney /* does write ahead logging to speed up fsyncs */
66db671160SJeff Mahoney #define BTRFS_TREE_LOG_OBJECTID -6ULL
67db671160SJeff Mahoney #define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL
68db671160SJeff Mahoney 
69db671160SJeff Mahoney /* for space balancing */
70db671160SJeff Mahoney #define BTRFS_TREE_RELOC_OBJECTID -8ULL
71db671160SJeff Mahoney #define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL
72db671160SJeff Mahoney 
73db671160SJeff Mahoney /*
74db671160SJeff Mahoney  * extent checksums all have this objectid
75db671160SJeff Mahoney  * this allows them to share the logging tree
76db671160SJeff Mahoney  * for fsyncs
77db671160SJeff Mahoney  */
78db671160SJeff Mahoney #define BTRFS_EXTENT_CSUM_OBJECTID -10ULL
79db671160SJeff Mahoney 
80db671160SJeff Mahoney /* For storing free space cache */
81db671160SJeff Mahoney #define BTRFS_FREE_SPACE_OBJECTID -11ULL
82db671160SJeff Mahoney 
83db671160SJeff Mahoney /*
84db671160SJeff Mahoney  * The inode number assigned to the special inode for storing
85db671160SJeff Mahoney  * free ino cache
86db671160SJeff Mahoney  */
87db671160SJeff Mahoney #define BTRFS_FREE_INO_OBJECTID -12ULL
88db671160SJeff Mahoney 
89db671160SJeff Mahoney /* dummy objectid represents multiple objectids */
90db671160SJeff Mahoney #define BTRFS_MULTIPLE_OBJECTIDS -255ULL
91db671160SJeff Mahoney 
92db671160SJeff Mahoney /*
93db671160SJeff Mahoney  * All files have objectids in this range.
94db671160SJeff Mahoney  */
95db671160SJeff Mahoney #define BTRFS_FIRST_FREE_OBJECTID 256ULL
96db671160SJeff Mahoney #define BTRFS_LAST_FREE_OBJECTID -256ULL
97db671160SJeff Mahoney #define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
98db671160SJeff Mahoney 
99db671160SJeff Mahoney 
100db671160SJeff Mahoney /*
101db671160SJeff Mahoney  * the device items go into the chunk tree.  The key is in the form
102db671160SJeff Mahoney  * [ 1 BTRFS_DEV_ITEM_KEY device_id ]
103db671160SJeff Mahoney  */
104db671160SJeff Mahoney #define BTRFS_DEV_ITEMS_OBJECTID 1ULL
105db671160SJeff Mahoney 
106db671160SJeff Mahoney #define BTRFS_BTREE_INODE_OBJECTID 1
107db671160SJeff Mahoney 
108db671160SJeff Mahoney #define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2
109db671160SJeff Mahoney 
110db671160SJeff Mahoney #define BTRFS_DEV_REPLACE_DEVID 0ULL
111db671160SJeff Mahoney 
112db671160SJeff Mahoney /*
113db671160SJeff Mahoney  * inode items have the data typically returned from stat and store other
114db671160SJeff Mahoney  * info about object characteristics.  There is one for every file and dir in
115db671160SJeff Mahoney  * the FS
116db671160SJeff Mahoney  */
117db671160SJeff Mahoney #define BTRFS_INODE_ITEM_KEY		1
118db671160SJeff Mahoney #define BTRFS_INODE_REF_KEY		12
119db671160SJeff Mahoney #define BTRFS_INODE_EXTREF_KEY		13
120db671160SJeff Mahoney #define BTRFS_XATTR_ITEM_KEY		24
121db671160SJeff Mahoney #define BTRFS_ORPHAN_ITEM_KEY		48
122db671160SJeff Mahoney /* reserve 2-15 close to the inode for later flexibility */
123db671160SJeff Mahoney 
124db671160SJeff Mahoney /*
125db671160SJeff Mahoney  * dir items are the name -> inode pointers in a directory.  There is one
126db671160SJeff Mahoney  * for every name in a directory.
127db671160SJeff Mahoney  */
128db671160SJeff Mahoney #define BTRFS_DIR_LOG_ITEM_KEY  60
129db671160SJeff Mahoney #define BTRFS_DIR_LOG_INDEX_KEY 72
130db671160SJeff Mahoney #define BTRFS_DIR_ITEM_KEY	84
131db671160SJeff Mahoney #define BTRFS_DIR_INDEX_KEY	96
132db671160SJeff Mahoney /*
133db671160SJeff Mahoney  * extent data is for file data
134db671160SJeff Mahoney  */
135db671160SJeff Mahoney #define BTRFS_EXTENT_DATA_KEY	108
136db671160SJeff Mahoney 
137db671160SJeff Mahoney /*
138db671160SJeff Mahoney  * extent csums are stored in a separate tree and hold csums for
139db671160SJeff Mahoney  * an entire extent on disk.
140db671160SJeff Mahoney  */
141db671160SJeff Mahoney #define BTRFS_EXTENT_CSUM_KEY	128
142db671160SJeff Mahoney 
143db671160SJeff Mahoney /*
144db671160SJeff Mahoney  * root items point to tree roots.  They are typically in the root
145db671160SJeff Mahoney  * tree used by the super block to find all the other trees
146db671160SJeff Mahoney  */
147db671160SJeff Mahoney #define BTRFS_ROOT_ITEM_KEY	132
148db671160SJeff Mahoney 
149db671160SJeff Mahoney /*
150db671160SJeff Mahoney  * root backrefs tie subvols and snapshots to the directory entries that
151db671160SJeff Mahoney  * reference them
152db671160SJeff Mahoney  */
153db671160SJeff Mahoney #define BTRFS_ROOT_BACKREF_KEY	144
154db671160SJeff Mahoney 
155db671160SJeff Mahoney /*
156db671160SJeff Mahoney  * root refs make a fast index for listing all of the snapshots and
157db671160SJeff Mahoney  * subvolumes referenced by a given root.  They point directly to the
158db671160SJeff Mahoney  * directory item in the root that references the subvol
159db671160SJeff Mahoney  */
160db671160SJeff Mahoney #define BTRFS_ROOT_REF_KEY	156
161db671160SJeff Mahoney 
162db671160SJeff Mahoney /*
163db671160SJeff Mahoney  * extent items are in the extent map tree.  These record which blocks
164db671160SJeff Mahoney  * are used, and how many references there are to each block
165db671160SJeff Mahoney  */
166db671160SJeff Mahoney #define BTRFS_EXTENT_ITEM_KEY	168
167db671160SJeff Mahoney 
168db671160SJeff Mahoney /*
169db671160SJeff Mahoney  * The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know
170db671160SJeff Mahoney  * the length, so we save the level in key->offset instead of the length.
171db671160SJeff Mahoney  */
172db671160SJeff Mahoney #define BTRFS_METADATA_ITEM_KEY	169
173db671160SJeff Mahoney 
174db671160SJeff Mahoney #define BTRFS_TREE_BLOCK_REF_KEY	176
175db671160SJeff Mahoney 
176db671160SJeff Mahoney #define BTRFS_EXTENT_DATA_REF_KEY	178
177db671160SJeff Mahoney 
178db671160SJeff Mahoney #define BTRFS_EXTENT_REF_V0_KEY		180
179db671160SJeff Mahoney 
180db671160SJeff Mahoney #define BTRFS_SHARED_BLOCK_REF_KEY	182
181db671160SJeff Mahoney 
182db671160SJeff Mahoney #define BTRFS_SHARED_DATA_REF_KEY	184
183db671160SJeff Mahoney 
184db671160SJeff Mahoney /*
185db671160SJeff Mahoney  * block groups give us hints into the extent allocation trees.  Which
186db671160SJeff Mahoney  * blocks are free etc etc
187db671160SJeff Mahoney  */
188db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_ITEM_KEY 192
189db671160SJeff Mahoney 
190db671160SJeff Mahoney /*
191db671160SJeff Mahoney  * Every block group is represented in the free space tree by a free space info
192db671160SJeff Mahoney  * item, which stores some accounting information. It is keyed on
193db671160SJeff Mahoney  * (block_group_start, FREE_SPACE_INFO, block_group_length).
194db671160SJeff Mahoney  */
195db671160SJeff Mahoney #define BTRFS_FREE_SPACE_INFO_KEY 198
196db671160SJeff Mahoney 
197db671160SJeff Mahoney /*
198db671160SJeff Mahoney  * A free space extent tracks an extent of space that is free in a block group.
199db671160SJeff Mahoney  * It is keyed on (start, FREE_SPACE_EXTENT, length).
200db671160SJeff Mahoney  */
201db671160SJeff Mahoney #define BTRFS_FREE_SPACE_EXTENT_KEY 199
202db671160SJeff Mahoney 
203db671160SJeff Mahoney /*
204db671160SJeff Mahoney  * When a block group becomes very fragmented, we convert it to use bitmaps
205db671160SJeff Mahoney  * instead of extents. A free space bitmap is keyed on
206db671160SJeff Mahoney  * (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with
207db671160SJeff Mahoney  * (length / sectorsize) bits.
208db671160SJeff Mahoney  */
209db671160SJeff Mahoney #define BTRFS_FREE_SPACE_BITMAP_KEY 200
210db671160SJeff Mahoney 
211db671160SJeff Mahoney #define BTRFS_DEV_EXTENT_KEY	204
212db671160SJeff Mahoney #define BTRFS_DEV_ITEM_KEY	216
213db671160SJeff Mahoney #define BTRFS_CHUNK_ITEM_KEY	228
214db671160SJeff Mahoney 
215db671160SJeff Mahoney /*
216db671160SJeff Mahoney  * Records the overall state of the qgroups.
217db671160SJeff Mahoney  * There's only one instance of this key present,
218db671160SJeff Mahoney  * (0, BTRFS_QGROUP_STATUS_KEY, 0)
219db671160SJeff Mahoney  */
220db671160SJeff Mahoney #define BTRFS_QGROUP_STATUS_KEY         240
221db671160SJeff Mahoney /*
222db671160SJeff Mahoney  * Records the currently used space of the qgroup.
223db671160SJeff Mahoney  * One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid).
224db671160SJeff Mahoney  */
225db671160SJeff Mahoney #define BTRFS_QGROUP_INFO_KEY           242
226db671160SJeff Mahoney /*
227db671160SJeff Mahoney  * Contains the user configured limits for the qgroup.
228db671160SJeff Mahoney  * One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid).
229db671160SJeff Mahoney  */
230db671160SJeff Mahoney #define BTRFS_QGROUP_LIMIT_KEY          244
231db671160SJeff Mahoney /*
232db671160SJeff Mahoney  * Records the child-parent relationship of qgroups. For
233db671160SJeff Mahoney  * each relation, 2 keys are present:
234db671160SJeff Mahoney  * (childid, BTRFS_QGROUP_RELATION_KEY, parentid)
235db671160SJeff Mahoney  * (parentid, BTRFS_QGROUP_RELATION_KEY, childid)
236db671160SJeff Mahoney  */
237db671160SJeff Mahoney #define BTRFS_QGROUP_RELATION_KEY       246
238db671160SJeff Mahoney 
239db671160SJeff Mahoney /*
240db671160SJeff Mahoney  * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY.
241db671160SJeff Mahoney  */
242db671160SJeff Mahoney #define BTRFS_BALANCE_ITEM_KEY	248
243db671160SJeff Mahoney 
244db671160SJeff Mahoney /*
245db671160SJeff Mahoney  * The key type for tree items that are stored persistently, but do not need to
246db671160SJeff Mahoney  * exist for extended period of time. The items can exist in any tree.
247db671160SJeff Mahoney  *
248db671160SJeff Mahoney  * [subtype, BTRFS_TEMPORARY_ITEM_KEY, data]
249db671160SJeff Mahoney  *
250db671160SJeff Mahoney  * Existing items:
251db671160SJeff Mahoney  *
252db671160SJeff Mahoney  * - balance status item
253db671160SJeff Mahoney  *   (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0)
254db671160SJeff Mahoney  */
255db671160SJeff Mahoney #define BTRFS_TEMPORARY_ITEM_KEY	248
256db671160SJeff Mahoney 
257db671160SJeff Mahoney /*
258db671160SJeff Mahoney  * Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY
259db671160SJeff Mahoney  */
260db671160SJeff Mahoney #define BTRFS_DEV_STATS_KEY		249
261db671160SJeff Mahoney 
262db671160SJeff Mahoney /*
263db671160SJeff Mahoney  * The key type for tree items that are stored persistently and usually exist
264db671160SJeff Mahoney  * for a long period, eg. filesystem lifetime. The item kinds can be status
265db671160SJeff Mahoney  * information, stats or preference values. The item can exist in any tree.
266db671160SJeff Mahoney  *
267db671160SJeff Mahoney  * [subtype, BTRFS_PERSISTENT_ITEM_KEY, data]
268db671160SJeff Mahoney  *
269db671160SJeff Mahoney  * Existing items:
270db671160SJeff Mahoney  *
271db671160SJeff Mahoney  * - device statistics, store IO stats in the device tree, one key for all
272db671160SJeff Mahoney  *   stats
273db671160SJeff Mahoney  *   (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0)
274db671160SJeff Mahoney  */
275db671160SJeff Mahoney #define BTRFS_PERSISTENT_ITEM_KEY	249
276db671160SJeff Mahoney 
277db671160SJeff Mahoney /*
278*1a9fd417SDavid Sterba  * Persistently stores the device replace state in the device tree.
279db671160SJeff Mahoney  * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0).
280db671160SJeff Mahoney  */
281db671160SJeff Mahoney #define BTRFS_DEV_REPLACE_KEY	250
282db671160SJeff Mahoney 
283db671160SJeff Mahoney /*
284db671160SJeff Mahoney  * Stores items that allow to quickly map UUIDs to something else.
285db671160SJeff Mahoney  * These items are part of the filesystem UUID tree.
286db671160SJeff Mahoney  * The key is built like this:
287db671160SJeff Mahoney  * (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits).
288db671160SJeff Mahoney  */
289db671160SJeff Mahoney #if BTRFS_UUID_SIZE != 16
290db671160SJeff Mahoney #error "UUID items require BTRFS_UUID_SIZE == 16!"
291db671160SJeff Mahoney #endif
292db671160SJeff Mahoney #define BTRFS_UUID_KEY_SUBVOL	251	/* for UUIDs assigned to subvols */
293db671160SJeff Mahoney #define BTRFS_UUID_KEY_RECEIVED_SUBVOL	252	/* for UUIDs assigned to
294db671160SJeff Mahoney 						 * received subvols */
295db671160SJeff Mahoney 
296db671160SJeff Mahoney /*
297db671160SJeff Mahoney  * string items are for debugging.  They just store a short string of
298db671160SJeff Mahoney  * data in the FS
299db671160SJeff Mahoney  */
300db671160SJeff Mahoney #define BTRFS_STRING_ITEM_KEY	253
301db671160SJeff Mahoney 
302deb67895SQu Wenruo /* Maximum metadata block size (nodesize) */
303deb67895SQu Wenruo #define BTRFS_MAX_METADATA_BLOCKSIZE			65536
304db671160SJeff Mahoney 
305db671160SJeff Mahoney /* 32 bytes in various csum fields */
306db671160SJeff Mahoney #define BTRFS_CSUM_SIZE 32
307db671160SJeff Mahoney 
308db671160SJeff Mahoney /* csum types */
309e35b79a1SJohannes Thumshirn enum btrfs_csum_type {
310e35b79a1SJohannes Thumshirn 	BTRFS_CSUM_TYPE_CRC32	= 0,
3113951e7f0SJohannes Thumshirn 	BTRFS_CSUM_TYPE_XXHASH	= 1,
3123831bf00SJohannes Thumshirn 	BTRFS_CSUM_TYPE_SHA256	= 2,
313352ae07bSDavid Sterba 	BTRFS_CSUM_TYPE_BLAKE2	= 3,
314e35b79a1SJohannes Thumshirn };
315db671160SJeff Mahoney 
316db671160SJeff Mahoney /*
317db671160SJeff Mahoney  * flags definitions for directory entry item type
318db671160SJeff Mahoney  *
319db671160SJeff Mahoney  * Used by:
320db671160SJeff Mahoney  * struct btrfs_dir_item.type
3217d157c3dSPhillip Potter  *
3227d157c3dSPhillip Potter  * Values 0..7 must match common file type values in fs_types.h.
323db671160SJeff Mahoney  */
324db671160SJeff Mahoney #define BTRFS_FT_UNKNOWN	0
325db671160SJeff Mahoney #define BTRFS_FT_REG_FILE	1
326db671160SJeff Mahoney #define BTRFS_FT_DIR		2
327db671160SJeff Mahoney #define BTRFS_FT_CHRDEV		3
328db671160SJeff Mahoney #define BTRFS_FT_BLKDEV		4
329db671160SJeff Mahoney #define BTRFS_FT_FIFO		5
330db671160SJeff Mahoney #define BTRFS_FT_SOCK		6
331db671160SJeff Mahoney #define BTRFS_FT_SYMLINK	7
332db671160SJeff Mahoney #define BTRFS_FT_XATTR		8
333db671160SJeff Mahoney #define BTRFS_FT_MAX		9
334db671160SJeff Mahoney 
335db671160SJeff Mahoney /*
336db671160SJeff Mahoney  * The key defines the order in the tree, and so it also defines (optimal)
337db671160SJeff Mahoney  * block layout.
338db671160SJeff Mahoney  *
339db671160SJeff Mahoney  * objectid corresponds to the inode number.
340db671160SJeff Mahoney  *
341db671160SJeff Mahoney  * type tells us things about the object, and is a kind of stream selector.
342db671160SJeff Mahoney  * so for a given inode, keys with type of 1 might refer to the inode data,
343db671160SJeff Mahoney  * type of 2 may point to file data in the btree and type == 3 may point to
344db671160SJeff Mahoney  * extents.
345db671160SJeff Mahoney  *
346db671160SJeff Mahoney  * offset is the starting byte offset for this key in the stream.
347db671160SJeff Mahoney  *
348db671160SJeff Mahoney  * btrfs_disk_key is in disk byte order.  struct btrfs_key is always
349db671160SJeff Mahoney  * in cpu native order.  Otherwise they are identical and their sizes
350db671160SJeff Mahoney  * should be the same (ie both packed)
351db671160SJeff Mahoney  */
352db671160SJeff Mahoney struct btrfs_disk_key {
353db671160SJeff Mahoney 	__le64 objectid;
35414b05c51SJeff Mahoney 	__u8 type;
355db671160SJeff Mahoney 	__le64 offset;
356db671160SJeff Mahoney } __attribute__ ((__packed__));
357db671160SJeff Mahoney 
358db671160SJeff Mahoney struct btrfs_key {
35914b05c51SJeff Mahoney 	__u64 objectid;
36014b05c51SJeff Mahoney 	__u8 type;
36114b05c51SJeff Mahoney 	__u64 offset;
362db671160SJeff Mahoney } __attribute__ ((__packed__));
363db671160SJeff Mahoney 
364db671160SJeff Mahoney struct btrfs_dev_item {
365db671160SJeff Mahoney 	/* the internal btrfs device id */
366db671160SJeff Mahoney 	__le64 devid;
367db671160SJeff Mahoney 
368db671160SJeff Mahoney 	/* size of the device */
369db671160SJeff Mahoney 	__le64 total_bytes;
370db671160SJeff Mahoney 
371db671160SJeff Mahoney 	/* bytes used */
372db671160SJeff Mahoney 	__le64 bytes_used;
373db671160SJeff Mahoney 
374db671160SJeff Mahoney 	/* optimal io alignment for this device */
375db671160SJeff Mahoney 	__le32 io_align;
376db671160SJeff Mahoney 
377db671160SJeff Mahoney 	/* optimal io width for this device */
378db671160SJeff Mahoney 	__le32 io_width;
379db671160SJeff Mahoney 
380db671160SJeff Mahoney 	/* minimal io size for this device */
381db671160SJeff Mahoney 	__le32 sector_size;
382db671160SJeff Mahoney 
383db671160SJeff Mahoney 	/* type and info about this device */
384db671160SJeff Mahoney 	__le64 type;
385db671160SJeff Mahoney 
386db671160SJeff Mahoney 	/* expected generation for this device */
387db671160SJeff Mahoney 	__le64 generation;
388db671160SJeff Mahoney 
389db671160SJeff Mahoney 	/*
390db671160SJeff Mahoney 	 * starting byte of this partition on the device,
391db671160SJeff Mahoney 	 * to allow for stripe alignment in the future
392db671160SJeff Mahoney 	 */
393db671160SJeff Mahoney 	__le64 start_offset;
394db671160SJeff Mahoney 
395db671160SJeff Mahoney 	/* grouping information for allocation decisions */
396db671160SJeff Mahoney 	__le32 dev_group;
397db671160SJeff Mahoney 
398db671160SJeff Mahoney 	/* seek speed 0-100 where 100 is fastest */
39914b05c51SJeff Mahoney 	__u8 seek_speed;
400db671160SJeff Mahoney 
401db671160SJeff Mahoney 	/* bandwidth 0-100 where 100 is fastest */
40214b05c51SJeff Mahoney 	__u8 bandwidth;
403db671160SJeff Mahoney 
404db671160SJeff Mahoney 	/* btrfs generated uuid for this device */
40514b05c51SJeff Mahoney 	__u8 uuid[BTRFS_UUID_SIZE];
406db671160SJeff Mahoney 
407db671160SJeff Mahoney 	/* uuid of FS who owns this device */
40814b05c51SJeff Mahoney 	__u8 fsid[BTRFS_UUID_SIZE];
409db671160SJeff Mahoney } __attribute__ ((__packed__));
410db671160SJeff Mahoney 
411db671160SJeff Mahoney struct btrfs_stripe {
412db671160SJeff Mahoney 	__le64 devid;
413db671160SJeff Mahoney 	__le64 offset;
41414b05c51SJeff Mahoney 	__u8 dev_uuid[BTRFS_UUID_SIZE];
415db671160SJeff Mahoney } __attribute__ ((__packed__));
416db671160SJeff Mahoney 
417db671160SJeff Mahoney struct btrfs_chunk {
418db671160SJeff Mahoney 	/* size of this chunk in bytes */
419db671160SJeff Mahoney 	__le64 length;
420db671160SJeff Mahoney 
421db671160SJeff Mahoney 	/* objectid of the root referencing this chunk */
422db671160SJeff Mahoney 	__le64 owner;
423db671160SJeff Mahoney 
424db671160SJeff Mahoney 	__le64 stripe_len;
425db671160SJeff Mahoney 	__le64 type;
426db671160SJeff Mahoney 
427db671160SJeff Mahoney 	/* optimal io alignment for this chunk */
428db671160SJeff Mahoney 	__le32 io_align;
429db671160SJeff Mahoney 
430db671160SJeff Mahoney 	/* optimal io width for this chunk */
431db671160SJeff Mahoney 	__le32 io_width;
432db671160SJeff Mahoney 
433db671160SJeff Mahoney 	/* minimal io size for this chunk */
434db671160SJeff Mahoney 	__le32 sector_size;
435db671160SJeff Mahoney 
436db671160SJeff Mahoney 	/* 2^16 stripes is quite a lot, a second limit is the size of a single
437db671160SJeff Mahoney 	 * item in the btree
438db671160SJeff Mahoney 	 */
439db671160SJeff Mahoney 	__le16 num_stripes;
440db671160SJeff Mahoney 
441db671160SJeff Mahoney 	/* sub stripes only matter for raid10 */
442db671160SJeff Mahoney 	__le16 sub_stripes;
443db671160SJeff Mahoney 	struct btrfs_stripe stripe;
444db671160SJeff Mahoney 	/* additional stripes go here */
445db671160SJeff Mahoney } __attribute__ ((__packed__));
446db671160SJeff Mahoney 
447db671160SJeff Mahoney #define BTRFS_FREE_SPACE_EXTENT	1
448db671160SJeff Mahoney #define BTRFS_FREE_SPACE_BITMAP	2
449db671160SJeff Mahoney 
450db671160SJeff Mahoney struct btrfs_free_space_entry {
451db671160SJeff Mahoney 	__le64 offset;
452db671160SJeff Mahoney 	__le64 bytes;
45314b05c51SJeff Mahoney 	__u8 type;
454db671160SJeff Mahoney } __attribute__ ((__packed__));
455db671160SJeff Mahoney 
456db671160SJeff Mahoney struct btrfs_free_space_header {
457db671160SJeff Mahoney 	struct btrfs_disk_key location;
458db671160SJeff Mahoney 	__le64 generation;
459db671160SJeff Mahoney 	__le64 num_entries;
460db671160SJeff Mahoney 	__le64 num_bitmaps;
461db671160SJeff Mahoney } __attribute__ ((__packed__));
462db671160SJeff Mahoney 
463db671160SJeff Mahoney #define BTRFS_HEADER_FLAG_WRITTEN	(1ULL << 0)
464db671160SJeff Mahoney #define BTRFS_HEADER_FLAG_RELOC		(1ULL << 1)
465db671160SJeff Mahoney 
466db671160SJeff Mahoney /* Super block flags */
467db671160SJeff Mahoney /* Errors detected */
468db671160SJeff Mahoney #define BTRFS_SUPER_FLAG_ERROR		(1ULL << 2)
469db671160SJeff Mahoney 
470db671160SJeff Mahoney #define BTRFS_SUPER_FLAG_SEEDING	(1ULL << 32)
471db671160SJeff Mahoney #define BTRFS_SUPER_FLAG_METADUMP	(1ULL << 33)
472e2731e55SAnand Jain #define BTRFS_SUPER_FLAG_METADUMP_V2	(1ULL << 34)
47398820a7eSAnand Jain #define BTRFS_SUPER_FLAG_CHANGING_FSID	(1ULL << 35)
4747239ff4bSNikolay Borisov #define BTRFS_SUPER_FLAG_CHANGING_FSID_V2 (1ULL << 36)
475db671160SJeff Mahoney 
476db671160SJeff Mahoney 
477db671160SJeff Mahoney /*
478db671160SJeff Mahoney  * items in the extent btree are used to record the objectid of the
479db671160SJeff Mahoney  * owner of the block and the number of references
480db671160SJeff Mahoney  */
481db671160SJeff Mahoney 
482db671160SJeff Mahoney struct btrfs_extent_item {
483db671160SJeff Mahoney 	__le64 refs;
484db671160SJeff Mahoney 	__le64 generation;
485db671160SJeff Mahoney 	__le64 flags;
486db671160SJeff Mahoney } __attribute__ ((__packed__));
487db671160SJeff Mahoney 
488db671160SJeff Mahoney struct btrfs_extent_item_v0 {
489db671160SJeff Mahoney 	__le32 refs;
490db671160SJeff Mahoney } __attribute__ ((__packed__));
491db671160SJeff Mahoney 
492db671160SJeff Mahoney 
493db671160SJeff Mahoney #define BTRFS_EXTENT_FLAG_DATA		(1ULL << 0)
494db671160SJeff Mahoney #define BTRFS_EXTENT_FLAG_TREE_BLOCK	(1ULL << 1)
495db671160SJeff Mahoney 
496db671160SJeff Mahoney /* following flags only apply to tree blocks */
497db671160SJeff Mahoney 
498db671160SJeff Mahoney /* use full backrefs for extent pointers in the block */
499db671160SJeff Mahoney #define BTRFS_BLOCK_FLAG_FULL_BACKREF	(1ULL << 8)
500db671160SJeff Mahoney 
501db671160SJeff Mahoney /*
502db671160SJeff Mahoney  * this flag is only used internally by scrub and may be changed at any time
503db671160SJeff Mahoney  * it is only declared here to avoid collisions
504db671160SJeff Mahoney  */
505db671160SJeff Mahoney #define BTRFS_EXTENT_FLAG_SUPER		(1ULL << 48)
506db671160SJeff Mahoney 
507db671160SJeff Mahoney struct btrfs_tree_block_info {
508db671160SJeff Mahoney 	struct btrfs_disk_key key;
50914b05c51SJeff Mahoney 	__u8 level;
510db671160SJeff Mahoney } __attribute__ ((__packed__));
511db671160SJeff Mahoney 
512db671160SJeff Mahoney struct btrfs_extent_data_ref {
513db671160SJeff Mahoney 	__le64 root;
514db671160SJeff Mahoney 	__le64 objectid;
515db671160SJeff Mahoney 	__le64 offset;
516db671160SJeff Mahoney 	__le32 count;
517db671160SJeff Mahoney } __attribute__ ((__packed__));
518db671160SJeff Mahoney 
519db671160SJeff Mahoney struct btrfs_shared_data_ref {
520db671160SJeff Mahoney 	__le32 count;
521db671160SJeff Mahoney } __attribute__ ((__packed__));
522db671160SJeff Mahoney 
523db671160SJeff Mahoney struct btrfs_extent_inline_ref {
52414b05c51SJeff Mahoney 	__u8 type;
525db671160SJeff Mahoney 	__le64 offset;
526db671160SJeff Mahoney } __attribute__ ((__packed__));
527db671160SJeff Mahoney 
528db671160SJeff Mahoney /* dev extents record free space on individual devices.  The owner
529db671160SJeff Mahoney  * field points back to the chunk allocation mapping tree that allocated
530db671160SJeff Mahoney  * the extent.  The chunk tree uuid field is a way to double check the owner
531db671160SJeff Mahoney  */
532db671160SJeff Mahoney struct btrfs_dev_extent {
533db671160SJeff Mahoney 	__le64 chunk_tree;
534db671160SJeff Mahoney 	__le64 chunk_objectid;
535db671160SJeff Mahoney 	__le64 chunk_offset;
536db671160SJeff Mahoney 	__le64 length;
53714b05c51SJeff Mahoney 	__u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
538db671160SJeff Mahoney } __attribute__ ((__packed__));
539db671160SJeff Mahoney 
540db671160SJeff Mahoney struct btrfs_inode_ref {
541db671160SJeff Mahoney 	__le64 index;
542db671160SJeff Mahoney 	__le16 name_len;
543db671160SJeff Mahoney 	/* name goes here */
544db671160SJeff Mahoney } __attribute__ ((__packed__));
545db671160SJeff Mahoney 
546db671160SJeff Mahoney struct btrfs_inode_extref {
547db671160SJeff Mahoney 	__le64 parent_objectid;
548db671160SJeff Mahoney 	__le64 index;
549db671160SJeff Mahoney 	__le16 name_len;
550db671160SJeff Mahoney 	__u8   name[0];
551db671160SJeff Mahoney 	/* name goes here */
552db671160SJeff Mahoney } __attribute__ ((__packed__));
553db671160SJeff Mahoney 
554db671160SJeff Mahoney struct btrfs_timespec {
555db671160SJeff Mahoney 	__le64 sec;
556db671160SJeff Mahoney 	__le32 nsec;
557db671160SJeff Mahoney } __attribute__ ((__packed__));
558db671160SJeff Mahoney 
559db671160SJeff Mahoney struct btrfs_inode_item {
560db671160SJeff Mahoney 	/* nfs style generation number */
561db671160SJeff Mahoney 	__le64 generation;
562db671160SJeff Mahoney 	/* transid that last touched this inode */
563db671160SJeff Mahoney 	__le64 transid;
564db671160SJeff Mahoney 	__le64 size;
565db671160SJeff Mahoney 	__le64 nbytes;
566db671160SJeff Mahoney 	__le64 block_group;
567db671160SJeff Mahoney 	__le32 nlink;
568db671160SJeff Mahoney 	__le32 uid;
569db671160SJeff Mahoney 	__le32 gid;
570db671160SJeff Mahoney 	__le32 mode;
571db671160SJeff Mahoney 	__le64 rdev;
572db671160SJeff Mahoney 	__le64 flags;
573db671160SJeff Mahoney 
574db671160SJeff Mahoney 	/* modification sequence number for NFS */
575db671160SJeff Mahoney 	__le64 sequence;
576db671160SJeff Mahoney 
577db671160SJeff Mahoney 	/*
578db671160SJeff Mahoney 	 * a little future expansion, for more than this we can
579db671160SJeff Mahoney 	 * just grow the inode item and version it
580db671160SJeff Mahoney 	 */
581db671160SJeff Mahoney 	__le64 reserved[4];
582db671160SJeff Mahoney 	struct btrfs_timespec atime;
583db671160SJeff Mahoney 	struct btrfs_timespec ctime;
584db671160SJeff Mahoney 	struct btrfs_timespec mtime;
585db671160SJeff Mahoney 	struct btrfs_timespec otime;
586db671160SJeff Mahoney } __attribute__ ((__packed__));
587db671160SJeff Mahoney 
588db671160SJeff Mahoney struct btrfs_dir_log_item {
589db671160SJeff Mahoney 	__le64 end;
590db671160SJeff Mahoney } __attribute__ ((__packed__));
591db671160SJeff Mahoney 
592db671160SJeff Mahoney struct btrfs_dir_item {
593db671160SJeff Mahoney 	struct btrfs_disk_key location;
594db671160SJeff Mahoney 	__le64 transid;
595db671160SJeff Mahoney 	__le16 data_len;
596db671160SJeff Mahoney 	__le16 name_len;
59714b05c51SJeff Mahoney 	__u8 type;
598db671160SJeff Mahoney } __attribute__ ((__packed__));
599db671160SJeff Mahoney 
600db671160SJeff Mahoney #define BTRFS_ROOT_SUBVOL_RDONLY	(1ULL << 0)
601db671160SJeff Mahoney 
602db671160SJeff Mahoney /*
603db671160SJeff Mahoney  * Internal in-memory flag that a subvolume has been marked for deletion but
604db671160SJeff Mahoney  * still visible as a directory
605db671160SJeff Mahoney  */
606db671160SJeff Mahoney #define BTRFS_ROOT_SUBVOL_DEAD		(1ULL << 48)
607db671160SJeff Mahoney 
608db671160SJeff Mahoney struct btrfs_root_item {
609db671160SJeff Mahoney 	struct btrfs_inode_item inode;
610db671160SJeff Mahoney 	__le64 generation;
611db671160SJeff Mahoney 	__le64 root_dirid;
612db671160SJeff Mahoney 	__le64 bytenr;
613db671160SJeff Mahoney 	__le64 byte_limit;
614db671160SJeff Mahoney 	__le64 bytes_used;
615db671160SJeff Mahoney 	__le64 last_snapshot;
616db671160SJeff Mahoney 	__le64 flags;
617db671160SJeff Mahoney 	__le32 refs;
618db671160SJeff Mahoney 	struct btrfs_disk_key drop_progress;
61914b05c51SJeff Mahoney 	__u8 drop_level;
62014b05c51SJeff Mahoney 	__u8 level;
621db671160SJeff Mahoney 
622db671160SJeff Mahoney 	/*
623db671160SJeff Mahoney 	 * The following fields appear after subvol_uuids+subvol_times
624db671160SJeff Mahoney 	 * were introduced.
625db671160SJeff Mahoney 	 */
626db671160SJeff Mahoney 
627db671160SJeff Mahoney 	/*
628db671160SJeff Mahoney 	 * This generation number is used to test if the new fields are valid
629db671160SJeff Mahoney 	 * and up to date while reading the root item. Every time the root item
630db671160SJeff Mahoney 	 * is written out, the "generation" field is copied into this field. If
631db671160SJeff Mahoney 	 * anyone ever mounted the fs with an older kernel, we will have
632db671160SJeff Mahoney 	 * mismatching generation values here and thus must invalidate the
633db671160SJeff Mahoney 	 * new fields. See btrfs_update_root and btrfs_find_last_root for
634db671160SJeff Mahoney 	 * details.
635db671160SJeff Mahoney 	 * the offset of generation_v2 is also used as the start for the memset
636db671160SJeff Mahoney 	 * when invalidating the fields.
637db671160SJeff Mahoney 	 */
638db671160SJeff Mahoney 	__le64 generation_v2;
63914b05c51SJeff Mahoney 	__u8 uuid[BTRFS_UUID_SIZE];
64014b05c51SJeff Mahoney 	__u8 parent_uuid[BTRFS_UUID_SIZE];
64114b05c51SJeff Mahoney 	__u8 received_uuid[BTRFS_UUID_SIZE];
642db671160SJeff Mahoney 	__le64 ctransid; /* updated when an inode changes */
643db671160SJeff Mahoney 	__le64 otransid; /* trans when created */
644db671160SJeff Mahoney 	__le64 stransid; /* trans when sent. non-zero for received subvol */
645db671160SJeff Mahoney 	__le64 rtransid; /* trans when received. non-zero for received subvol */
646db671160SJeff Mahoney 	struct btrfs_timespec ctime;
647db671160SJeff Mahoney 	struct btrfs_timespec otime;
648db671160SJeff Mahoney 	struct btrfs_timespec stime;
649db671160SJeff Mahoney 	struct btrfs_timespec rtime;
650db671160SJeff Mahoney 	__le64 reserved[8]; /* for future */
651db671160SJeff Mahoney } __attribute__ ((__packed__));
652db671160SJeff Mahoney 
653db671160SJeff Mahoney /*
6541465af12SQu Wenruo  * Btrfs root item used to be smaller than current size.  The old format ends
6551465af12SQu Wenruo  * at where member generation_v2 is.
6561465af12SQu Wenruo  */
6571465af12SQu Wenruo static inline __u32 btrfs_legacy_root_item_size(void)
6581465af12SQu Wenruo {
6591465af12SQu Wenruo 	return offsetof(struct btrfs_root_item, generation_v2);
6601465af12SQu Wenruo }
6611465af12SQu Wenruo 
6621465af12SQu Wenruo /*
663db671160SJeff Mahoney  * this is used for both forward and backward root refs
664db671160SJeff Mahoney  */
665db671160SJeff Mahoney struct btrfs_root_ref {
666db671160SJeff Mahoney 	__le64 dirid;
667db671160SJeff Mahoney 	__le64 sequence;
668db671160SJeff Mahoney 	__le16 name_len;
669db671160SJeff Mahoney } __attribute__ ((__packed__));
670db671160SJeff Mahoney 
671db671160SJeff Mahoney struct btrfs_disk_balance_args {
672db671160SJeff Mahoney 	/*
673db671160SJeff Mahoney 	 * profiles to operate on, single is denoted by
674db671160SJeff Mahoney 	 * BTRFS_AVAIL_ALLOC_BIT_SINGLE
675db671160SJeff Mahoney 	 */
676db671160SJeff Mahoney 	__le64 profiles;
677db671160SJeff Mahoney 
678db671160SJeff Mahoney 	/*
679db671160SJeff Mahoney 	 * usage filter
680db671160SJeff Mahoney 	 * BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N'
681db671160SJeff Mahoney 	 * BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max
682db671160SJeff Mahoney 	 */
683db671160SJeff Mahoney 	union {
684db671160SJeff Mahoney 		__le64 usage;
685db671160SJeff Mahoney 		struct {
686db671160SJeff Mahoney 			__le32 usage_min;
687db671160SJeff Mahoney 			__le32 usage_max;
688db671160SJeff Mahoney 		};
689db671160SJeff Mahoney 	};
690db671160SJeff Mahoney 
691db671160SJeff Mahoney 	/* devid filter */
692db671160SJeff Mahoney 	__le64 devid;
693db671160SJeff Mahoney 
694db671160SJeff Mahoney 	/* devid subset filter [pstart..pend) */
695db671160SJeff Mahoney 	__le64 pstart;
696db671160SJeff Mahoney 	__le64 pend;
697db671160SJeff Mahoney 
698db671160SJeff Mahoney 	/* btrfs virtual address space subset filter [vstart..vend) */
699db671160SJeff Mahoney 	__le64 vstart;
700db671160SJeff Mahoney 	__le64 vend;
701db671160SJeff Mahoney 
702db671160SJeff Mahoney 	/*
703db671160SJeff Mahoney 	 * profile to convert to, single is denoted by
704db671160SJeff Mahoney 	 * BTRFS_AVAIL_ALLOC_BIT_SINGLE
705db671160SJeff Mahoney 	 */
706db671160SJeff Mahoney 	__le64 target;
707db671160SJeff Mahoney 
708db671160SJeff Mahoney 	/* BTRFS_BALANCE_ARGS_* */
709db671160SJeff Mahoney 	__le64 flags;
710db671160SJeff Mahoney 
711db671160SJeff Mahoney 	/*
712db671160SJeff Mahoney 	 * BTRFS_BALANCE_ARGS_LIMIT with value 'limit'
713db671160SJeff Mahoney 	 * BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum
714db671160SJeff Mahoney 	 * and maximum
715db671160SJeff Mahoney 	 */
716db671160SJeff Mahoney 	union {
717db671160SJeff Mahoney 		__le64 limit;
718db671160SJeff Mahoney 		struct {
719db671160SJeff Mahoney 			__le32 limit_min;
720db671160SJeff Mahoney 			__le32 limit_max;
721db671160SJeff Mahoney 		};
722db671160SJeff Mahoney 	};
723db671160SJeff Mahoney 
724db671160SJeff Mahoney 	/*
725db671160SJeff Mahoney 	 * Process chunks that cross stripes_min..stripes_max devices,
726db671160SJeff Mahoney 	 * BTRFS_BALANCE_ARGS_STRIPES_RANGE
727db671160SJeff Mahoney 	 */
728db671160SJeff Mahoney 	__le32 stripes_min;
729db671160SJeff Mahoney 	__le32 stripes_max;
730db671160SJeff Mahoney 
731db671160SJeff Mahoney 	__le64 unused[6];
732db671160SJeff Mahoney } __attribute__ ((__packed__));
733db671160SJeff Mahoney 
734db671160SJeff Mahoney /*
735db671160SJeff Mahoney  * store balance parameters to disk so that balance can be properly
736db671160SJeff Mahoney  * resumed after crash or unmount
737db671160SJeff Mahoney  */
738db671160SJeff Mahoney struct btrfs_balance_item {
739db671160SJeff Mahoney 	/* BTRFS_BALANCE_* */
740db671160SJeff Mahoney 	__le64 flags;
741db671160SJeff Mahoney 
742db671160SJeff Mahoney 	struct btrfs_disk_balance_args data;
743db671160SJeff Mahoney 	struct btrfs_disk_balance_args meta;
744db671160SJeff Mahoney 	struct btrfs_disk_balance_args sys;
745db671160SJeff Mahoney 
746db671160SJeff Mahoney 	__le64 unused[4];
747db671160SJeff Mahoney } __attribute__ ((__packed__));
748db671160SJeff Mahoney 
749b9b1a53eSChengguang Xu enum {
750b9b1a53eSChengguang Xu 	BTRFS_FILE_EXTENT_INLINE   = 0,
751b9b1a53eSChengguang Xu 	BTRFS_FILE_EXTENT_REG      = 1,
752b9b1a53eSChengguang Xu 	BTRFS_FILE_EXTENT_PREALLOC = 2,
753b9b1a53eSChengguang Xu 	BTRFS_NR_FILE_EXTENT_TYPES = 3,
754b9b1a53eSChengguang Xu };
755db671160SJeff Mahoney 
756db671160SJeff Mahoney struct btrfs_file_extent_item {
757db671160SJeff Mahoney 	/*
758db671160SJeff Mahoney 	 * transaction id that created this extent
759db671160SJeff Mahoney 	 */
760db671160SJeff Mahoney 	__le64 generation;
761db671160SJeff Mahoney 	/*
762db671160SJeff Mahoney 	 * max number of bytes to hold this extent in ram
763db671160SJeff Mahoney 	 * when we split a compressed extent we can't know how big
764db671160SJeff Mahoney 	 * each of the resulting pieces will be.  So, this is
765db671160SJeff Mahoney 	 * an upper limit on the size of the extent in ram instead of
766db671160SJeff Mahoney 	 * an exact limit.
767db671160SJeff Mahoney 	 */
768db671160SJeff Mahoney 	__le64 ram_bytes;
769db671160SJeff Mahoney 
770db671160SJeff Mahoney 	/*
771db671160SJeff Mahoney 	 * 32 bits for the various ways we might encode the data,
772db671160SJeff Mahoney 	 * including compression and encryption.  If any of these
773db671160SJeff Mahoney 	 * are set to something a given disk format doesn't understand
774db671160SJeff Mahoney 	 * it is treated like an incompat flag for reading and writing,
775db671160SJeff Mahoney 	 * but not for stat.
776db671160SJeff Mahoney 	 */
77714b05c51SJeff Mahoney 	__u8 compression;
77814b05c51SJeff Mahoney 	__u8 encryption;
779db671160SJeff Mahoney 	__le16 other_encoding; /* spare for later use */
780db671160SJeff Mahoney 
781db671160SJeff Mahoney 	/* are we inline data or a real extent? */
78214b05c51SJeff Mahoney 	__u8 type;
783db671160SJeff Mahoney 
784db671160SJeff Mahoney 	/*
785db671160SJeff Mahoney 	 * disk space consumed by the extent, checksum blocks are included
786db671160SJeff Mahoney 	 * in these numbers
787db671160SJeff Mahoney 	 *
788db671160SJeff Mahoney 	 * At this offset in the structure, the inline extent data start.
789db671160SJeff Mahoney 	 */
790db671160SJeff Mahoney 	__le64 disk_bytenr;
791db671160SJeff Mahoney 	__le64 disk_num_bytes;
792db671160SJeff Mahoney 	/*
793db671160SJeff Mahoney 	 * the logical offset in file blocks (no csums)
794db671160SJeff Mahoney 	 * this extent record is for.  This allows a file extent to point
795db671160SJeff Mahoney 	 * into the middle of an existing extent on disk, sharing it
796db671160SJeff Mahoney 	 * between two snapshots (useful if some bytes in the middle of the
797db671160SJeff Mahoney 	 * extent have changed
798db671160SJeff Mahoney 	 */
799db671160SJeff Mahoney 	__le64 offset;
800db671160SJeff Mahoney 	/*
801db671160SJeff Mahoney 	 * the logical number of file blocks (no csums included).  This
802db671160SJeff Mahoney 	 * always reflects the size uncompressed and without encoding.
803db671160SJeff Mahoney 	 */
804db671160SJeff Mahoney 	__le64 num_bytes;
805db671160SJeff Mahoney 
806db671160SJeff Mahoney } __attribute__ ((__packed__));
807db671160SJeff Mahoney 
808db671160SJeff Mahoney struct btrfs_csum_item {
80914b05c51SJeff Mahoney 	__u8 csum;
810db671160SJeff Mahoney } __attribute__ ((__packed__));
811db671160SJeff Mahoney 
812db671160SJeff Mahoney struct btrfs_dev_stats_item {
813db671160SJeff Mahoney 	/*
814db671160SJeff Mahoney 	 * grow this item struct at the end for future enhancements and keep
815db671160SJeff Mahoney 	 * the existing values unchanged
816db671160SJeff Mahoney 	 */
817db671160SJeff Mahoney 	__le64 values[BTRFS_DEV_STAT_VALUES_MAX];
818db671160SJeff Mahoney } __attribute__ ((__packed__));
819db671160SJeff Mahoney 
820db671160SJeff Mahoney #define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS	0
821db671160SJeff Mahoney #define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID	1
822db671160SJeff Mahoney 
823db671160SJeff Mahoney struct btrfs_dev_replace_item {
824db671160SJeff Mahoney 	/*
825db671160SJeff Mahoney 	 * grow this item struct at the end for future enhancements and keep
826db671160SJeff Mahoney 	 * the existing values unchanged
827db671160SJeff Mahoney 	 */
828db671160SJeff Mahoney 	__le64 src_devid;
829db671160SJeff Mahoney 	__le64 cursor_left;
830db671160SJeff Mahoney 	__le64 cursor_right;
831db671160SJeff Mahoney 	__le64 cont_reading_from_srcdev_mode;
832db671160SJeff Mahoney 
833db671160SJeff Mahoney 	__le64 replace_state;
834db671160SJeff Mahoney 	__le64 time_started;
835db671160SJeff Mahoney 	__le64 time_stopped;
836db671160SJeff Mahoney 	__le64 num_write_errors;
837db671160SJeff Mahoney 	__le64 num_uncorrectable_read_errors;
838db671160SJeff Mahoney } __attribute__ ((__packed__));
839db671160SJeff Mahoney 
840db671160SJeff Mahoney /* different types of block groups (and chunks) */
841db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_DATA		(1ULL << 0)
842db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_SYSTEM	(1ULL << 1)
843db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_METADATA	(1ULL << 2)
844db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RAID0		(1ULL << 3)
845db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RAID1		(1ULL << 4)
846db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_DUP		(1ULL << 5)
847db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RAID10	(1ULL << 6)
848db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RAID5         (1ULL << 7)
849db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RAID6         (1ULL << 8)
85047e6f742SDavid Sterba #define BTRFS_BLOCK_GROUP_RAID1C3       (1ULL << 9)
8518d6fac00SDavid Sterba #define BTRFS_BLOCK_GROUP_RAID1C4       (1ULL << 10)
852db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RESERVED	(BTRFS_AVAIL_ALLOC_BIT_SINGLE | \
853db671160SJeff Mahoney 					 BTRFS_SPACE_INFO_GLOBAL_RSV)
854db671160SJeff Mahoney 
855db671160SJeff Mahoney enum btrfs_raid_types {
856db671160SJeff Mahoney 	BTRFS_RAID_RAID10,
857db671160SJeff Mahoney 	BTRFS_RAID_RAID1,
858db671160SJeff Mahoney 	BTRFS_RAID_DUP,
859db671160SJeff Mahoney 	BTRFS_RAID_RAID0,
860db671160SJeff Mahoney 	BTRFS_RAID_SINGLE,
861db671160SJeff Mahoney 	BTRFS_RAID_RAID5,
862db671160SJeff Mahoney 	BTRFS_RAID_RAID6,
86347e6f742SDavid Sterba 	BTRFS_RAID_RAID1C3,
8648d6fac00SDavid Sterba 	BTRFS_RAID_RAID1C4,
865db671160SJeff Mahoney 	BTRFS_NR_RAID_TYPES
866db671160SJeff Mahoney };
867db671160SJeff Mahoney 
868db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_TYPE_MASK	(BTRFS_BLOCK_GROUP_DATA |    \
869db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_SYSTEM |  \
870db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_METADATA)
871db671160SJeff Mahoney 
872db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_PROFILE_MASK	(BTRFS_BLOCK_GROUP_RAID0 |   \
873db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_RAID1 |   \
87447e6f742SDavid Sterba 					 BTRFS_BLOCK_GROUP_RAID1C3 | \
8758d6fac00SDavid Sterba 					 BTRFS_BLOCK_GROUP_RAID1C4 | \
876db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_RAID5 |   \
877db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_RAID6 |   \
878db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_DUP |     \
879db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_RAID10)
880db671160SJeff Mahoney #define BTRFS_BLOCK_GROUP_RAID56_MASK	(BTRFS_BLOCK_GROUP_RAID5 |   \
881db671160SJeff Mahoney 					 BTRFS_BLOCK_GROUP_RAID6)
882db671160SJeff Mahoney 
88347e6f742SDavid Sterba #define BTRFS_BLOCK_GROUP_RAID1_MASK	(BTRFS_BLOCK_GROUP_RAID1 |   \
8848d6fac00SDavid Sterba 					 BTRFS_BLOCK_GROUP_RAID1C3 | \
8858d6fac00SDavid Sterba 					 BTRFS_BLOCK_GROUP_RAID1C4)
886c7369b3fSDavid Sterba 
887db671160SJeff Mahoney /*
888db671160SJeff Mahoney  * We need a bit for restriper to be able to tell when chunks of type
889db671160SJeff Mahoney  * SINGLE are available.  This "extended" profile format is used in
890db671160SJeff Mahoney  * fs_info->avail_*_alloc_bits (in-memory) and balance item fields
891db671160SJeff Mahoney  * (on-disk).  The corresponding on-disk bit in chunk.type is reserved
892db671160SJeff Mahoney  * to avoid remappings between two formats in future.
893db671160SJeff Mahoney  */
894db671160SJeff Mahoney #define BTRFS_AVAIL_ALLOC_BIT_SINGLE	(1ULL << 48)
895db671160SJeff Mahoney 
896db671160SJeff Mahoney /*
897db671160SJeff Mahoney  * A fake block group type that is used to communicate global block reserve
898db671160SJeff Mahoney  * size to userspace via the SPACE_INFO ioctl.
899db671160SJeff Mahoney  */
900db671160SJeff Mahoney #define BTRFS_SPACE_INFO_GLOBAL_RSV	(1ULL << 49)
901db671160SJeff Mahoney 
902db671160SJeff Mahoney #define BTRFS_EXTENDED_PROFILE_MASK	(BTRFS_BLOCK_GROUP_PROFILE_MASK | \
903db671160SJeff Mahoney 					 BTRFS_AVAIL_ALLOC_BIT_SINGLE)
904db671160SJeff Mahoney 
90514b05c51SJeff Mahoney static inline __u64 chunk_to_extended(__u64 flags)
906db671160SJeff Mahoney {
907db671160SJeff Mahoney 	if ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0)
908db671160SJeff Mahoney 		flags |= BTRFS_AVAIL_ALLOC_BIT_SINGLE;
909db671160SJeff Mahoney 
910db671160SJeff Mahoney 	return flags;
911db671160SJeff Mahoney }
91214b05c51SJeff Mahoney static inline __u64 extended_to_chunk(__u64 flags)
913db671160SJeff Mahoney {
914db671160SJeff Mahoney 	return flags & ~BTRFS_AVAIL_ALLOC_BIT_SINGLE;
915db671160SJeff Mahoney }
916db671160SJeff Mahoney 
917db671160SJeff Mahoney struct btrfs_block_group_item {
918db671160SJeff Mahoney 	__le64 used;
919db671160SJeff Mahoney 	__le64 chunk_objectid;
920db671160SJeff Mahoney 	__le64 flags;
921db671160SJeff Mahoney } __attribute__ ((__packed__));
922db671160SJeff Mahoney 
923db671160SJeff Mahoney struct btrfs_free_space_info {
924db671160SJeff Mahoney 	__le32 extent_count;
925db671160SJeff Mahoney 	__le32 flags;
926db671160SJeff Mahoney } __attribute__ ((__packed__));
927db671160SJeff Mahoney 
928db671160SJeff Mahoney #define BTRFS_FREE_SPACE_USING_BITMAPS (1ULL << 0)
929db671160SJeff Mahoney 
930db671160SJeff Mahoney #define BTRFS_QGROUP_LEVEL_SHIFT		48
93106f67c47SQu Wenruo static inline __u16 btrfs_qgroup_level(__u64 qgroupid)
932db671160SJeff Mahoney {
93306f67c47SQu Wenruo 	return (__u16)(qgroupid >> BTRFS_QGROUP_LEVEL_SHIFT);
934db671160SJeff Mahoney }
935db671160SJeff Mahoney 
936db671160SJeff Mahoney /*
937db671160SJeff Mahoney  * is subvolume quota turned on?
938db671160SJeff Mahoney  */
939db671160SJeff Mahoney #define BTRFS_QGROUP_STATUS_FLAG_ON		(1ULL << 0)
940db671160SJeff Mahoney /*
941db671160SJeff Mahoney  * RESCAN is set during the initialization phase
942db671160SJeff Mahoney  */
943db671160SJeff Mahoney #define BTRFS_QGROUP_STATUS_FLAG_RESCAN		(1ULL << 1)
944db671160SJeff Mahoney /*
945db671160SJeff Mahoney  * Some qgroup entries are known to be out of date,
946db671160SJeff Mahoney  * either because the configuration has changed in a way that
947db671160SJeff Mahoney  * makes a rescan necessary, or because the fs has been mounted
948db671160SJeff Mahoney  * with a non-qgroup-aware version.
949db671160SJeff Mahoney  * Turning qouta off and on again makes it inconsistent, too.
950db671160SJeff Mahoney  */
951db671160SJeff Mahoney #define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT	(1ULL << 2)
952db671160SJeff Mahoney 
953db671160SJeff Mahoney #define BTRFS_QGROUP_STATUS_VERSION        1
954db671160SJeff Mahoney 
955db671160SJeff Mahoney struct btrfs_qgroup_status_item {
956db671160SJeff Mahoney 	__le64 version;
957db671160SJeff Mahoney 	/*
958db671160SJeff Mahoney 	 * the generation is updated during every commit. As older
959db671160SJeff Mahoney 	 * versions of btrfs are not aware of qgroups, it will be
960db671160SJeff Mahoney 	 * possible to detect inconsistencies by checking the
961db671160SJeff Mahoney 	 * generation on mount time
962db671160SJeff Mahoney 	 */
963db671160SJeff Mahoney 	__le64 generation;
964db671160SJeff Mahoney 
965db671160SJeff Mahoney 	/* flag definitions see above */
966db671160SJeff Mahoney 	__le64 flags;
967db671160SJeff Mahoney 
968db671160SJeff Mahoney 	/*
969db671160SJeff Mahoney 	 * only used during scanning to record the progress
970db671160SJeff Mahoney 	 * of the scan. It contains a logical address
971db671160SJeff Mahoney 	 */
972db671160SJeff Mahoney 	__le64 rescan;
973db671160SJeff Mahoney } __attribute__ ((__packed__));
974db671160SJeff Mahoney 
975db671160SJeff Mahoney struct btrfs_qgroup_info_item {
976db671160SJeff Mahoney 	__le64 generation;
977db671160SJeff Mahoney 	__le64 rfer;
978db671160SJeff Mahoney 	__le64 rfer_cmpr;
979db671160SJeff Mahoney 	__le64 excl;
980db671160SJeff Mahoney 	__le64 excl_cmpr;
981db671160SJeff Mahoney } __attribute__ ((__packed__));
982db671160SJeff Mahoney 
983db671160SJeff Mahoney struct btrfs_qgroup_limit_item {
984db671160SJeff Mahoney 	/*
985db671160SJeff Mahoney 	 * only updated when any of the other values change
986db671160SJeff Mahoney 	 */
987db671160SJeff Mahoney 	__le64 flags;
988db671160SJeff Mahoney 	__le64 max_rfer;
989db671160SJeff Mahoney 	__le64 max_excl;
990db671160SJeff Mahoney 	__le64 rsv_rfer;
991db671160SJeff Mahoney 	__le64 rsv_excl;
992db671160SJeff Mahoney } __attribute__ ((__packed__));
993db671160SJeff Mahoney 
994db671160SJeff Mahoney #endif /* _BTRFS_CTREE_H_ */
995