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