Dynamic chunk allocation
[platform/upstream/btrfs-progs.git] / ctree.h
1 /*
2  * Copyright (C) 2007 Oracle.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public
6  * License v2 as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public
14  * License along with this program; if not, write to the
15  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16  * Boston, MA 021110-1307, USA.
17  */
18
19 #ifndef __BTRFS__
20 #define __BTRFS__
21
22 #include "list.h"
23 #include "kerncompat.h"
24 #include "radix-tree.h"
25 #include "extent-cache.h"
26 #include "extent_io.h"
27
28 struct btrfs_root;
29 struct btrfs_trans_handle;
30 #define BTRFS_MAGIC "_B4RfS_M"
31
32 #define BTRFS_MAX_LEVEL 8
33
34 /* holds pointers to all of the tree roots */
35 #define BTRFS_ROOT_TREE_OBJECTID 1ULL
36
37 /* stores information about which extents are in use, and reference counts */
38 #define BTRFS_EXTENT_TREE_OBJECTID 2ULL
39
40 /* one per subvolume, storing files and directories */
41 #define BTRFS_FS_TREE_OBJECTID 3ULL
42
43 /* directory objectid inside the root tree */
44 #define BTRFS_ROOT_TREE_DIR_OBJECTID 4ULL
45
46
47 /*
48  * chunk tree stores translations from logical -> physical block numbering
49  * the super block points to the chunk tree
50  */
51 #define BTRFS_CHUNK_TREE_OBJECTID 5ULL
52
53 /*
54  * stores information about which areas of a given device are in use.
55  * one per device.  The tree of tree roots points to the device tree
56  */
57 #define BTRFS_DEV_TREE_OBJECTID 6ULL
58
59 /*
60  * All files have objectids higher than this.
61  */
62 #define BTRFS_FIRST_FREE_OBJECTID 256ULL
63
64
65 /*
66  * the device items go into the chunk tree.  The key is in the form
67  * [ 1 BTRFS_DEV_ITEM_KEY device_id ]
68  */
69 #define BTRFS_DEV_ITEMS_OBJECTID 1ULL
70
71 /*
72  * we can actually store much bigger names, but lets not confuse the rest
73  * of linux
74  */
75 #define BTRFS_NAME_LEN 255
76
77 /* 32 bytes in various csum fields */
78 #define BTRFS_CSUM_SIZE 32
79 /* four bytes for CRC32 */
80 #define BTRFS_CRC32_SIZE 4
81 #define BTRFS_EMPTY_DIR_SIZE 0
82
83 #define BTRFS_FT_UNKNOWN        0
84 #define BTRFS_FT_REG_FILE       1
85 #define BTRFS_FT_DIR            2
86 #define BTRFS_FT_CHRDEV         3
87 #define BTRFS_FT_BLKDEV         4
88 #define BTRFS_FT_FIFO           5
89 #define BTRFS_FT_SOCK           6
90 #define BTRFS_FT_SYMLINK        7
91 #define BTRFS_FT_XATTR          8
92 #define BTRFS_FT_MAX            9
93
94 /*
95  * the key defines the order in the tree, and so it also defines (optimal)
96  * block layout.  objectid corresonds to the inode number.  The flags
97  * tells us things about the object, and is a kind of stream selector.
98  * so for a given inode, keys with flags of 1 might refer to the inode
99  * data, flags of 2 may point to file data in the btree and flags == 3
100  * may point to extents.
101  *
102  * offset is the starting byte offset for this key in the stream.
103  *
104  * btrfs_disk_key is in disk byte order.  struct btrfs_key is always
105  * in cpu native order.  Otherwise they are identical and their sizes
106  * should be the same (ie both packed)
107  */
108 struct btrfs_disk_key {
109         __le64 objectid;
110         u8 type;
111         __le64 offset;
112 } __attribute__ ((__packed__));
113
114 struct btrfs_key {
115         u64 objectid;
116         u8 type;
117         u64 offset;
118 } __attribute__ ((__packed__));
119
120 struct btrfs_mapping_tree {
121         struct cache_tree cache_tree;
122 };
123
124 #define BTRFS_DEV_UUID_SIZE 16
125 struct btrfs_dev_item {
126         /* the internal btrfs device id */
127         __le64 devid;
128
129         /* size of the device */
130         __le64 total_bytes;
131
132         /* bytes used */
133         __le64 bytes_used;
134
135         /* optimal io alignment for this device */
136         __le32 io_align;
137
138         /* optimal io width for this device */
139         __le32 io_width;
140
141         /* minimal io size for this device */
142         __le32 sector_size;
143
144         /* the kernel device number */
145         __le64 rdev;
146
147         /* type and info about this device */
148         __le64 type;
149
150         /* partition number, 0 for whole dev */
151         __le32 partition;
152
153         /* length of the name data at the end of the item */
154         __le16 name_len;
155
156         /* physical drive uuid (or lvm uuid) */
157         u8 uuid[BTRFS_DEV_UUID_SIZE];
158         /* name goes here */
159 } __attribute__ ((__packed__));
160
161 struct btrfs_stripe {
162         __le64 devid;
163         __le64 offset;
164 } __attribute__ ((__packed__));
165
166 struct btrfs_chunk {
167         __le64 owner;
168         __le64 stripe_len;
169         __le64 type;
170
171         /* optimal io alignment for this chunk */
172         __le32 io_align;
173
174         /* optimal io width for this chunk */
175         __le32 io_width;
176
177         /* minimal io size for this chunk */
178         __le32 sector_size;
179
180         /* 2^16 stripes is quite a lot, a second limit is the size of a single
181          * item in the btree
182          */
183         __le16 num_stripes;
184         struct btrfs_stripe stripe;
185         /* additional stripes go here */
186 } __attribute__ ((__packed__));
187
188 static inline unsigned long btrfs_chunk_item_size(int num_stripes)
189 {
190         BUG_ON(num_stripes == 0);
191         return sizeof(struct btrfs_chunk) +
192                 sizeof(struct btrfs_stripe) * (num_stripes - 1);
193 }
194
195 #define BTRFS_FSID_SIZE 16
196 /*
197  * every tree block (leaf or node) starts with this header.
198  */
199 struct btrfs_header {
200         u8 csum[BTRFS_CSUM_SIZE];
201         u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
202         __le64 bytenr; /* which block this node is supposed to live in */
203         __le64 generation;
204         __le64 owner;
205         __le32 nritems;
206         __le16 flags;
207         u8 level;
208 } __attribute__ ((__packed__));
209
210 #define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->nodesize - \
211                                 sizeof(struct btrfs_header)) / \
212                                 sizeof(struct btrfs_key_ptr))
213 #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
214 #define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->leafsize))
215 #define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
216                                         sizeof(struct btrfs_item) - \
217                                         sizeof(struct btrfs_file_extent_item))
218
219 /*
220  * this is a very generous portion of the super block, giving us
221  * room to translate 14 chunks with 3 stripes each.
222  */
223 #define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
224
225 /*
226  * the super block basically lists the main trees of the FS
227  * it currently lacks any block count etc etc
228  */
229 struct btrfs_super_block {
230         u8 csum[BTRFS_CSUM_SIZE];
231         /* the first 3 fields must match struct btrfs_header */
232         u8 fsid[BTRFS_FSID_SIZE];    /* FS specific uuid */
233         __le64 bytenr; /* this block number */
234         __le64 magic;
235         __le64 generation;
236         __le64 root;
237         __le64 chunk_root;
238         __le64 total_bytes;
239         __le64 bytes_used;
240         __le64 root_dir_objectid;
241         __le32 sectorsize;
242         __le32 nodesize;
243         __le32 leafsize;
244         __le32 stripesize;
245         __le32 sys_chunk_array_size;
246         u8 root_level;
247         u8 chunk_root_level;
248         u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
249 } __attribute__ ((__packed__));
250
251 /*
252  * A leaf is full of items. offset and size tell us where to find
253  * the item in the leaf (relative to the start of the data area)
254  */
255 struct btrfs_item {
256         struct btrfs_disk_key key;
257         __le32 offset;
258         __le32 size;
259 } __attribute__ ((__packed__));
260
261 /*
262  * leaves have an item area and a data area:
263  * [item0, item1....itemN] [free space] [dataN...data1, data0]
264  *
265  * The data is separate from the items to get the keys closer together
266  * during searches.
267  */
268 struct btrfs_leaf {
269         struct btrfs_header header;
270         struct btrfs_item items[];
271 } __attribute__ ((__packed__));
272
273 /*
274  * all non-leaf blocks are nodes, they hold only keys and pointers to
275  * other blocks
276  */
277 struct btrfs_key_ptr {
278         struct btrfs_disk_key key;
279         __le64 blockptr;
280         __le64 generation;
281 } __attribute__ ((__packed__));
282
283 struct btrfs_node {
284         struct btrfs_header header;
285         struct btrfs_key_ptr ptrs[];
286 } __attribute__ ((__packed__));
287
288 /*
289  * btrfs_paths remember the path taken from the root down to the leaf.
290  * level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point
291  * to any other levels that are present.
292  *
293  * The slots array records the index of the item or block pointer
294  * used while walking the tree.
295  */
296 struct btrfs_path {
297         struct extent_buffer *nodes[BTRFS_MAX_LEVEL];
298         int slots[BTRFS_MAX_LEVEL];
299         int reada;
300         int lowest_level;
301 };
302
303 /*
304  * items in the extent btree are used to record the objectid of the
305  * owner of the block and the number of references
306  */
307 struct btrfs_extent_item {
308         __le32 refs;
309 } __attribute__ ((__packed__));
310
311 struct btrfs_extent_ref {
312         __le64 root;
313         __le64 generation;
314         __le64 objectid;
315         __le64 offset;
316 } __attribute__ ((__packed__));
317
318 /* dev extents record free space on individual devices.  The owner
319  * field points back to the chunk allocation mapping tree that allocated
320  * the extent
321  */
322 struct btrfs_dev_extent {
323         __le64 owner;
324         __le64 length;
325 } __attribute__ ((__packed__));
326
327
328 struct btrfs_inode_ref {
329         __le16 name_len;
330         /* name goes here */
331 } __attribute__ ((__packed__));
332
333 struct btrfs_timespec {
334         __le64 sec;
335         __le32 nsec;
336 } __attribute__ ((__packed__));
337
338 /*
339  * there is no padding here on purpose.  If you want to extent the inode,
340  * make a new item type
341  */
342 struct btrfs_inode_item {
343         __le64 generation;
344         __le64 size;
345         __le64 nblocks;
346         __le64 block_group;
347         __le32 nlink;
348         __le32 uid;
349         __le32 gid;
350         __le32 mode;
351         __le64 rdev;
352         __le16 flags;
353         __le16 compat_flags;
354         struct btrfs_timespec atime;
355         struct btrfs_timespec ctime;
356         struct btrfs_timespec mtime;
357         struct btrfs_timespec otime;
358 } __attribute__ ((__packed__));
359
360 struct btrfs_dir_item {
361         struct btrfs_disk_key location;
362         __le16 data_len;
363         __le16 name_len;
364         u8 type;
365 } __attribute__ ((__packed__));
366
367 struct btrfs_root_item {
368         struct btrfs_inode_item inode;
369         __le64 root_dirid;
370         __le64 bytenr;
371         __le64 byte_limit;
372         __le64 bytes_used;
373         __le32 flags;
374         __le32 refs;
375         struct btrfs_disk_key drop_progress;
376         u8 drop_level;
377         u8 level;
378 } __attribute__ ((__packed__));
379
380 #define BTRFS_FILE_EXTENT_REG 0
381 #define BTRFS_FILE_EXTENT_INLINE 1
382
383 struct btrfs_file_extent_item {
384         __le64 generation;
385         u8 type;
386         /*
387          * disk space consumed by the extent, checksum blocks are included
388          * in these numbers
389          */
390         __le64 disk_bytenr;
391         __le64 disk_num_bytes;
392         /*
393          * the logical offset in file blocks (no csums)
394          * this extent record is for.  This allows a file extent to point
395          * into the middle of an existing extent on disk, sharing it
396          * between two snapshots (useful if some bytes in the middle of the
397          * extent have changed
398          */
399         __le64 offset;
400         /*
401          * the logical number of file blocks (no csums included)
402          */
403         __le64 num_bytes;
404 } __attribute__ ((__packed__));
405
406 struct btrfs_csum_item {
407         u8 csum;
408 } __attribute__ ((__packed__));
409
410 /* tag for the radix tree of block groups in ram */
411 #define BTRFS_BLOCK_GROUP_DATA     (1 << 0)
412 #define BTRFS_BLOCK_GROUP_SYSTEM   (1 << 1)
413 #define BTRFS_BLOCK_GROUP_METADATA (1 << 2)
414
415 struct btrfs_block_group_item {
416         __le64 used;
417         __le64 chunk_tree;
418         __le64 chunk_objectid;
419         __le64 flags;
420 } __attribute__ ((__packed__));
421
422 struct btrfs_space_info {
423         u64 flags;
424         u64 total_bytes;
425         u64 bytes_used;
426         u64 bytes_pinned;
427         int full;
428         struct list_head list;
429 };
430
431 struct btrfs_block_group_cache {
432         struct cache_extent cache;
433         struct btrfs_key key;
434         struct btrfs_block_group_item item;
435         struct btrfs_space_info *space_info;
436         u64 pinned;
437         u64 flags;
438         int cached;
439 };
440
441 struct btrfs_extent_ops {
442        int (*alloc_extent)(struct btrfs_root *root, u64 num_bytes,
443                            u64 hint_byte, struct btrfs_key *ins);
444        int (*free_extent)(struct btrfs_root *root, u64 bytenr,
445                           u64 num_bytes);
446 };
447
448 struct btrfs_device;
449 struct btrfs_fs_info {
450         u8 fsid[BTRFS_FSID_SIZE];
451         struct btrfs_root *fs_root;
452         struct btrfs_root *extent_root;
453         struct btrfs_root *tree_root;
454         struct btrfs_root *chunk_root;
455         struct btrfs_root *dev_root;
456
457         struct extent_io_tree extent_cache;
458         struct extent_io_tree free_space_cache;
459         struct extent_io_tree block_group_cache;
460         struct extent_io_tree pinned_extents;
461         struct extent_io_tree pending_del;
462         struct extent_io_tree extent_ins;
463
464         /* logical->physical extent mapping */
465         struct btrfs_mapping_tree mapping_tree;
466
467         u64 generation;
468         u64 last_trans_committed;
469         struct btrfs_trans_handle *running_transaction;
470         struct btrfs_super_block super_copy;
471         struct extent_buffer *sb_buffer;
472         struct mutex fs_mutex;
473         u64 total_pinned;
474
475         struct btrfs_extent_ops *extent_ops;
476         struct list_head dirty_cowonly_roots;
477
478         struct list_head devices;
479         struct list_head space_info;
480         int fp;
481         int force_system_allocs;
482         void *priv_data;
483 };
484
485 /*
486  * in ram representation of the tree.  extent_root is used for all allocations
487  * and for the extent tree extent_root root.
488  */
489 struct btrfs_root {
490         struct extent_buffer *node;
491         struct extent_buffer *commit_root;
492         struct btrfs_root_item root_item;
493         struct btrfs_key root_key;
494         struct btrfs_fs_info *fs_info;
495         u64 objectid;
496         u64 last_trans;
497
498         /* data allocations are done in sectorsize units */
499         u32 sectorsize;
500
501         /* node allocations are done in nodesize units */
502         u32 nodesize;
503
504         /* leaf allocations are done in leafsize units */
505         u32 leafsize;
506
507         /* leaf allocations are done in leafsize units */
508         u32 stripesize;
509
510         int ref_cows;
511         int track_dirty;
512
513
514         u32 type;
515         u64 highest_inode;
516         u64 last_inode_alloc;
517
518         /* the dirty list is only used by non-reference counted roots */
519         struct list_head dirty_list;
520 };
521
522 /*
523  * inode items have the data typically returned from stat and store other
524  * info about object characteristics.  There is one for every file and dir in
525  * the FS
526  */
527 #define BTRFS_INODE_ITEM_KEY            1
528 #define BTRFS_INODE_REF_KEY             2
529 #define BTRFS_XATTR_ITEM_KEY            8
530
531 /* reserve 3-15 close to the inode for later flexibility */
532
533 /*
534  * dir items are the name -> inode pointers in a directory.  There is one
535  * for every name in a directory.
536  */
537 #define BTRFS_DIR_ITEM_KEY      16
538 #define BTRFS_DIR_INDEX_KEY     17
539 /*
540  * extent data is for file data
541  */
542 #define BTRFS_EXTENT_DATA_KEY   18
543 /*
544  * csum items have the checksums for data in the extents
545  */
546 #define BTRFS_CSUM_ITEM_KEY     19
547
548 /* reserve 20-31 for other file stuff */
549
550 /*
551  * root items point to tree roots.  There are typically in the root
552  * tree used by the super block to find all the other trees
553  */
554 #define BTRFS_ROOT_ITEM_KEY     32
555 /*
556  * extent items are in the extent map tree.  These record which blocks
557  * are used, and how many references there are to each block
558  */
559 #define BTRFS_EXTENT_ITEM_KEY   33
560 #define BTRFS_EXTENT_REF_KEY    34
561
562 /*
563  * block groups give us hints into the extent allocation trees.  Which
564  * blocks are free etc etc
565  */
566 #define BTRFS_BLOCK_GROUP_ITEM_KEY 50
567
568 #define BTRFS_DEV_EXTENT_KEY    75
569 #define BTRFS_DEV_ITEM_KEY      76
570 #define BTRFS_CHUNK_ITEM_KEY    77
571
572 /*
573  * string items are for debugging.  They just store a short string of
574  * data in the FS
575  */
576 #define BTRFS_STRING_ITEM_KEY   253
577 /*
578  * Inode flags
579  */
580 #define BTRFS_INODE_NODATASUM           (1 << 0)
581 #define BTRFS_INODE_NODATACOW           (1 << 1)
582 #define BTRFS_INODE_READONLY            (1 << 2)
583
584 #define read_eb_member(eb, ptr, type, member, result) (                 \
585         read_extent_buffer(eb, (char *)(result),                        \
586                            ((unsigned long)(ptr)) +                     \
587                             offsetof(type, member),                     \
588                            sizeof(((type *)0)->member)))
589
590 #define write_eb_member(eb, ptr, type, member, result) (                \
591         write_extent_buffer(eb, (char *)(result),                       \
592                            ((unsigned long)(ptr)) +                     \
593                             offsetof(type, member),                     \
594                            sizeof(((type *)0)->member)))
595
596 #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits)             \
597 static inline u##bits btrfs_##name(struct extent_buffer *eb)            \
598 {                                                                       \
599         struct btrfs_header *h = (struct btrfs_header *)eb->data;       \
600         return le##bits##_to_cpu(h->member);                            \
601 }                                                                       \
602 static inline void btrfs_set_##name(struct extent_buffer *eb,           \
603                                     u##bits val)                        \
604 {                                                                       \
605         struct btrfs_header *h = (struct btrfs_header *)eb->data;       \
606         h->member = cpu_to_le##bits(val);                               \
607 }
608
609 #define BTRFS_SETGET_FUNCS(name, type, member, bits)                    \
610 static inline u##bits btrfs_##name(struct extent_buffer *eb,            \
611                                    type *s)                             \
612 {                                                                       \
613         unsigned long offset = (unsigned long)s;                        \
614         type *p = (type *) (eb->data + offset);                         \
615         return le##bits##_to_cpu(p->member);                            \
616 }                                                                       \
617 static inline void btrfs_set_##name(struct extent_buffer *eb,           \
618                                     type *s, u##bits val)               \
619 {                                                                       \
620         unsigned long offset = (unsigned long)s;                        \
621         type *p = (type *) (eb->data + offset);                         \
622         p->member = cpu_to_le##bits(val);                               \
623 }
624
625 #define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits)              \
626 static inline u##bits btrfs_##name(type *s)                             \
627 {                                                                       \
628         return le##bits##_to_cpu(s->member);                            \
629 }                                                                       \
630 static inline void btrfs_set_##name(type *s, u##bits val)               \
631 {                                                                       \
632         s->member = cpu_to_le##bits(val);                               \
633 }
634
635 BTRFS_SETGET_FUNCS(device_type, struct btrfs_dev_item, type, 64);
636 BTRFS_SETGET_FUNCS(device_total_bytes, struct btrfs_dev_item, total_bytes, 64);
637 BTRFS_SETGET_FUNCS(device_bytes_used, struct btrfs_dev_item, bytes_used, 64);
638 BTRFS_SETGET_FUNCS(device_io_align, struct btrfs_dev_item, io_align, 32);
639 BTRFS_SETGET_FUNCS(device_io_width, struct btrfs_dev_item, io_width, 32);
640 BTRFS_SETGET_FUNCS(device_sector_size, struct btrfs_dev_item, sector_size, 32);
641 BTRFS_SETGET_FUNCS(device_id, struct btrfs_dev_item, devid, 64);
642 BTRFS_SETGET_FUNCS(device_rdev, struct btrfs_dev_item, rdev, 64);
643 BTRFS_SETGET_FUNCS(device_partition, struct btrfs_dev_item, partition, 32);
644 BTRFS_SETGET_FUNCS(device_name_len, struct btrfs_dev_item, name_len, 16);
645
646 static inline char *btrfs_device_uuid(struct btrfs_dev_item *d)
647 {
648         return (char *)d + offsetof(struct btrfs_dev_item, uuid);
649 }
650
651 static inline char *btrfs_device_name(struct btrfs_dev_item *d)
652 {
653         return (char *)(d + 1);
654 }
655
656 BTRFS_SETGET_FUNCS(chunk_owner, struct btrfs_chunk, owner, 64);
657 BTRFS_SETGET_FUNCS(chunk_stripe_len, struct btrfs_chunk, stripe_len, 64);
658 BTRFS_SETGET_FUNCS(chunk_io_align, struct btrfs_chunk, io_align, 32);
659 BTRFS_SETGET_FUNCS(chunk_io_width, struct btrfs_chunk, io_width, 32);
660 BTRFS_SETGET_FUNCS(chunk_sector_size, struct btrfs_chunk, sector_size, 32);
661 BTRFS_SETGET_FUNCS(chunk_type, struct btrfs_chunk, type, 64);
662 BTRFS_SETGET_FUNCS(chunk_num_stripes, struct btrfs_chunk, num_stripes, 16);
663 BTRFS_SETGET_FUNCS(stripe_devid, struct btrfs_stripe, devid, 64);
664 BTRFS_SETGET_FUNCS(stripe_offset, struct btrfs_stripe, offset, 64);
665
666 BTRFS_SETGET_STACK_FUNCS(stack_chunk_owner, struct btrfs_chunk, owner, 64);
667 BTRFS_SETGET_STACK_FUNCS(stack_chunk_stripe_len, struct btrfs_chunk,
668                          stripe_len, 64);
669 BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_align, struct btrfs_chunk,
670                          io_align, 32);
671 BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_width, struct btrfs_chunk,
672                          io_width, 32);
673 BTRFS_SETGET_STACK_FUNCS(stack_chunk_sector_size, struct btrfs_chunk,
674                          sector_size, 32);
675 BTRFS_SETGET_STACK_FUNCS(stack_chunk_type, struct btrfs_chunk, type, 64);
676 BTRFS_SETGET_STACK_FUNCS(stack_chunk_num_stripes, struct btrfs_chunk,
677                          num_stripes, 16);
678 BTRFS_SETGET_STACK_FUNCS(stack_stripe_devid, struct btrfs_stripe, devid, 64);
679 BTRFS_SETGET_STACK_FUNCS(stack_stripe_offset, struct btrfs_stripe, offset, 64);
680
681 static inline struct btrfs_stripe *btrfs_stripe_nr(struct btrfs_chunk *c,
682                                                    int nr)
683 {
684         unsigned long offset = (unsigned long)c;
685         offset += offsetof(struct btrfs_chunk, stripe);
686         offset += nr * sizeof(struct btrfs_stripe);
687         return (struct btrfs_stripe *)offset;
688 }
689
690 static inline u64 btrfs_stripe_offset_nr(struct extent_buffer *eb,
691                                          struct btrfs_chunk *c, int nr)
692 {
693         return btrfs_stripe_offset(eb, btrfs_stripe_nr(c, nr));
694 }
695
696 static inline void btrfs_set_stripe_offset_nr(struct extent_buffer *eb,
697                                              struct btrfs_chunk *c, int nr,
698                                              u64 val)
699 {
700         btrfs_set_stripe_offset(eb, btrfs_stripe_nr(c, nr), val);
701 }
702
703 static inline u64 btrfs_stripe_devid_nr(struct extent_buffer *eb,
704                                          struct btrfs_chunk *c, int nr)
705 {
706         return btrfs_stripe_devid(eb, btrfs_stripe_nr(c, nr));
707 }
708
709 static inline void btrfs_set_stripe_devid_nr(struct extent_buffer *eb,
710                                              struct btrfs_chunk *c, int nr,
711                                              u64 val)
712 {
713         btrfs_set_stripe_devid(eb, btrfs_stripe_nr(c, nr), val);
714 }
715
716 /* struct btrfs_block_group_item */
717 BTRFS_SETGET_STACK_FUNCS(block_group_used, struct btrfs_block_group_item,
718                          used, 64);
719 BTRFS_SETGET_FUNCS(disk_block_group_used, struct btrfs_block_group_item,
720                          used, 64);
721 BTRFS_SETGET_STACK_FUNCS(block_group_chunk_tree, struct btrfs_block_group_item,
722                          chunk_tree, 64);
723 BTRFS_SETGET_FUNCS(disk_block_group_chunk_tree, struct btrfs_block_group_item,
724                          chunk_tree, 64);
725 BTRFS_SETGET_STACK_FUNCS(block_group_chunk_objectid,
726                         struct btrfs_block_group_item, chunk_objectid, 64);
727 BTRFS_SETGET_FUNCS(disk_block_group_chunk_objecitd,
728                    struct btrfs_block_group_item, chunk_objectid, 64);
729 BTRFS_SETGET_FUNCS(disk_block_group_flags,
730                    struct btrfs_block_group_item, flags, 64);
731 BTRFS_SETGET_STACK_FUNCS(block_group_flags,
732                         struct btrfs_block_group_item, flags, 64);
733
734 /* struct btrfs_inode_ref */
735 BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
736
737 /* struct btrfs_inode_item */
738 BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
739 BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64);
740 BTRFS_SETGET_FUNCS(inode_nblocks, struct btrfs_inode_item, nblocks, 64);
741 BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64);
742 BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32);
743 BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32);
744 BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32);
745 BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32);
746 BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 64);
747 BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 16);
748 BTRFS_SETGET_FUNCS(inode_compat_flags, struct btrfs_inode_item,
749                    compat_flags, 16);
750
751 BTRFS_SETGET_STACK_FUNCS(stack_inode_generation,
752                          struct btrfs_inode_item, generation, 64);
753 BTRFS_SETGET_STACK_FUNCS(stack_inode_size,
754                          struct btrfs_inode_item, size, 64);
755 BTRFS_SETGET_STACK_FUNCS(stack_inode_nblocks,
756                          struct btrfs_inode_item, nblocks, 64);
757 BTRFS_SETGET_STACK_FUNCS(stack_inode_block_group,
758                          struct btrfs_inode_item, block_group, 64);
759 BTRFS_SETGET_STACK_FUNCS(stack_inode_nlink,
760                          struct btrfs_inode_item, nlink, 32);
761 BTRFS_SETGET_STACK_FUNCS(stack_inode_uid,
762                          struct btrfs_inode_item, uid, 32);
763 BTRFS_SETGET_STACK_FUNCS(stack_inode_gid,
764                          struct btrfs_inode_item, gid, 32);
765 BTRFS_SETGET_STACK_FUNCS(stack_inode_mode,
766                          struct btrfs_inode_item, mode, 32);
767 BTRFS_SETGET_STACK_FUNCS(stack_inode_rdev,
768                          struct btrfs_inode_item, rdev, 64);
769 BTRFS_SETGET_STACK_FUNCS(stack_inode_flags,
770                          struct btrfs_inode_item, flags, 16);
771 BTRFS_SETGET_STACK_FUNCS(stack_inode_compat_flags,
772                          struct btrfs_inode_item, compat_flags, 16);
773
774 static inline struct btrfs_timespec *
775 btrfs_inode_atime(struct btrfs_inode_item *inode_item)
776 {
777         unsigned long ptr = (unsigned long)inode_item;
778         ptr += offsetof(struct btrfs_inode_item, atime);
779         return (struct btrfs_timespec *)ptr;
780 }
781
782 static inline struct btrfs_timespec *
783 btrfs_inode_mtime(struct btrfs_inode_item *inode_item)
784 {
785         unsigned long ptr = (unsigned long)inode_item;
786         ptr += offsetof(struct btrfs_inode_item, mtime);
787         return (struct btrfs_timespec *)ptr;
788 }
789
790 static inline struct btrfs_timespec *
791 btrfs_inode_ctime(struct btrfs_inode_item *inode_item)
792 {
793         unsigned long ptr = (unsigned long)inode_item;
794         ptr += offsetof(struct btrfs_inode_item, ctime);
795         return (struct btrfs_timespec *)ptr;
796 }
797
798 static inline struct btrfs_timespec *
799 btrfs_inode_otime(struct btrfs_inode_item *inode_item)
800 {
801         unsigned long ptr = (unsigned long)inode_item;
802         ptr += offsetof(struct btrfs_inode_item, otime);
803         return (struct btrfs_timespec *)ptr;
804 }
805
806 BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_timespec, sec, 64);
807 BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
808 BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec,
809                          sec, 64);
810 BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec,
811                          nsec, 32);
812
813 /* struct btrfs_dev_extent */
814 BTRFS_SETGET_FUNCS(dev_extent_owner, struct btrfs_dev_extent, owner, 64);
815 BTRFS_SETGET_FUNCS(dev_extent_length, struct btrfs_dev_extent, length, 64);
816
817 /* struct btrfs_extent_item */
818 BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 32);
819
820 /* struct btrfs_extent_ref */
821 BTRFS_SETGET_FUNCS(ref_root, struct btrfs_extent_ref, root, 64);
822 BTRFS_SETGET_FUNCS(ref_generation, struct btrfs_extent_ref, generation, 64);
823 BTRFS_SETGET_FUNCS(ref_objectid, struct btrfs_extent_ref, objectid, 64);
824 BTRFS_SETGET_FUNCS(ref_offset, struct btrfs_extent_ref, offset, 64);
825
826 BTRFS_SETGET_STACK_FUNCS(stack_ref_root, struct btrfs_extent_ref, root, 64);
827 BTRFS_SETGET_STACK_FUNCS(stack_ref_generation, struct btrfs_extent_ref,
828                          generation, 64);
829 BTRFS_SETGET_STACK_FUNCS(stack_ref_objectid, struct btrfs_extent_ref,
830                          objectid, 64);
831 BTRFS_SETGET_STACK_FUNCS(stack_ref_offset, struct btrfs_extent_ref, offset, 64);
832
833 BTRFS_SETGET_STACK_FUNCS(stack_extent_refs, struct btrfs_extent_item,
834                          refs, 32);
835
836 /* struct btrfs_node */
837 BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64);
838 BTRFS_SETGET_FUNCS(key_generation, struct btrfs_key_ptr, generation, 64);
839
840 static inline u64 btrfs_node_blockptr(struct extent_buffer *eb, int nr)
841 {
842         unsigned long ptr;
843         ptr = offsetof(struct btrfs_node, ptrs) +
844                 sizeof(struct btrfs_key_ptr) * nr;
845         return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr);
846 }
847
848 static inline void btrfs_set_node_blockptr(struct extent_buffer *eb,
849                                            int nr, u64 val)
850 {
851         unsigned long ptr;
852         ptr = offsetof(struct btrfs_node, ptrs) +
853                 sizeof(struct btrfs_key_ptr) * nr;
854         btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val);
855 }
856
857 static inline u64 btrfs_node_ptr_generation(struct extent_buffer *eb, int nr)
858 {
859         unsigned long ptr;
860         ptr = offsetof(struct btrfs_node, ptrs) +
861                 sizeof(struct btrfs_key_ptr) * nr;
862         return btrfs_key_generation(eb, (struct btrfs_key_ptr *)ptr);
863 }
864
865 static inline void btrfs_set_node_ptr_generation(struct extent_buffer *eb,
866                                                  int nr, u64 val)
867 {
868         unsigned long ptr;
869         ptr = offsetof(struct btrfs_node, ptrs) +
870                 sizeof(struct btrfs_key_ptr) * nr;
871         btrfs_set_key_generation(eb, (struct btrfs_key_ptr *)ptr, val);
872 }
873
874 static inline unsigned long btrfs_node_key_ptr_offset(int nr)
875 {
876         return offsetof(struct btrfs_node, ptrs) +
877                 sizeof(struct btrfs_key_ptr) * nr;
878 }
879
880 static inline void btrfs_node_key(struct extent_buffer *eb,
881                                   struct btrfs_disk_key *disk_key, int nr)
882 {
883         unsigned long ptr;
884         ptr = btrfs_node_key_ptr_offset(nr);
885         read_eb_member(eb, (struct btrfs_key_ptr *)ptr,
886                        struct btrfs_key_ptr, key, disk_key);
887 }
888
889 static inline void btrfs_set_node_key(struct extent_buffer *eb,
890                                       struct btrfs_disk_key *disk_key, int nr)
891 {
892         unsigned long ptr;
893         ptr = btrfs_node_key_ptr_offset(nr);
894         write_eb_member(eb, (struct btrfs_key_ptr *)ptr,
895                        struct btrfs_key_ptr, key, disk_key);
896 }
897
898 /* struct btrfs_item */
899 BTRFS_SETGET_FUNCS(item_offset, struct btrfs_item, offset, 32);
900 BTRFS_SETGET_FUNCS(item_size, struct btrfs_item, size, 32);
901
902 static inline unsigned long btrfs_item_nr_offset(int nr)
903 {
904         return offsetof(struct btrfs_leaf, items) +
905                 sizeof(struct btrfs_item) * nr;
906 }
907
908 static inline struct btrfs_item *btrfs_item_nr(struct extent_buffer *eb,
909                                                int nr)
910 {
911         return (struct btrfs_item *)btrfs_item_nr_offset(nr);
912 }
913
914 static inline u32 btrfs_item_end(struct extent_buffer *eb,
915                                  struct btrfs_item *item)
916 {
917         return btrfs_item_offset(eb, item) + btrfs_item_size(eb, item);
918 }
919
920 static inline u32 btrfs_item_end_nr(struct extent_buffer *eb, int nr)
921 {
922         return btrfs_item_end(eb, btrfs_item_nr(eb, nr));
923 }
924
925 static inline u32 btrfs_item_offset_nr(struct extent_buffer *eb, int nr)
926 {
927         return btrfs_item_offset(eb, btrfs_item_nr(eb, nr));
928 }
929
930 static inline u32 btrfs_item_size_nr(struct extent_buffer *eb, int nr)
931 {
932         return btrfs_item_size(eb, btrfs_item_nr(eb, nr));
933 }
934
935 static inline void btrfs_item_key(struct extent_buffer *eb,
936                            struct btrfs_disk_key *disk_key, int nr)
937 {
938         struct btrfs_item *item = btrfs_item_nr(eb, nr);
939         read_eb_member(eb, item, struct btrfs_item, key, disk_key);
940 }
941
942 static inline void btrfs_set_item_key(struct extent_buffer *eb,
943                                struct btrfs_disk_key *disk_key, int nr)
944 {
945         struct btrfs_item *item = btrfs_item_nr(eb, nr);
946         write_eb_member(eb, item, struct btrfs_item, key, disk_key);
947 }
948
949 /* struct btrfs_dir_item */
950 BTRFS_SETGET_FUNCS(dir_data_len, struct btrfs_dir_item, data_len, 16);
951 BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8);
952 BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16);
953
954 static inline void btrfs_dir_item_key(struct extent_buffer *eb,
955                                       struct btrfs_dir_item *item,
956                                       struct btrfs_disk_key *key)
957 {
958         read_eb_member(eb, item, struct btrfs_dir_item, location, key);
959 }
960
961 static inline void btrfs_set_dir_item_key(struct extent_buffer *eb,
962                                           struct btrfs_dir_item *item,
963                                           struct btrfs_disk_key *key)
964 {
965         write_eb_member(eb, item, struct btrfs_dir_item, location, key);
966 }
967
968 /* struct btrfs_disk_key */
969 BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key,
970                          objectid, 64);
971 BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64);
972 BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8);
973
974 static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
975                                          struct btrfs_disk_key *disk)
976 {
977         cpu->offset = le64_to_cpu(disk->offset);
978         cpu->type = disk->type;
979         cpu->objectid = le64_to_cpu(disk->objectid);
980 }
981
982 static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
983                                          struct btrfs_key *cpu)
984 {
985         disk->offset = cpu_to_le64(cpu->offset);
986         disk->type = cpu->type;
987         disk->objectid = cpu_to_le64(cpu->objectid);
988 }
989
990 static inline void btrfs_node_key_to_cpu(struct extent_buffer *eb,
991                                   struct btrfs_key *key, int nr)
992 {
993         struct btrfs_disk_key disk_key;
994         btrfs_node_key(eb, &disk_key, nr);
995         btrfs_disk_key_to_cpu(key, &disk_key);
996 }
997
998 static inline void btrfs_item_key_to_cpu(struct extent_buffer *eb,
999                                   struct btrfs_key *key, int nr)
1000 {
1001         struct btrfs_disk_key disk_key;
1002         btrfs_item_key(eb, &disk_key, nr);
1003         btrfs_disk_key_to_cpu(key, &disk_key);
1004 }
1005
1006 static inline void btrfs_dir_item_key_to_cpu(struct extent_buffer *eb,
1007                                       struct btrfs_dir_item *item,
1008                                       struct btrfs_key *key)
1009 {
1010         struct btrfs_disk_key disk_key;
1011         btrfs_dir_item_key(eb, item, &disk_key);
1012         btrfs_disk_key_to_cpu(key, &disk_key);
1013 }
1014
1015
1016 static inline u8 btrfs_key_type(struct btrfs_key *key)
1017 {
1018         return key->type;
1019 }
1020
1021 static inline void btrfs_set_key_type(struct btrfs_key *key, u8 val)
1022 {
1023         key->type = val;
1024 }
1025
1026 /* struct btrfs_header */
1027 BTRFS_SETGET_HEADER_FUNCS(header_bytenr, struct btrfs_header, bytenr, 64);
1028 BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header,
1029                           generation, 64);
1030 BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64);
1031 BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32);
1032 BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 16);
1033 BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8);
1034
1035 static inline u8 *btrfs_header_fsid(struct extent_buffer *eb)
1036 {
1037         unsigned long ptr = offsetof(struct btrfs_header, fsid);
1038         return (u8 *)ptr;
1039 }
1040
1041 static inline u8 *btrfs_super_fsid(struct extent_buffer *eb)
1042 {
1043         unsigned long ptr = offsetof(struct btrfs_super_block, fsid);
1044         return (u8 *)ptr;
1045 }
1046
1047 static inline u8 *btrfs_header_csum(struct extent_buffer *eb)
1048 {
1049         unsigned long ptr = offsetof(struct btrfs_header, csum);
1050         return (u8 *)ptr;
1051 }
1052
1053 static inline struct btrfs_node *btrfs_buffer_node(struct extent_buffer *eb)
1054 {
1055         return NULL;
1056 }
1057
1058 static inline struct btrfs_leaf *btrfs_buffer_leaf(struct extent_buffer *eb)
1059 {
1060         return NULL;
1061 }
1062
1063 static inline struct btrfs_header *btrfs_buffer_header(struct extent_buffer *eb)
1064 {
1065         return NULL;
1066 }
1067
1068 static inline int btrfs_is_leaf(struct extent_buffer *eb)
1069 {
1070         return (btrfs_header_level(eb) == 0);
1071 }
1072
1073 /* struct btrfs_root_item */
1074 BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32);
1075 BTRFS_SETGET_FUNCS(disk_root_bytenr, struct btrfs_root_item, bytenr, 64);
1076 BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
1077
1078 BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
1079 BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
1080 BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
1081 BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
1082 BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 32);
1083 BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
1084 BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
1085
1086 /* struct btrfs_super_block */
1087 BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
1088 BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
1089                          generation, 64);
1090 BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
1091 BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
1092                          struct btrfs_super_block, sys_chunk_array_size, 32);
1093 BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
1094                          root_level, 8);
1095 BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
1096                          chunk_root, 64);
1097 BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
1098                          chunk_root_level, 64);
1099 BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
1100                          total_bytes, 64);
1101 BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
1102                          bytes_used, 64);
1103 BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
1104                          sectorsize, 32);
1105 BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
1106                          nodesize, 32);
1107 BTRFS_SETGET_STACK_FUNCS(super_leafsize, struct btrfs_super_block,
1108                          leafsize, 32);
1109 BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
1110                          stripesize, 32);
1111 BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
1112                          root_dir_objectid, 64);
1113
1114 static inline unsigned long btrfs_leaf_data(struct extent_buffer *l)
1115 {
1116         return offsetof(struct btrfs_leaf, items);
1117 }
1118
1119 /* struct btrfs_file_extent_item */
1120 BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
1121
1122 static inline unsigned long btrfs_file_extent_inline_start(struct
1123                                                    btrfs_file_extent_item *e)
1124 {
1125         unsigned long offset = (unsigned long)e;
1126         offset += offsetof(struct btrfs_file_extent_item, disk_bytenr);
1127         return offset;
1128 }
1129
1130 static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize)
1131 {
1132         return offsetof(struct btrfs_file_extent_item, disk_bytenr) + datasize;
1133 }
1134
1135 static inline u32 btrfs_file_extent_inline_len(struct extent_buffer *eb,
1136                                                struct btrfs_item *e)
1137 {
1138         unsigned long offset;
1139         offset = offsetof(struct btrfs_file_extent_item, disk_bytenr);
1140         return btrfs_item_size(eb, e) - offset;
1141 }
1142
1143 BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
1144                    disk_bytenr, 64);
1145 BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item,
1146                    generation, 64);
1147 BTRFS_SETGET_FUNCS(file_extent_disk_num_bytes, struct btrfs_file_extent_item,
1148                    disk_num_bytes, 64);
1149 BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item,
1150                   offset, 64);
1151 BTRFS_SETGET_FUNCS(file_extent_num_bytes, struct btrfs_file_extent_item,
1152                    num_bytes, 64);
1153
1154 static inline u32 btrfs_level_size(struct btrfs_root *root, int level) {
1155         if (level == 0)
1156                 return root->leafsize;
1157         return root->nodesize;
1158 }
1159
1160 /* helper function to cast into the data area of the leaf. */
1161 #define btrfs_item_ptr(leaf, slot, type) \
1162         ((type *)(btrfs_leaf_data(leaf) + \
1163         btrfs_item_offset_nr(leaf, slot)))
1164
1165 #define btrfs_item_ptr_offset(leaf, slot) \
1166         ((unsigned long)(btrfs_leaf_data(leaf) + \
1167         btrfs_item_offset_nr(leaf, slot)))
1168
1169 /* extent-tree.c */
1170 u32 btrfs_count_snapshots_in_path(struct btrfs_root *root,
1171                                   struct btrfs_path *count_path,
1172                                   u64 first_extent);
1173 int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
1174                          struct btrfs_root *root);
1175 int btrfs_copy_pinned(struct btrfs_root *root, struct extent_io_tree *copy);
1176 struct btrfs_block_group_cache *btrfs_lookup_block_group(struct
1177                                                          btrfs_fs_info *info,
1178                                                          u64 bytenr);
1179 struct btrfs_block_group_cache *btrfs_find_block_group(struct btrfs_root *root,
1180                                                  struct btrfs_block_group_cache
1181                                                  *hint, u64 search_start,
1182                                                  int data, int owner);
1183 int btrfs_inc_root_ref(struct btrfs_trans_handle *trans,
1184                        struct btrfs_root *root, u64 owner_objectid);
1185 struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
1186                                             struct btrfs_root *root, u32 size,
1187                                             u64 root_objectid,
1188                                             u64 hint, u64 empty_size);
1189 struct extent_buffer *__btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
1190                                              struct btrfs_root *root,
1191                                              u32 blocksize,
1192                                              u64 root_objectid,
1193                                              u64 ref_generation,
1194                                              u64 first_objectid,
1195                                              int level,
1196                                              u64 hint,
1197                                              u64 empty_size);
1198 int btrfs_grow_extent_tree(struct btrfs_trans_handle *trans,
1199                            struct btrfs_root *root, u64 new_size);
1200 int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size);
1201 int btrfs_insert_extent_backref(struct btrfs_trans_handle *trans,
1202                                  struct btrfs_root *root,
1203                                  struct btrfs_path *path, u64 bytenr,
1204                                  u64 root_objectid, u64 ref_generation,
1205                                  u64 owner, u64 owner_offset);
1206 int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
1207                        struct btrfs_root *root,
1208                        u64 num_bytes, u64 root_objectid, u64 ref_generation,
1209                        u64 owner, u64 owner_offset,
1210                        u64 empty_size, u64 hint_byte,
1211                        u64 search_end, struct btrfs_key *ins, int data);
1212 int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1213                   struct extent_buffer *buf);
1214 int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
1215                       *root, u64 bytenr, u64 num_bytes,
1216                       u64 root_objectid, u64 ref_generation,
1217                       u64 owner_objectid, u64 owner_offset, int pin);
1218 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans,
1219                                struct btrfs_root *root,
1220                                struct extent_io_tree *unpin);
1221 int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
1222                                 struct btrfs_root *root,
1223                                 u64 bytenr, u64 num_bytes,
1224                                 u64 root_objectid, u64 ref_generation,
1225                                 u64 owner, u64 owner_offset);
1226 int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
1227                                     struct btrfs_root *root);
1228 int btrfs_free_block_groups(struct btrfs_fs_info *info);
1229 int btrfs_read_block_groups(struct btrfs_root *root);
1230 int btrfs_make_block_group(struct btrfs_trans_handle *trans,
1231                            struct btrfs_root *root, u64 bytes_used,
1232                            u64 type, u64 chunk_tree, u64 chunk_objectid,
1233                            u64 size);
1234 u64 btrfs_hash_extent_ref(u64 root_objectid, u64 ref_generation,
1235                           u64 owner, u64 owner_offset);
1236 int btrfs_update_block_group(struct btrfs_trans_handle *trans,
1237                              struct btrfs_root *root, u64 bytenr, u64 num,
1238                              int alloc, int mark_free);
1239 /* ctree.c */
1240 int btrfs_previous_item(struct btrfs_root *root,
1241                         struct btrfs_path *path, u64 min_objectid,
1242                         int type);
1243 int btrfs_comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2);
1244 int btrfs_cow_block(struct btrfs_trans_handle *trans,
1245                     struct btrfs_root *root, struct extent_buffer *buf,
1246                     struct extent_buffer *parent, int parent_slot,
1247                     struct extent_buffer **cow_ret);
1248 int btrfs_copy_root(struct btrfs_trans_handle *trans,
1249                       struct btrfs_root *root,
1250                       struct extent_buffer *buf,
1251                       struct extent_buffer **cow_ret, u64 new_root_objectid);
1252 int btrfs_extend_item(struct btrfs_trans_handle *trans, struct btrfs_root
1253                       *root, struct btrfs_path *path, u32 data_size);
1254 int btrfs_truncate_item(struct btrfs_trans_handle *trans,
1255                         struct btrfs_root *root,
1256                         struct btrfs_path *path,
1257                         u32 new_size, int from_end);
1258 int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
1259                       *root, struct btrfs_key *key, struct btrfs_path *p, int
1260                       ins_len, int cow);
1261 int btrfs_realloc_node(struct btrfs_trans_handle *trans,
1262                        struct btrfs_root *root, struct extent_buffer *parent,
1263                        int start_slot, int cache_only, u64 *last_ret,
1264                        struct btrfs_key *progress);
1265 void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p);
1266 struct btrfs_path *btrfs_alloc_path(void);
1267 void btrfs_free_path(struct btrfs_path *p);
1268 void btrfs_init_path(struct btrfs_path *p);
1269 int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1270                    struct btrfs_path *path, int slot, int nr);
1271
1272 static inline int btrfs_del_item(struct btrfs_trans_handle *trans,
1273                                  struct btrfs_root *root,
1274                                  struct btrfs_path *path)
1275 {
1276         return btrfs_del_items(trans, root, path, path->slots[0], 1);
1277 }
1278
1279 int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
1280                       *root, struct btrfs_key *key, void *data, u32 data_size);
1281 int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
1282                              struct btrfs_root *root,
1283                              struct btrfs_path *path,
1284                              struct btrfs_key *cpu_key, u32 *data_size, int nr);
1285
1286 static inline int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,
1287                                           struct btrfs_root *root,
1288                                           struct btrfs_path *path,
1289                                           struct btrfs_key *key,
1290                                           u32 data_size)
1291 {
1292         return btrfs_insert_empty_items(trans, root, path, key, &data_size, 1);
1293 }
1294
1295 int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);
1296 int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path);
1297 int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf);
1298 int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root
1299                         *root);
1300
1301
1302 /* root-item.c */
1303 int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1304                    struct btrfs_key *key);
1305 int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root
1306                       *root, struct btrfs_key *key, struct btrfs_root_item
1307                       *item);
1308 int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
1309                       *root, struct btrfs_key *key, struct btrfs_root_item
1310                       *item);
1311 int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, struct
1312                          btrfs_root_item *item, struct btrfs_key *key);
1313 int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid,
1314                           struct btrfs_root *latest_root);
1315 /* dir-item.c */
1316 int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
1317                           *root, const char *name, int name_len, u64 dir,
1318                           struct btrfs_key *location, u8 type);
1319 struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
1320                                              struct btrfs_root *root,
1321                                              struct btrfs_path *path, u64 dir,
1322                                              const char *name, int name_len,
1323                                              int mod);
1324 struct btrfs_dir_item *
1325 btrfs_lookup_dir_index_item(struct btrfs_trans_handle *trans,
1326                             struct btrfs_root *root,
1327                             struct btrfs_path *path, u64 dir,
1328                             u64 objectid, const char *name, int name_len,
1329                             int mod);
1330 struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root,
1331                               struct btrfs_path *path,
1332                               const char *name, int name_len);
1333 int btrfs_delete_one_dir_name(struct btrfs_trans_handle *trans,
1334                               struct btrfs_root *root,
1335                               struct btrfs_path *path,
1336                               struct btrfs_dir_item *di);
1337 int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans,
1338                             struct btrfs_root *root, const char *name,
1339                             u16 name_len, const void *data, u16 data_len,
1340                             u64 dir);
1341 struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans,
1342                                           struct btrfs_root *root,
1343                                           struct btrfs_path *path, u64 dir,
1344                                           const char *name, u16 name_len,
1345                                           int mod);
1346 /* inode-map.c */
1347 int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
1348                              struct btrfs_root *fs_root,
1349                              u64 dirid, u64 *objectid);
1350 int btrfs_find_highest_inode(struct btrfs_root *fs_root, u64 *objectid);
1351
1352 /* inode-item.c */
1353 int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
1354                            struct btrfs_root *root,
1355                            const char *name, int name_len,
1356                            u64 inode_objectid, u64 ref_objectid);
1357 int btrfs_del_inode_ref(struct btrfs_trans_handle *trans,
1358                            struct btrfs_root *root,
1359                            const char *name, int name_len,
1360                            u64 inode_objectid, u64 ref_objectid);
1361 int btrfs_insert_empty_inode(struct btrfs_trans_handle *trans,
1362                              struct btrfs_root *root,
1363                              struct btrfs_path *path, u64 objectid);
1364 int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root
1365                        *root, u64 objectid, struct btrfs_inode_item
1366                        *inode_item);
1367 int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root
1368                        *root, struct btrfs_path *path,
1369                        struct btrfs_key *location, int mod);
1370
1371 /* file-item.c */
1372 int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
1373                              struct btrfs_root *root,
1374                              u64 objectid, u64 pos, u64 offset,
1375                              u64 disk_num_bytes,
1376                              u64 num_bytes);
1377 int btrfs_insert_inline_extent(struct btrfs_trans_handle *trans,
1378                                 struct btrfs_root *root, u64 objectid,
1379                                 u64 offset, char *buffer, size_t size);
1380 int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
1381                              struct btrfs_root *root,
1382                              struct btrfs_path *path, u64 objectid,
1383                              u64 bytenr, int mod);
1384 int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
1385                           struct btrfs_root *root,
1386                           struct btrfs_inode_item *inode,
1387                           u64 objectid, u64 offset,
1388                           char *data, size_t len);
1389 struct btrfs_csum_item *btrfs_lookup_csum(struct btrfs_trans_handle *trans,
1390                                           struct btrfs_root *root,
1391                                           struct btrfs_path *path,
1392                                           u64 objectid, u64 offset,
1393                                           int cow);
1394 int btrfs_csum_truncate(struct btrfs_trans_handle *trans,
1395                         struct btrfs_root *root, struct btrfs_path *path,
1396                         u64 isize);
1397 #endif