source: bootcd/isolinux/syslinux-6.03/core/fs/btrfs/btrfs.h

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 6.3 KB
Line 
1#ifndef _BTRFS_H_
2#define _BTRFS_H_
3
4#include <stdint.h>
5#include <zconf.h>
6
7typedef uint8_t u8;
8typedef uint16_t u16;
9typedef uint32_t u32;
10typedef uint64_t u64;
11/* type that store on disk, but it is same as cpu type for i386 arch */
12typedef u16 __le16;
13typedef u32 __le32;
14typedef 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
65struct 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
82struct 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
124struct btrfs_disk_key {
125        __le64 objectid;
126        u8 type;
127        __le64 offset;
128} __attribute__ ((__packed__));
129
130struct btrfs_stripe {
131        __le64 devid;
132        __le64 offset;
133        u8 dev_uuid[BTRFS_UUID_SIZE];
134} __attribute__ ((__packed__));
135
136struct 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
149struct 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
164struct btrfs_item {
165        struct btrfs_disk_key key;
166        __le32 offset;
167        __le32 size;
168} __attribute__ ((__packed__));
169
170struct btrfs_leaf {
171        struct btrfs_header header;
172        struct btrfs_item items[];
173} __attribute__ ((__packed__));
174
175struct btrfs_key_ptr {
176        struct btrfs_disk_key key;
177        __le64 blockptr;
178        __le64 generation;
179} __attribute__ ((__packed__));
180
181struct 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 */
187struct 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 */
197struct btrfs_chunk_map_item {
198        u64 logical;
199        u64 length;
200        u64 devid;
201        u64 physical;
202};
203
204struct btrfs_chunk_map {
205        struct btrfs_chunk_map_item *map;
206        u32 map_length;
207        u32 cur_length;
208};
209
210struct btrfs_timespec {
211        __le64 sec;
212        __le32 nsec;
213} __attribute__ ((__packed__));
214
215struct 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
244struct 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
259struct 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
267struct 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
280struct btrfs_root_ref {
281        __le64 dirid;
282        __le64 sequence;
283        __le16 name_len;
284} __attribute__ ((__packed__));
285
286/*
287 * btrfs private inode information
288 */
289struct btrfs_pvt_inode {
290    uint64_t offset;
291};
292
293#define PVT(i) ((struct btrfs_pvt_inode *)((i)->pvt))
294
295#endif
Note: See TracBrowser for help on using the repository browser.