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