1 | #ifndef _BTRFS_H_ |
---|
2 | #define _BTRFS_H_ |
---|
3 | |
---|
4 | #include <stdint.h> |
---|
5 | #include <zconf.h> |
---|
6 | |
---|
7 | typedef uint8_t u8; |
---|
8 | typedef uint16_t u16; |
---|
9 | typedef uint32_t u32; |
---|
10 | typedef uint64_t u64; |
---|
11 | /* type that store on disk, but it is same as cpu type for i386 arch */ |
---|
12 | typedef u16 __le16; |
---|
13 | typedef u32 __le32; |
---|
14 | typedef u64 __le64; |
---|
15 | |
---|
16 | #include "crc32c.h" |
---|
17 | #define btrfs_crc32c crc32c_le |
---|
18 | |
---|
19 | #define BTRFS_SUPER_INFO_OFFSET (64 * 1024) |
---|
20 | #define BTRFS_SUPER_INFO_SIZE 4096 |
---|
21 | #define BTRFS_MAX_LEAF_SIZE 4096 |
---|
22 | #define BTRFS_BLOCK_SHIFT 12 |
---|
23 | #define BTRFS_BLOCK_SIZE (1 << BTRFS_BLOCK_SHIFT) |
---|
24 | |
---|
25 | #define BTRFS_SUPER_MIRROR_MAX 3 |
---|
26 | #define BTRFS_SUPER_MIRROR_SHIFT 12 |
---|
27 | #define BTRFS_CSUM_SIZE 32 |
---|
28 | #define BTRFS_FSID_SIZE 16 |
---|
29 | #define BTRFS_LABEL_SIZE 256 |
---|
30 | #define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048 |
---|
31 | #define BTRFS_UUID_SIZE 16 |
---|
32 | |
---|
33 | #define BTRFS_MAGIC "_BHRfS_M" |
---|
34 | #define BTRFS_MAGIC_L 8 |
---|
35 | #define BTRFS_MAGIC_N 0x4d5f53665248425f |
---|
36 | |
---|
37 | #define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33) |
---|
38 | |
---|
39 | #define BTRFS_DEV_ITEM_KEY 216 |
---|
40 | #define BTRFS_CHUNK_ITEM_KEY 228 |
---|
41 | #define BTRFS_ROOT_REF_KEY 156 |
---|
42 | #define BTRFS_ROOT_ITEM_KEY 132 |
---|
43 | #define BTRFS_EXTENT_DATA_KEY 108 |
---|
44 | #define BTRFS_DIR_ITEM_KEY 84 |
---|
45 | #define BTRFS_INODE_ITEM_KEY 1 |
---|
46 | |
---|
47 | #define BTRFS_EXTENT_TREE_OBJECTID 2ULL |
---|
48 | #define BTRFS_FS_TREE_OBJECTID 5ULL |
---|
49 | |
---|
50 | #define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL |
---|
51 | |
---|
52 | #define BTRFS_FILE_EXTENT_INLINE 0 |
---|
53 | #define BTRFS_FILE_EXTENT_REG 1 |
---|
54 | #define BTRFS_FILE_EXTENT_PREALLOC 2 |
---|
55 | |
---|
56 | #define BTRFS_MAX_LEVEL 8 |
---|
57 | #define BTRFS_MAX_CHUNK_ENTRIES 256 |
---|
58 | |
---|
59 | #define BTRFS_FT_REG_FILE 1 |
---|
60 | #define BTRFS_FT_DIR 2 |
---|
61 | #define BTRFS_FT_SYMLINK 7 |
---|
62 | |
---|
63 | #define ROOT_DIR_WORD 0x002f |
---|
64 | |
---|
65 | struct btrfs_dev_item { |
---|
66 | __le64 devid; |
---|
67 | __le64 total_bytes; |
---|
68 | __le64 bytes_used; |
---|
69 | __le32 io_align; |
---|
70 | __le32 io_width; |
---|
71 | __le32 sector_size; |
---|
72 | __le64 type; |
---|
73 | __le64 generation; |
---|
74 | __le64 start_offset; |
---|
75 | __le32 dev_group; |
---|
76 | u8 seek_speed; |
---|
77 | u8 bandwidth; |
---|
78 | u8 uuid[BTRFS_UUID_SIZE]; |
---|
79 | u8 fsid[BTRFS_UUID_SIZE]; |
---|
80 | } __attribute__ ((__packed__)); |
---|
81 | |
---|
82 | struct btrfs_super_block { |
---|
83 | u8 csum[BTRFS_CSUM_SIZE]; |
---|
84 | /* the first 3 fields must match struct btrfs_header */ |
---|
85 | u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */ |
---|
86 | __le64 bytenr; /* this block number */ |
---|
87 | __le64 flags; |
---|
88 | |
---|
89 | /* allowed to be different from the btrfs_header from here own down */ |
---|
90 | __le64 magic; |
---|
91 | __le64 generation; |
---|
92 | __le64 root; |
---|
93 | __le64 chunk_root; |
---|
94 | __le64 log_root; |
---|
95 | |
---|
96 | /* this will help find the new super based on the log root */ |
---|
97 | __le64 log_root_transid; |
---|
98 | __le64 total_bytes; |
---|
99 | __le64 bytes_used; |
---|
100 | __le64 root_dir_objectid; |
---|
101 | __le64 num_devices; |
---|
102 | __le32 sectorsize; |
---|
103 | __le32 nodesize; |
---|
104 | __le32 leafsize; |
---|
105 | __le32 stripesize; |
---|
106 | __le32 sys_chunk_array_size; |
---|
107 | __le64 chunk_root_generation; |
---|
108 | __le64 compat_flags; |
---|
109 | __le64 compat_ro_flags; |
---|
110 | __le64 incompat_flags; |
---|
111 | __le16 csum_type; |
---|
112 | u8 root_level; |
---|
113 | u8 chunk_root_level; |
---|
114 | u8 log_root_level; |
---|
115 | struct btrfs_dev_item dev_item; |
---|
116 | |
---|
117 | char label[BTRFS_LABEL_SIZE]; |
---|
118 | |
---|
119 | /* future expansion */ |
---|
120 | __le64 reserved[32]; |
---|
121 | u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE]; |
---|
122 | } __attribute__ ((__packed__)); |
---|
123 | |
---|
124 | struct btrfs_disk_key { |
---|
125 | __le64 objectid; |
---|
126 | u8 type; |
---|
127 | __le64 offset; |
---|
128 | } __attribute__ ((__packed__)); |
---|
129 | |
---|
130 | struct btrfs_stripe { |
---|
131 | __le64 devid; |
---|
132 | __le64 offset; |
---|
133 | u8 dev_uuid[BTRFS_UUID_SIZE]; |
---|
134 | } __attribute__ ((__packed__)); |
---|
135 | |
---|
136 | struct btrfs_chunk { |
---|
137 | __le64 length; |
---|
138 | __le64 owner; |
---|
139 | __le64 stripe_len; |
---|
140 | __le64 type; |
---|
141 | __le32 io_align; |
---|
142 | __le32 io_width; |
---|
143 | __le32 sector_size; |
---|
144 | __le16 num_stripes; |
---|
145 | __le16 sub_stripes; |
---|
146 | struct btrfs_stripe stripe; |
---|
147 | } __attribute__ ((__packed__)); |
---|
148 | |
---|
149 | struct btrfs_header { |
---|
150 | /* these first four must match the super block */ |
---|
151 | u8 csum[BTRFS_CSUM_SIZE]; |
---|
152 | u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */ |
---|
153 | __le64 bytenr; /* which block this node is supposed to live in */ |
---|
154 | __le64 flags; |
---|
155 | |
---|
156 | /* allowed to be different from the super from here on down */ |
---|
157 | u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; |
---|
158 | __le64 generation; |
---|
159 | __le64 owner; |
---|
160 | __le32 nritems; |
---|
161 | u8 level; |
---|
162 | } __attribute__ ((__packed__)); |
---|
163 | |
---|
164 | struct btrfs_item { |
---|
165 | struct btrfs_disk_key key; |
---|
166 | __le32 offset; |
---|
167 | __le32 size; |
---|
168 | } __attribute__ ((__packed__)); |
---|
169 | |
---|
170 | struct btrfs_leaf { |
---|
171 | struct btrfs_header header; |
---|
172 | struct btrfs_item items[]; |
---|
173 | } __attribute__ ((__packed__)); |
---|
174 | |
---|
175 | struct btrfs_key_ptr { |
---|
176 | struct btrfs_disk_key key; |
---|
177 | __le64 blockptr; |
---|
178 | __le64 generation; |
---|
179 | } __attribute__ ((__packed__)); |
---|
180 | |
---|
181 | struct btrfs_node { |
---|
182 | struct btrfs_header header; |
---|
183 | struct btrfs_key_ptr ptrs[]; |
---|
184 | } __attribute__ ((__packed__)); |
---|
185 | |
---|
186 | /* remember how we get to a node/leaf */ |
---|
187 | struct btrfs_path { |
---|
188 | u64 offsets[BTRFS_MAX_LEVEL]; |
---|
189 | int itemsnr[BTRFS_MAX_LEVEL]; |
---|
190 | int slots[BTRFS_MAX_LEVEL]; |
---|
191 | /* remember last slot's item and data */ |
---|
192 | struct btrfs_item item; |
---|
193 | u8 data[BTRFS_MAX_LEAF_SIZE]; |
---|
194 | }; |
---|
195 | |
---|
196 | /* store logical offset to physical offset mapping */ |
---|
197 | struct btrfs_chunk_map_item { |
---|
198 | u64 logical; |
---|
199 | u64 length; |
---|
200 | u64 devid; |
---|
201 | u64 physical; |
---|
202 | }; |
---|
203 | |
---|
204 | struct btrfs_chunk_map { |
---|
205 | struct btrfs_chunk_map_item *map; |
---|
206 | u32 map_length; |
---|
207 | u32 cur_length; |
---|
208 | }; |
---|
209 | |
---|
210 | struct btrfs_timespec { |
---|
211 | __le64 sec; |
---|
212 | __le32 nsec; |
---|
213 | } __attribute__ ((__packed__)); |
---|
214 | |
---|
215 | struct btrfs_inode_item { |
---|
216 | /* nfs style generation number */ |
---|
217 | __le64 generation; |
---|
218 | /* transid that last touched this inode */ |
---|
219 | __le64 transid; |
---|
220 | __le64 size; |
---|
221 | __le64 nbytes; |
---|
222 | __le64 block_group; |
---|
223 | __le32 nlink; |
---|
224 | __le32 uid; |
---|
225 | __le32 gid; |
---|
226 | __le32 mode; |
---|
227 | __le64 rdev; |
---|
228 | __le64 flags; |
---|
229 | |
---|
230 | /* modification sequence number for NFS */ |
---|
231 | __le64 sequence; |
---|
232 | |
---|
233 | /* |
---|
234 | * a little future expansion, for more than this we can |
---|
235 | * just grow the inode item and version it |
---|
236 | */ |
---|
237 | __le64 reserved[4]; |
---|
238 | struct btrfs_timespec atime; |
---|
239 | struct btrfs_timespec ctime; |
---|
240 | struct btrfs_timespec mtime; |
---|
241 | struct btrfs_timespec otime; |
---|
242 | } __attribute__ ((__packed__)); |
---|
243 | |
---|
244 | struct btrfs_root_item { |
---|
245 | struct btrfs_inode_item inode; |
---|
246 | __le64 generation; |
---|
247 | __le64 root_dirid; |
---|
248 | __le64 bytenr; |
---|
249 | __le64 byte_limit; |
---|
250 | __le64 bytes_used; |
---|
251 | __le64 last_snapshot; |
---|
252 | __le64 flags; |
---|
253 | __le32 refs; |
---|
254 | struct btrfs_disk_key drop_progress; |
---|
255 | u8 drop_level; |
---|
256 | u8 level; |
---|
257 | } __attribute__ ((__packed__)); |
---|
258 | |
---|
259 | struct btrfs_dir_item { |
---|
260 | struct btrfs_disk_key location; |
---|
261 | __le64 transid; |
---|
262 | __le16 data_len; |
---|
263 | __le16 name_len; |
---|
264 | u8 type; |
---|
265 | } __attribute__ ((__packed__)); |
---|
266 | |
---|
267 | struct btrfs_file_extent_item { |
---|
268 | __le64 generation; |
---|
269 | __le64 ram_bytes; |
---|
270 | u8 compression; |
---|
271 | u8 encryption; |
---|
272 | __le16 other_encoding; /* spare for later use */ |
---|
273 | u8 type; |
---|
274 | __le64 disk_bytenr; |
---|
275 | __le64 disk_num_bytes; |
---|
276 | __le64 offset; |
---|
277 | __le64 num_bytes; |
---|
278 | } __attribute__ ((__packed__)); |
---|
279 | |
---|
280 | struct btrfs_root_ref { |
---|
281 | __le64 dirid; |
---|
282 | __le64 sequence; |
---|
283 | __le16 name_len; |
---|
284 | } __attribute__ ((__packed__)); |
---|
285 | |
---|
286 | /* |
---|
287 | * btrfs private inode information |
---|
288 | */ |
---|
289 | struct btrfs_pvt_inode { |
---|
290 | uint64_t offset; |
---|
291 | }; |
---|
292 | |
---|
293 | #define PVT(i) ((struct btrfs_pvt_inode *)((i)->pvt)) |
---|
294 | |
---|
295 | #endif |
---|