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