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