Btrfs: verify csums on read
[linux-2.6] / fs / btrfs / ctree.h
1 #ifndef __BTRFS__
2 #define __BTRFS__
3
4 #include <linux/fs.h>
5 #include "bit-radix.h"
6
7 struct btrfs_trans_handle;
8 struct btrfs_transaction;
9
10 #define BTRFS_MAGIC "_BtRfS_M"
11
12 #define BTRFS_ROOT_TREE_OBJECTID 1ULL
13 #define BTRFS_EXTENT_TREE_OBJECTID 2ULL
14 #define BTRFS_INODE_MAP_OBJECTID 3ULL
15 #define BTRFS_FS_TREE_OBJECTID 4ULL
16 #define BTRFS_FIRST_FREE_OBJECTID 5ULL
17
18 /*
19  * we can actually store much bigger names, but lets not confuse the rest
20  * of linux
21  */
22 #define BTRFS_NAME_LEN 255
23
24 /* 32 bytes in various csum fields */
25 #define BTRFS_CSUM_SIZE 32
26
27 /*
28  * the key defines the order in the tree, and so it also defines (optimal)
29  * block layout.  objectid corresonds to the inode number.  The flags
30  * tells us things about the object, and is a kind of stream selector.
31  * so for a given inode, keys with flags of 1 might refer to the inode
32  * data, flags of 2 may point to file data in the btree and flags == 3
33  * may point to extents.
34  *
35  * offset is the starting byte offset for this key in the stream.
36  *
37  * btrfs_disk_key is in disk byte order.  struct btrfs_key is always
38  * in cpu native order.  Otherwise they are identical and their sizes
39  * should be the same (ie both packed)
40  */
41 struct btrfs_disk_key {
42         __le64 objectid;
43         __le64 offset;
44         __le32 flags;
45 } __attribute__ ((__packed__));
46
47 struct btrfs_key {
48         u64 objectid;
49         u64 offset;
50         u32 flags;
51 } __attribute__ ((__packed__));
52
53 /*
54  * every tree block (leaf or node) starts with this header.
55  */
56 struct btrfs_header {
57         u8 csum[BTRFS_CSUM_SIZE];
58         u8 fsid[16]; /* FS specific uuid */
59         __le64 blocknr; /* which block this node is supposed to live in */
60         __le64 generation;
61         __le64 parentid; /* objectid of the tree root */
62         __le32 ham;
63         __le16 nritems;
64         __le16 flags;
65         u8 level;
66 } __attribute__ ((__packed__));
67
68 #define BTRFS_MAX_LEVEL 8
69 #define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->blocksize - \
70                                 sizeof(struct btrfs_header)) / \
71                                (sizeof(struct btrfs_disk_key) + sizeof(u64)))
72 #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
73 #define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->blocksize))
74
75 struct buffer_head;
76 /*
77  * the super block basically lists the main trees of the FS
78  * it currently lacks any block count etc etc
79  */
80 struct btrfs_super_block {
81         u8 csum[BTRFS_CSUM_SIZE];
82         /* the first 3 fields must match struct btrfs_header */
83         u8 fsid[16];    /* FS specific uuid */
84         __le64 blocknr; /* this block number */
85         __le64 magic;
86         __le32 blocksize;
87         __le64 generation;
88         __le64 root;
89         __le64 total_blocks;
90         __le64 blocks_used;
91         __le64 root_dir_objectid;
92 } __attribute__ ((__packed__));
93
94 /*
95  * A leaf is full of items. offset and size tell us where to find
96  * the item in the leaf (relative to the start of the data area)
97  */
98 struct btrfs_item {
99         struct btrfs_disk_key key;
100         __le32 offset;
101         __le16 size;
102 } __attribute__ ((__packed__));
103
104 /*
105  * leaves have an item area and a data area:
106  * [item0, item1....itemN] [free space] [dataN...data1, data0]
107  *
108  * The data is separate from the items to get the keys closer together
109  * during searches.
110  */
111 struct btrfs_leaf {
112         struct btrfs_header header;
113         struct btrfs_item items[];
114 } __attribute__ ((__packed__));
115
116 /*
117  * all non-leaf blocks are nodes, they hold only keys and pointers to
118  * other blocks
119  */
120 struct btrfs_key_ptr {
121         struct btrfs_disk_key key;
122         __le64 blockptr;
123 } __attribute__ ((__packed__));
124
125 struct btrfs_node {
126         struct btrfs_header header;
127         struct btrfs_key_ptr ptrs[];
128 } __attribute__ ((__packed__));
129
130 /*
131  * btrfs_paths remember the path taken from the root down to the leaf.
132  * level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point
133  * to any other levels that are present.
134  *
135  * The slots array records the index of the item or block pointer
136  * used while walking the tree.
137  */
138 struct btrfs_path {
139         struct buffer_head *nodes[BTRFS_MAX_LEVEL];
140         int slots[BTRFS_MAX_LEVEL];
141 };
142
143 /*
144  * items in the extent btree are used to record the objectid of the
145  * owner of the block and the number of references
146  */
147 struct btrfs_extent_item {
148         __le32 refs;
149         __le64 owner;
150 } __attribute__ ((__packed__));
151
152 struct btrfs_inode_timespec {
153         __le64 sec;
154         __le32 nsec;
155 } __attribute__ ((__packed__));
156
157 /*
158  * there is no padding here on purpose.  If you want to extent the inode,
159  * make a new item type
160  */
161 struct btrfs_inode_item {
162         __le64 generation;
163         __le64 size;
164         __le64 nblocks;
165         __le32 nlink;
166         __le32 uid;
167         __le32 gid;
168         __le32 mode;
169         __le32 rdev;
170         __le16 flags;
171         __le16 compat_flags;
172         struct btrfs_inode_timespec atime;
173         struct btrfs_inode_timespec ctime;
174         struct btrfs_inode_timespec mtime;
175         struct btrfs_inode_timespec otime;
176 } __attribute__ ((__packed__));
177
178 /* inline data is just a blob of bytes */
179 struct btrfs_inline_data_item {
180         u8 data;
181 } __attribute__ ((__packed__));
182
183 struct btrfs_dir_item {
184         __le64 objectid;
185         __le16 flags;
186         __le16 name_len;
187         u8 type;
188 } __attribute__ ((__packed__));
189
190 struct btrfs_root_item {
191         __le64 blocknr;
192         __le32 flags;
193         __le64 block_limit;
194         __le64 blocks_used;
195         __le32 refs;
196 } __attribute__ ((__packed__));
197
198 struct btrfs_file_extent_item {
199         __le64 generation;
200         /*
201          * disk space consumed by the extent, checksum blocks are included
202          * in these numbers
203          */
204         __le64 disk_blocknr;
205         __le64 disk_num_blocks;
206         /*
207          * the logical offset in file blocks (no csums)
208          * this extent record is for.  This allows a file extent to point
209          * into the middle of an existing extent on disk, sharing it
210          * between two snapshots (useful if some bytes in the middle of the
211          * extent have changed
212          */
213         __le64 offset;
214         /*
215          * the logical number of file blocks (no csums included)
216          */
217         __le64 num_blocks;
218 } __attribute__ ((__packed__));
219
220 struct btrfs_csum_item {
221         u8 csum[BTRFS_CSUM_SIZE];
222 } __attribute__ ((__packed__));
223
224 struct btrfs_inode_map_item {
225         struct btrfs_disk_key key;
226 } __attribute__ ((__packed__));
227
228 struct crypto_hash;
229 struct btrfs_fs_info {
230         struct btrfs_root *fs_root;
231         struct btrfs_root *extent_root;
232         struct btrfs_root *tree_root;
233         struct btrfs_root *inode_root;
234         struct btrfs_key current_insert;
235         struct btrfs_key last_insert;
236         struct radix_tree_root pending_del_radix;
237         struct radix_tree_root pinned_radix;
238         u64 last_inode_alloc;
239         u64 last_inode_alloc_dirid;
240         u64 generation;
241         struct btrfs_transaction *running_transaction;
242         struct btrfs_super_block *disk_super;
243         struct buffer_head *sb_buffer;
244         struct super_block *sb;
245         struct inode *btree_inode;
246         struct mutex trans_mutex;
247         struct mutex fs_mutex;
248         struct crypto_hash *hash_tfm;
249         spinlock_t hash_lock;
250 };
251
252 /*
253  * in ram representation of the tree.  extent_root is used for all allocations
254  * and for the extent tree extent_root root.  current_insert is used
255  * only for the extent tree.
256  */
257 struct btrfs_root {
258         struct buffer_head *node;
259         struct buffer_head *commit_root;
260         struct btrfs_root_item root_item;
261         struct btrfs_key root_key;
262         struct btrfs_fs_info *fs_info;
263         u32 blocksize;
264         int ref_cows;
265         u32 type;
266 };
267
268 /* the lower bits in the key flags defines the item type */
269 #define BTRFS_KEY_TYPE_MAX      256
270 #define BTRFS_KEY_TYPE_MASK     (BTRFS_KEY_TYPE_MAX - 1)
271
272 /*
273  * inode items have the data typically returned from stat and store other
274  * info about object characteristics.  There is one for every file and dir in
275  * the FS
276  */
277 #define BTRFS_INODE_ITEM_KEY    1
278
279 /*
280  * dir items are the name -> inode pointers in a directory.  There is one
281  * for every name in a directory.
282  */
283 #define BTRFS_DIR_ITEM_KEY      2
284 /*
285  * inline data is file data that fits in the btree.
286  */
287 #define BTRFS_INLINE_DATA_KEY   3
288 /*
289  * extent data is for data that can't fit in the btree.  It points to
290  * a (hopefully) huge chunk of disk
291  */
292 #define BTRFS_EXTENT_DATA_KEY   4
293 /*
294  * csum items have the checksums for data in the extents
295  */
296 #define BTRFS_CSUM_ITEM_KEY     5
297
298 /*
299  * root items point to tree roots.  There are typically in the root
300  * tree used by the super block to find all the other trees
301  */
302 #define BTRFS_ROOT_ITEM_KEY     6
303 /*
304  * extent items are in the extent map tree.  These record which blocks
305  * are used, and how many references there are to each block
306  */
307 #define BTRFS_EXTENT_ITEM_KEY   7
308
309 /*
310  * the inode map records which inode numbers are in use and where
311  * they actually live on disk
312  */
313 #define BTRFS_INODE_MAP_ITEM_KEY 8
314 /*
315  * string items are for debugging.  They just store a short string of
316  * data in the FS
317  */
318 #define BTRFS_STRING_ITEM_KEY   9
319
320 static inline u64 btrfs_inode_generation(struct btrfs_inode_item *i)
321 {
322         return le64_to_cpu(i->generation);
323 }
324
325 static inline void btrfs_set_inode_generation(struct btrfs_inode_item *i,
326                                               u64 val)
327 {
328         i->generation = cpu_to_le64(val);
329 }
330
331 static inline u64 btrfs_inode_size(struct btrfs_inode_item *i)
332 {
333         return le64_to_cpu(i->size);
334 }
335
336 static inline void btrfs_set_inode_size(struct btrfs_inode_item *i, u64 val)
337 {
338         i->size = cpu_to_le64(val);
339 }
340
341 static inline u64 btrfs_inode_nblocks(struct btrfs_inode_item *i)
342 {
343         return le64_to_cpu(i->nblocks);
344 }
345
346 static inline void btrfs_set_inode_nblocks(struct btrfs_inode_item *i, u64 val)
347 {
348         i->nblocks = cpu_to_le64(val);
349 }
350
351 static inline u32 btrfs_inode_nlink(struct btrfs_inode_item *i)
352 {
353         return le32_to_cpu(i->nlink);
354 }
355
356 static inline void btrfs_set_inode_nlink(struct btrfs_inode_item *i, u32 val)
357 {
358         i->nlink = cpu_to_le32(val);
359 }
360
361 static inline u32 btrfs_inode_uid(struct btrfs_inode_item *i)
362 {
363         return le32_to_cpu(i->uid);
364 }
365
366 static inline void btrfs_set_inode_uid(struct btrfs_inode_item *i, u32 val)
367 {
368         i->uid = cpu_to_le32(val);
369 }
370
371 static inline u32 btrfs_inode_gid(struct btrfs_inode_item *i)
372 {
373         return le32_to_cpu(i->gid);
374 }
375
376 static inline void btrfs_set_inode_gid(struct btrfs_inode_item *i, u32 val)
377 {
378         i->gid = cpu_to_le32(val);
379 }
380
381 static inline u32 btrfs_inode_mode(struct btrfs_inode_item *i)
382 {
383         return le32_to_cpu(i->mode);
384 }
385
386 static inline void btrfs_set_inode_mode(struct btrfs_inode_item *i, u32 val)
387 {
388         i->mode = cpu_to_le32(val);
389 }
390
391 static inline u32 btrfs_inode_rdev(struct btrfs_inode_item *i)
392 {
393         return le32_to_cpu(i->rdev);
394 }
395
396 static inline void btrfs_set_inode_rdev(struct btrfs_inode_item *i, u32 val)
397 {
398         i->rdev = cpu_to_le32(val);
399 }
400
401 static inline u16 btrfs_inode_flags(struct btrfs_inode_item *i)
402 {
403         return le16_to_cpu(i->flags);
404 }
405
406 static inline void btrfs_set_inode_flags(struct btrfs_inode_item *i, u16 val)
407 {
408         i->flags = cpu_to_le16(val);
409 }
410
411 static inline u16 btrfs_inode_compat_flags(struct btrfs_inode_item *i)
412 {
413         return le16_to_cpu(i->compat_flags);
414 }
415
416 static inline void btrfs_set_inode_compat_flags(struct btrfs_inode_item *i,
417                                                 u16 val)
418 {
419         i->compat_flags = cpu_to_le16(val);
420 }
421
422 static inline u64 btrfs_timespec_sec(struct btrfs_inode_timespec *ts)
423 {
424         return le64_to_cpu(ts->sec);
425 }
426
427 static inline void btrfs_set_timespec_sec(struct btrfs_inode_timespec *ts,
428                                           u64 val)
429 {
430         ts->sec = cpu_to_le64(val);
431 }
432
433 static inline u32 btrfs_timespec_nsec(struct btrfs_inode_timespec *ts)
434 {
435         return le32_to_cpu(ts->nsec);
436 }
437
438 static inline void btrfs_set_timespec_nsec(struct btrfs_inode_timespec *ts,
439                                           u32 val)
440 {
441         ts->nsec = cpu_to_le32(val);
442 }
443
444 static inline u64 btrfs_extent_owner(struct btrfs_extent_item *ei)
445 {
446         return le64_to_cpu(ei->owner);
447 }
448
449 static inline void btrfs_set_extent_owner(struct btrfs_extent_item *ei, u64 val)
450 {
451         ei->owner = cpu_to_le64(val);
452 }
453
454 static inline u32 btrfs_extent_refs(struct btrfs_extent_item *ei)
455 {
456         return le32_to_cpu(ei->refs);
457 }
458
459 static inline void btrfs_set_extent_refs(struct btrfs_extent_item *ei, u32 val)
460 {
461         ei->refs = cpu_to_le32(val);
462 }
463
464 static inline u64 btrfs_node_blockptr(struct btrfs_node *n, int nr)
465 {
466         return le64_to_cpu(n->ptrs[nr].blockptr);
467 }
468
469 static inline void btrfs_set_node_blockptr(struct btrfs_node *n, int nr,
470                                            u64 val)
471 {
472         n->ptrs[nr].blockptr = cpu_to_le64(val);
473 }
474
475 static inline u32 btrfs_item_offset(struct btrfs_item *item)
476 {
477         return le32_to_cpu(item->offset);
478 }
479
480 static inline void btrfs_set_item_offset(struct btrfs_item *item, u32 val)
481 {
482         item->offset = cpu_to_le32(val);
483 }
484
485 static inline u32 btrfs_item_end(struct btrfs_item *item)
486 {
487         return le32_to_cpu(item->offset) + le16_to_cpu(item->size);
488 }
489
490 static inline u16 btrfs_item_size(struct btrfs_item *item)
491 {
492         return le16_to_cpu(item->size);
493 }
494
495 static inline void btrfs_set_item_size(struct btrfs_item *item, u16 val)
496 {
497         item->size = cpu_to_le16(val);
498 }
499
500 static inline u64 btrfs_dir_objectid(struct btrfs_dir_item *d)
501 {
502         return le64_to_cpu(d->objectid);
503 }
504
505 static inline void btrfs_set_dir_objectid(struct btrfs_dir_item *d, u64 val)
506 {
507         d->objectid = cpu_to_le64(val);
508 }
509
510 static inline u16 btrfs_dir_flags(struct btrfs_dir_item *d)
511 {
512         return le16_to_cpu(d->flags);
513 }
514
515 static inline void btrfs_set_dir_flags(struct btrfs_dir_item *d, u16 val)
516 {
517         d->flags = cpu_to_le16(val);
518 }
519
520 static inline u8 btrfs_dir_type(struct btrfs_dir_item *d)
521 {
522         return d->type;
523 }
524
525 static inline void btrfs_set_dir_type(struct btrfs_dir_item *d, u8 val)
526 {
527         d->type = val;
528 }
529
530 static inline u16 btrfs_dir_name_len(struct btrfs_dir_item *d)
531 {
532         return le16_to_cpu(d->name_len);
533 }
534
535 static inline void btrfs_set_dir_name_len(struct btrfs_dir_item *d, u16 val)
536 {
537         d->name_len = cpu_to_le16(val);
538 }
539
540 static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
541                                          struct btrfs_disk_key *disk)
542 {
543         cpu->offset = le64_to_cpu(disk->offset);
544         cpu->flags = le32_to_cpu(disk->flags);
545         cpu->objectid = le64_to_cpu(disk->objectid);
546 }
547
548 static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
549                                          struct btrfs_key *cpu)
550 {
551         disk->offset = cpu_to_le64(cpu->offset);
552         disk->flags = cpu_to_le32(cpu->flags);
553         disk->objectid = cpu_to_le64(cpu->objectid);
554 }
555
556 static inline u64 btrfs_disk_key_objectid(struct btrfs_disk_key *disk)
557 {
558         return le64_to_cpu(disk->objectid);
559 }
560
561 static inline void btrfs_set_disk_key_objectid(struct btrfs_disk_key *disk,
562                                                u64 val)
563 {
564         disk->objectid = cpu_to_le64(val);
565 }
566
567 static inline u64 btrfs_disk_key_offset(struct btrfs_disk_key *disk)
568 {
569         return le64_to_cpu(disk->offset);
570 }
571
572 static inline void btrfs_set_disk_key_offset(struct btrfs_disk_key *disk,
573                                              u64 val)
574 {
575         disk->offset = cpu_to_le64(val);
576 }
577
578 static inline u32 btrfs_disk_key_flags(struct btrfs_disk_key *disk)
579 {
580         return le32_to_cpu(disk->flags);
581 }
582
583 static inline void btrfs_set_disk_key_flags(struct btrfs_disk_key *disk,
584                                             u32 val)
585 {
586         disk->flags = cpu_to_le32(val);
587 }
588
589 static inline u32 btrfs_key_type(struct btrfs_key *key)
590 {
591         return key->flags & BTRFS_KEY_TYPE_MASK;
592 }
593
594 static inline u32 btrfs_disk_key_type(struct btrfs_disk_key *key)
595 {
596         return le32_to_cpu(key->flags) & BTRFS_KEY_TYPE_MASK;
597 }
598
599 static inline void btrfs_set_key_type(struct btrfs_key *key, u32 type)
600 {
601         BUG_ON(type >= BTRFS_KEY_TYPE_MAX);
602         key->flags = (key->flags & ~((u64)BTRFS_KEY_TYPE_MASK)) | type;
603 }
604
605 static inline void btrfs_set_disk_key_type(struct btrfs_disk_key *key, u32 type)
606 {
607         u32 flags = btrfs_disk_key_flags(key);
608         BUG_ON(type >= BTRFS_KEY_TYPE_MAX);
609         flags = (flags & ~((u64)BTRFS_KEY_TYPE_MASK)) | type;
610         btrfs_set_disk_key_flags(key, flags);
611 }
612
613 static inline u64 btrfs_header_blocknr(struct btrfs_header *h)
614 {
615         return le64_to_cpu(h->blocknr);
616 }
617
618 static inline void btrfs_set_header_blocknr(struct btrfs_header *h, u64 blocknr)
619 {
620         h->blocknr = cpu_to_le64(blocknr);
621 }
622
623 static inline u64 btrfs_header_generation(struct btrfs_header *h)
624 {
625         return le64_to_cpu(h->generation);
626 }
627
628 static inline void btrfs_set_header_generation(struct btrfs_header *h,
629                                                u64 val)
630 {
631         h->generation = cpu_to_le64(val);
632 }
633
634 static inline u64 btrfs_header_parentid(struct btrfs_header *h)
635 {
636         return le64_to_cpu(h->parentid);
637 }
638
639 static inline void btrfs_set_header_parentid(struct btrfs_header *h,
640                                              u64 parentid)
641 {
642         h->parentid = cpu_to_le64(parentid);
643 }
644
645 static inline u16 btrfs_header_nritems(struct btrfs_header *h)
646 {
647         return le16_to_cpu(h->nritems);
648 }
649
650 static inline void btrfs_set_header_nritems(struct btrfs_header *h, u16 val)
651 {
652         h->nritems = cpu_to_le16(val);
653 }
654
655 static inline u16 btrfs_header_flags(struct btrfs_header *h)
656 {
657         return le16_to_cpu(h->flags);
658 }
659
660 static inline void btrfs_set_header_flags(struct btrfs_header *h, u16 val)
661 {
662         h->flags = cpu_to_le16(val);
663 }
664
665 static inline int btrfs_header_level(struct btrfs_header *h)
666 {
667         return h->level;
668 }
669
670 static inline void btrfs_set_header_level(struct btrfs_header *h, int level)
671 {
672         BUG_ON(level > BTRFS_MAX_LEVEL);
673         h->level = level;
674 }
675
676 static inline int btrfs_is_leaf(struct btrfs_node *n)
677 {
678         return (btrfs_header_level(&n->header) == 0);
679 }
680
681 static inline u64 btrfs_root_blocknr(struct btrfs_root_item *item)
682 {
683         return le64_to_cpu(item->blocknr);
684 }
685
686 static inline void btrfs_set_root_blocknr(struct btrfs_root_item *item, u64 val)
687 {
688         item->blocknr = cpu_to_le64(val);
689 }
690
691 static inline u32 btrfs_root_refs(struct btrfs_root_item *item)
692 {
693         return le32_to_cpu(item->refs);
694 }
695
696 static inline void btrfs_set_root_refs(struct btrfs_root_item *item, u32 val)
697 {
698         item->refs = cpu_to_le32(val);
699 }
700
701 static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s)
702 {
703         return le64_to_cpu(s->blocknr);
704 }
705
706 static inline void btrfs_set_super_blocknr(struct btrfs_super_block *s, u64 val)
707 {
708         s->blocknr = cpu_to_le64(val);
709 }
710
711 static inline u64 btrfs_super_root(struct btrfs_super_block *s)
712 {
713         return le64_to_cpu(s->root);
714 }
715
716 static inline void btrfs_set_super_root(struct btrfs_super_block *s, u64 val)
717 {
718         s->root = cpu_to_le64(val);
719 }
720
721 static inline u64 btrfs_super_total_blocks(struct btrfs_super_block *s)
722 {
723         return le64_to_cpu(s->total_blocks);
724 }
725
726 static inline void btrfs_set_super_total_blocks(struct btrfs_super_block *s,
727                                                 u64 val)
728 {
729         s->total_blocks = cpu_to_le64(val);
730 }
731
732 static inline u64 btrfs_super_blocks_used(struct btrfs_super_block *s)
733 {
734         return le64_to_cpu(s->blocks_used);
735 }
736
737 static inline void btrfs_set_super_blocks_used(struct btrfs_super_block *s,
738                                                 u64 val)
739 {
740         s->blocks_used = cpu_to_le64(val);
741 }
742
743 static inline u32 btrfs_super_blocksize(struct btrfs_super_block *s)
744 {
745         return le32_to_cpu(s->blocksize);
746 }
747
748 static inline void btrfs_set_super_blocksize(struct btrfs_super_block *s,
749                                                 u32 val)
750 {
751         s->blocksize = cpu_to_le32(val);
752 }
753
754 static inline u64 btrfs_super_root_dir(struct btrfs_super_block *s)
755 {
756         return le64_to_cpu(s->root_dir_objectid);
757 }
758
759 static inline void btrfs_set_super_root_dir(struct btrfs_super_block *s, u64
760                                             val)
761 {
762         s->root_dir_objectid = cpu_to_le64(val);
763 }
764
765 static inline u8 *btrfs_leaf_data(struct btrfs_leaf *l)
766 {
767         return (u8 *)l->items;
768 }
769
770 static inline u64 btrfs_file_extent_disk_blocknr(struct btrfs_file_extent_item
771                                                  *e)
772 {
773         return le64_to_cpu(e->disk_blocknr);
774 }
775
776 static inline void btrfs_set_file_extent_disk_blocknr(struct
777                                                       btrfs_file_extent_item
778                                                       *e, u64 val)
779 {
780         e->disk_blocknr = cpu_to_le64(val);
781 }
782
783 static inline u64 btrfs_file_extent_generation(struct btrfs_file_extent_item *e)
784 {
785         return le64_to_cpu(e->generation);
786 }
787
788 static inline void btrfs_set_file_extent_generation(struct
789                                                     btrfs_file_extent_item *e,
790                                                     u64 val)
791 {
792         e->generation = cpu_to_le64(val);
793 }
794
795 static inline u64 btrfs_file_extent_disk_num_blocks(struct
796                                                     btrfs_file_extent_item *e)
797 {
798         return le64_to_cpu(e->disk_num_blocks);
799 }
800
801 static inline void btrfs_set_file_extent_disk_num_blocks(struct
802                                                          btrfs_file_extent_item
803                                                          *e, u64 val)
804 {
805         e->disk_num_blocks = cpu_to_le64(val);
806 }
807
808 static inline u64 btrfs_file_extent_offset(struct btrfs_file_extent_item *e)
809 {
810         return le64_to_cpu(e->offset);
811 }
812
813 static inline void btrfs_set_file_extent_offset(struct btrfs_file_extent_item
814                                                 *e, u64 val)
815 {
816         e->offset = cpu_to_le64(val);
817 }
818
819 static inline u64 btrfs_file_extent_num_blocks(struct btrfs_file_extent_item
820                                                *e)
821 {
822         return le64_to_cpu(e->num_blocks);
823 }
824
825 static inline void btrfs_set_file_extent_num_blocks(struct
826                                                     btrfs_file_extent_item *e,
827                                                     u64 val)
828 {
829         e->num_blocks = cpu_to_le64(val);
830 }
831
832 static inline struct btrfs_root *btrfs_sb(struct super_block *sb)
833 {
834         return sb->s_fs_info;
835 }
836
837 /* helper function to cast into the data area of the leaf. */
838 #define btrfs_item_ptr(leaf, slot, type) \
839         ((type *)(btrfs_leaf_data(leaf) + \
840         btrfs_item_offset((leaf)->items + (slot))))
841
842 /* extent-item.c */
843 struct buffer_head *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
844                                             struct btrfs_root *root);
845 int btrfs_alloc_extent(struct btrfs_trans_handle *trans, struct btrfs_root
846                         *root, u64 num_blocks, u64 search_start, u64
847                         search_end, u64 owner, struct btrfs_key *ins);
848 int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
849                   struct buffer_head *buf);
850 int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
851                       *root, u64 blocknr, u64 num_blocks, int pin);
852 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
853                                btrfs_root *root);
854 /* ctree.c */
855 int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
856                       *root, struct btrfs_key *key, struct btrfs_path *p, int
857                       ins_len, int cow);
858 void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p);
859 void btrfs_init_path(struct btrfs_path *p);
860 int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
861                    struct btrfs_path *path);
862 int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root
863                       *root, struct btrfs_key *key, void *data, u32 data_size);
864 int btrfs_insert_empty_item(struct btrfs_trans_handle *trans, struct btrfs_root
865                             *root, struct btrfs_path *path, struct btrfs_key
866                             *cpu_key, u32 data_size);
867 int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);
868 int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf);
869 int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root
870                         *root, struct buffer_head *snap);
871 /* root-item.c */
872 int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
873                    struct btrfs_key *key);
874 int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root
875                       *root, struct btrfs_key *key, struct btrfs_root_item
876                       *item);
877 int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
878                       *root, struct btrfs_key *key, struct btrfs_root_item
879                       *item);
880 int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, struct
881                          btrfs_root_item *item, struct btrfs_key *key);
882 /* dir-item.c */
883 int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
884                           *root, const char *name, int name_len, u64 dir, u64
885                           objectid, u8 type);
886 int btrfs_lookup_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
887                           *root, struct btrfs_path *path, u64 dir,
888                           const char *name, int name_len, int mod);
889 int btrfs_match_dir_item_name(struct btrfs_root *root, struct btrfs_path *path,
890                               const char *name, int name_len);
891 /* inode-map.c */
892 int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
893                              struct btrfs_root *fs_root,
894                              u64 dirid, u64 *objectid);
895 int btrfs_insert_inode_map(struct btrfs_trans_handle *trans,
896                            struct btrfs_root *root,
897                            u64 objectid, struct btrfs_key *location);
898 int btrfs_lookup_inode_map(struct btrfs_trans_handle *trans,
899                            struct btrfs_root *root, struct btrfs_path *path,
900                            u64 objectid, int mod);
901 /* inode-item.c */
902 int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root
903                        *root, u64 objectid, struct btrfs_inode_item
904                        *inode_item);
905 int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root
906                        *root, struct btrfs_path *path, u64 objectid, int mod);
907
908 /* file-item.c */
909 int btrfs_alloc_file_extent(struct btrfs_trans_handle *trans,
910                                struct btrfs_root *root,
911                                u64 objectid, u64 offset,
912                                u64 num_blocks, u64 hint_block,
913                                u64 *result);
914 int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
915                              struct btrfs_root *root,
916                              struct btrfs_path *path, u64 objectid,
917                              u64 blocknr, int mod);
918 int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
919                           struct btrfs_root *root,
920                           u64 objectid, u64 offset,
921                           char *data, size_t len);
922 int btrfs_csum_verify_file_block(struct btrfs_root *root,
923                                  u64 objectid, u64 offset,
924                                  char *data, size_t len);
925 #endif