Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Btrfs: Create extent_buffer interface for large blocksizes

Signed-off-by: Chris Mason <chris.mason@oracle.com>

+2814 -2108
+2
fs/btrfs/Makefile
··· 23 23 clean: 24 24 $(MAKE) -C $(KERNELDIR) M=`pwd` clean 25 25 26 + tester: 27 + $(MAKE) -C $(KERNELDIR) M=`pwd` tree-defrag.o transaction.o sysfs.o super.o root-tree.o inode-map.o inode-item.o inode.o file-item.o file.o extent_map.o disk-io.o ctree.o dir-item.o extent-tree.o 26 28 endif
+825 -675
fs/btrfs/ctree.c
··· 16 16 * Boston, MA 021110-1307, USA. 17 17 */ 18 18 19 + #include <linux/highmem.h> 19 20 #include "ctree.h" 20 21 #include "disk-io.h" 21 22 #include "transaction.h" 23 + #include "print-tree.h" 22 24 23 25 static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root 24 26 *root, struct btrfs_path *path, int level); 25 27 static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root 26 28 *root, struct btrfs_key *ins_key, 27 29 struct btrfs_path *path, int data_size); 28 - static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root 29 - *root, struct buffer_head *dst, struct buffer_head 30 - *src); 31 - static int balance_node_right(struct btrfs_trans_handle *trans, struct 32 - btrfs_root *root, struct buffer_head *dst_buf, 33 - struct buffer_head *src_buf); 30 + static int push_node_left(struct btrfs_trans_handle *trans, 31 + struct btrfs_root *root, struct extent_buffer *dst, 32 + struct extent_buffer *src); 33 + static int balance_node_right(struct btrfs_trans_handle *trans, 34 + struct btrfs_root *root, 35 + struct extent_buffer *dst_buf, 36 + struct extent_buffer *src_buf); 34 37 static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, 35 38 struct btrfs_path *path, int level, int slot); 36 39 ··· 65 62 for (i = 0; i < BTRFS_MAX_LEVEL; i++) { 66 63 if (!p->nodes[i]) 67 64 break; 68 - btrfs_block_release(root, p->nodes[i]); 65 + free_extent_buffer(p->nodes[i]); 69 66 } 70 67 memset(p, 0, sizeof(*p)); 71 68 } 72 69 73 - static int __btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root 74 - *root, struct buffer_head *buf, struct buffer_head 75 - *parent, int parent_slot, struct buffer_head 76 - **cow_ret, u64 search_start, u64 empty_size) 70 + static int __btrfs_cow_block(struct btrfs_trans_handle *trans, 71 + struct btrfs_root *root, 72 + struct extent_buffer *buf, 73 + struct extent_buffer *parent, int parent_slot, 74 + struct extent_buffer **cow_ret, 75 + u64 search_start, u64 empty_size) 77 76 { 78 - struct buffer_head *cow; 79 - struct btrfs_node *cow_node; 77 + struct extent_buffer *cow; 80 78 int ret = 0; 81 79 int different_trans = 0; 82 80 83 81 WARN_ON(root->ref_cows && trans->transid != root->last_trans); 84 - WARN_ON(!buffer_uptodate(buf)); 82 + 85 83 cow = btrfs_alloc_free_block(trans, root, search_start, empty_size); 86 84 if (IS_ERR(cow)) 87 85 return PTR_ERR(cow); 88 86 89 - cow_node = btrfs_buffer_node(cow); 90 - if (buf->b_size != root->blocksize || cow->b_size != root->blocksize) 87 + if (buf->len != root->sectorsize || cow->len != root->sectorsize) 91 88 WARN_ON(1); 92 89 93 - memcpy(cow_node, btrfs_buffer_node(buf), root->blocksize); 94 - btrfs_set_header_blocknr(&cow_node->header, bh_blocknr(cow)); 95 - btrfs_set_header_generation(&cow_node->header, trans->transid); 96 - btrfs_set_header_owner(&cow_node->header, root->root_key.objectid); 90 + copy_extent_buffer(cow, buf, 0, 0, cow->len); 91 + btrfs_set_header_blocknr(cow, extent_buffer_blocknr(cow)); 92 + btrfs_set_header_generation(cow, trans->transid); 93 + btrfs_set_header_owner(cow, root->root_key.objectid); 97 94 98 - WARN_ON(btrfs_header_generation(btrfs_buffer_header(buf)) > 99 - trans->transid); 100 - if (btrfs_header_generation(btrfs_buffer_header(buf)) != 101 - trans->transid) { 95 + WARN_ON(btrfs_header_generation(buf) > trans->transid); 96 + if (btrfs_header_generation(buf) != trans->transid) { 102 97 different_trans = 1; 103 98 ret = btrfs_inc_ref(trans, root, buf); 104 99 if (ret) ··· 107 106 108 107 if (buf == root->node) { 109 108 root->node = cow; 110 - get_bh(cow); 109 + extent_buffer_get(cow); 111 110 if (buf != root->commit_root) { 112 - btrfs_free_extent(trans, root, bh_blocknr(buf), 1, 1); 111 + btrfs_free_extent(trans, root, 112 + extent_buffer_blocknr(buf), 1, 1); 113 113 } 114 - btrfs_block_release(root, buf); 114 + free_extent_buffer(buf); 115 115 } else { 116 - btrfs_set_node_blockptr(btrfs_buffer_node(parent), parent_slot, 117 - bh_blocknr(cow)); 116 + btrfs_set_node_blockptr(parent, parent_slot, 117 + extent_buffer_blocknr(cow)); 118 118 btrfs_mark_buffer_dirty(parent); 119 - WARN_ON(btrfs_header_generation(btrfs_buffer_header(parent)) != 120 - trans->transid); 121 - btrfs_free_extent(trans, root, bh_blocknr(buf), 1, 1); 119 + WARN_ON(btrfs_header_generation(parent) != trans->transid); 120 + btrfs_free_extent(trans, root, extent_buffer_blocknr(buf),1,1); 122 121 } 123 - btrfs_block_release(root, buf); 122 + free_extent_buffer(buf); 124 123 btrfs_mark_buffer_dirty(cow); 125 124 *cow_ret = cow; 126 125 return 0; 127 126 } 128 127 129 - int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root 130 - *root, struct buffer_head *buf, struct buffer_head 131 - *parent, int parent_slot, struct buffer_head 132 - **cow_ret) 128 + int btrfs_cow_block(struct btrfs_trans_handle *trans, 129 + struct btrfs_root *root, struct extent_buffer *buf, 130 + struct extent_buffer *parent, int parent_slot, 131 + struct extent_buffer **cow_ret) 133 132 { 134 133 u64 search_start; 135 134 if (trans->transaction != root->fs_info->running_transaction) { ··· 142 141 root->fs_info->generation); 143 142 WARN_ON(1); 144 143 } 145 - if (btrfs_header_generation(btrfs_buffer_header(buf)) == 146 - trans->transid) { 144 + if (btrfs_header_generation(buf) == trans->transid) { 147 145 *cow_ret = buf; 148 146 return 0; 149 147 } 150 148 151 - search_start = bh_blocknr(buf) & ~((u64)65535); 149 + search_start = extent_buffer_blocknr(buf) & ~((u64)65535); 152 150 return __btrfs_cow_block(trans, root, buf, parent, 153 151 parent_slot, cow_ret, search_start, 0); 154 152 } ··· 161 161 return 0; 162 162 } 163 163 164 - static int should_defrag_leaf(struct buffer_head *bh) 164 + #if 0 165 + static int should_defrag_leaf(struct extent_buffer *eb) 165 166 { 166 - struct btrfs_leaf *leaf = btrfs_buffer_leaf(bh); 167 + return 0; 168 + struct btrfs_leaf *leaf = btrfs_buffer_leaf(eb); 167 169 struct btrfs_disk_key *key; 168 170 u32 nritems; 169 171 ··· 190 188 } 191 189 return 0; 192 190 } 191 + #endif 193 192 194 193 int btrfs_realloc_node(struct btrfs_trans_handle *trans, 195 - struct btrfs_root *root, struct buffer_head *parent, 194 + struct btrfs_root *root, struct extent_buffer *parent, 196 195 int cache_only, u64 *last_ret) 197 196 { 197 + return 0; 198 + #if 0 198 199 struct btrfs_node *parent_node; 199 - struct buffer_head *cur_bh; 200 - struct buffer_head *tmp_bh; 200 + struct extent_buffer *cur_eb; 201 + struct extent_buffer *tmp_eb; 201 202 u64 blocknr; 202 203 u64 search_start = *last_ret; 203 204 u64 last_block = 0; ··· 286 281 brelse(tmp_bh); 287 282 } 288 283 return err; 284 + #endif 289 285 } 290 286 291 287 /* ··· 295 289 * which is the stop of the leaf data stack 296 290 */ 297 291 static inline unsigned int leaf_data_end(struct btrfs_root *root, 298 - struct btrfs_leaf *leaf) 292 + struct extent_buffer *leaf) 299 293 { 300 - u32 nr = btrfs_header_nritems(&leaf->header); 294 + u32 nr = btrfs_header_nritems(leaf); 301 295 if (nr == 0) 302 296 return BTRFS_LEAF_DATA_SIZE(root); 303 - return btrfs_item_offset(leaf->items + nr - 1); 297 + return btrfs_item_offset_nr(leaf, nr - 1); 304 298 } 305 299 306 300 /* ··· 316 310 return 1; 317 311 if (k1.objectid < k2->objectid) 318 312 return -1; 319 - if (k1.flags > k2->flags) 313 + if (k1.type > k2->type) 320 314 return 1; 321 - if (k1.flags < k2->flags) 315 + if (k1.type < k2->type) 322 316 return -1; 323 317 if (k1.offset > k2->offset) 324 318 return 1; ··· 330 324 static int check_node(struct btrfs_root *root, struct btrfs_path *path, 331 325 int level) 332 326 { 333 - struct btrfs_node *parent = NULL; 334 - struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]); 327 + struct extent_buffer *parent = NULL; 328 + struct extent_buffer *node = path->nodes[level]; 329 + struct btrfs_disk_key parent_key; 330 + struct btrfs_disk_key node_key; 335 331 int parent_slot; 336 332 int slot; 337 333 struct btrfs_key cpukey; 338 - u32 nritems = btrfs_header_nritems(&node->header); 334 + u32 nritems = btrfs_header_nritems(node); 339 335 340 336 if (path->nodes[level + 1]) 341 - parent = btrfs_buffer_node(path->nodes[level + 1]); 337 + parent = path->nodes[level + 1]; 342 338 343 339 slot = path->slots[level]; 344 - BUG_ON(!buffer_uptodate(path->nodes[level])); 345 340 BUG_ON(nritems == 0); 346 341 if (parent) { 347 - struct btrfs_disk_key *parent_key; 348 - 349 342 parent_slot = path->slots[level + 1]; 350 - parent_key = &parent->ptrs[parent_slot].key; 351 - BUG_ON(memcmp(parent_key, &node->ptrs[0].key, 343 + btrfs_node_key(parent, &parent_key, parent_slot); 344 + btrfs_node_key(node, &node_key, 0); 345 + BUG_ON(memcmp(&parent_key, &node_key, 352 346 sizeof(struct btrfs_disk_key))); 353 347 BUG_ON(btrfs_node_blockptr(parent, parent_slot) != 354 - btrfs_header_blocknr(&node->header)); 348 + btrfs_header_blocknr(node)); 355 349 } 356 350 BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root)); 357 351 if (slot != 0) { 358 - btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot - 1].key); 359 - BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) <= 0); 352 + btrfs_node_key_to_cpu(node, &cpukey, slot - 1); 353 + btrfs_node_key(node, &node_key, slot); 354 + BUG_ON(comp_keys(&node_key, &cpukey) <= 0); 360 355 } 361 356 if (slot < nritems - 1) { 362 - btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot + 1].key); 363 - BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) >= 0); 357 + btrfs_node_key_to_cpu(node, &cpukey, slot + 1); 358 + btrfs_node_key(node, &node_key, slot); 359 + BUG_ON(comp_keys(&node_key, &cpukey) >= 0); 364 360 } 365 361 return 0; 366 362 } ··· 370 362 static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, 371 363 int level) 372 364 { 373 - struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[level]); 374 - struct btrfs_node *parent = NULL; 365 + struct extent_buffer *leaf = path->nodes[level]; 366 + struct extent_buffer *parent = NULL; 375 367 int parent_slot; 376 - int slot = path->slots[0]; 377 368 struct btrfs_key cpukey; 369 + struct btrfs_disk_key parent_key; 370 + struct btrfs_disk_key leaf_key; 371 + int slot = path->slots[0]; 378 372 379 - u32 nritems = btrfs_header_nritems(&leaf->header); 373 + u32 nritems = btrfs_header_nritems(leaf); 380 374 381 375 if (path->nodes[level + 1]) 382 - parent = btrfs_buffer_node(path->nodes[level + 1]); 383 - 384 - BUG_ON(btrfs_leaf_free_space(root, leaf) < 0); 376 + parent = path->nodes[level + 1]; 385 377 386 378 if (nritems == 0) 387 379 return 0; 388 380 389 381 if (parent) { 390 - struct btrfs_disk_key *parent_key; 391 - 392 382 parent_slot = path->slots[level + 1]; 393 - parent_key = &parent->ptrs[parent_slot].key; 383 + btrfs_node_key(parent, &parent_key, parent_slot); 384 + btrfs_item_key(leaf, &leaf_key, 0); 394 385 395 - BUG_ON(memcmp(parent_key, &leaf->items[0].key, 386 + BUG_ON(memcmp(&parent_key, &leaf_key, 396 387 sizeof(struct btrfs_disk_key))); 397 388 BUG_ON(btrfs_node_blockptr(parent, parent_slot) != 398 - btrfs_header_blocknr(&leaf->header)); 389 + btrfs_header_blocknr(leaf)); 399 390 } 400 - if (slot != 0) { 401 - btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot - 1].key); 402 - BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) <= 0); 403 - BUG_ON(btrfs_item_offset(leaf->items + slot - 1) != 404 - btrfs_item_end(leaf->items + slot)); 391 + #if 0 392 + for (i = 0; nritems > 1 && i < nritems - 2; i++) { 393 + btrfs_item_key_to_cpu(leaf, &cpukey, i + 1); 394 + btrfs_item_key(leaf, &leaf_key, i); 395 + if (comp_keys(&leaf_key, &cpukey) >= 0) { 396 + btrfs_print_leaf(root, leaf); 397 + printk("slot %d offset bad key\n", i); 398 + BUG_ON(1); 399 + } 400 + if (btrfs_item_offset_nr(leaf, i) != 401 + btrfs_item_end_nr(leaf, i + 1)) { 402 + btrfs_print_leaf(root, leaf); 403 + printk("slot %d offset bad\n", i); 404 + BUG_ON(1); 405 + } 406 + if (i == 0) { 407 + if (btrfs_item_offset_nr(leaf, i) + 408 + btrfs_item_size_nr(leaf, i) != 409 + BTRFS_LEAF_DATA_SIZE(root)) { 410 + btrfs_print_leaf(root, leaf); 411 + printk("slot %d first offset bad\n", i); 412 + BUG_ON(1); 413 + } 414 + } 415 + } 416 + if (nritems > 0) { 417 + if (btrfs_item_size_nr(leaf, nritems - 1) > 4096) { 418 + btrfs_print_leaf(root, leaf); 419 + printk("slot %d bad size \n", nritems - 1); 420 + BUG_ON(1); 421 + } 422 + } 423 + #endif 424 + if (slot != 0 && slot < nritems - 1) { 425 + btrfs_item_key(leaf, &leaf_key, slot); 426 + btrfs_item_key_to_cpu(leaf, &cpukey, slot - 1); 427 + if (comp_keys(&leaf_key, &cpukey) <= 0) { 428 + btrfs_print_leaf(root, leaf); 429 + printk("slot %d offset bad key\n", slot); 430 + BUG_ON(1); 431 + } 432 + if (btrfs_item_offset_nr(leaf, slot - 1) != 433 + btrfs_item_end_nr(leaf, slot)) { 434 + btrfs_print_leaf(root, leaf); 435 + printk("slot %d offset bad\n", slot); 436 + BUG_ON(1); 437 + } 405 438 } 406 439 if (slot < nritems - 1) { 407 - btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot + 1].key); 408 - BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) >= 0); 409 - BUG_ON(btrfs_item_offset(leaf->items + slot) != 410 - btrfs_item_end(leaf->items + slot + 1)); 440 + btrfs_item_key(leaf, &leaf_key, slot); 441 + btrfs_item_key_to_cpu(leaf, &cpukey, slot + 1); 442 + BUG_ON(comp_keys(&leaf_key, &cpukey) >= 0); 443 + if (btrfs_item_offset_nr(leaf, slot) != 444 + btrfs_item_end_nr(leaf, slot + 1)) { 445 + btrfs_print_leaf(root, leaf); 446 + printk("slot %d offset bad\n", slot); 447 + BUG_ON(1); 448 + } 411 449 } 412 - BUG_ON(btrfs_item_offset(leaf->items) + 413 - btrfs_item_size(leaf->items) != BTRFS_LEAF_DATA_SIZE(root)); 450 + BUG_ON(btrfs_item_offset_nr(leaf, 0) + 451 + btrfs_item_size_nr(leaf, 0) != BTRFS_LEAF_DATA_SIZE(root)); 414 452 return 0; 415 453 } 416 454 417 455 static int check_block(struct btrfs_root *root, struct btrfs_path *path, 418 456 int level) 419 457 { 420 - struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]); 421 - if (memcmp(node->header.fsid, root->fs_info->disk_super->fsid, 422 - sizeof(node->header.fsid))) 423 - BUG(); 458 + struct extent_buffer *buf = path->nodes[level]; 459 + char fsid[BTRFS_FSID_SIZE]; 460 + 461 + read_extent_buffer(buf, fsid, (unsigned long)btrfs_header_fsid(buf), 462 + BTRFS_FSID_SIZE); 463 + 464 + if (memcmp(fsid, root->fs_info->fsid, BTRFS_FSID_SIZE)) { 465 + int i = 0; 466 + printk("warning bad block %Lu\n", buf->start); 467 + if (!btrfs_buffer_uptodate(buf)) { 468 + WARN_ON(1); 469 + } 470 + for (i = 0; i < BTRFS_FSID_SIZE; i++) { 471 + printk("%x:%x ", root->fs_info->fsid[i], fsid[i]); 472 + } 473 + printk("\n"); 474 + // BUG(); 475 + } 424 476 if (level == 0) 425 477 return check_leaf(root, path, level); 426 478 return check_node(root, path, level); 427 479 } 428 480 429 481 /* 430 - * search for key in the array p. items p are item_size apart 431 - * and there are 'max' items in p 482 + * search for key in the extent_buffer. The items start at offset p, 483 + * and they are item_size apart. There are 'max' items in p. 484 + * 432 485 * the slot in the array is returned via slot, and it points to 433 486 * the place where you would insert key if it is not found in 434 487 * the array. 435 488 * 436 489 * slot may point to max if the key is bigger than all of the keys 437 490 */ 438 - static int generic_bin_search(char *p, int item_size, struct btrfs_key *key, 439 - int max, int *slot) 491 + static int generic_bin_search(struct extent_buffer *eb, unsigned long p, 492 + int item_size, struct btrfs_key *key, 493 + int max, int *slot) 440 494 { 441 495 int low = 0; 442 496 int high = max; 443 497 int mid; 444 498 int ret; 445 499 struct btrfs_disk_key *tmp; 500 + struct btrfs_disk_key unaligned; 501 + unsigned long offset; 502 + char *map_token = NULL; 503 + char *kaddr = NULL; 504 + unsigned long map_start = 0; 505 + unsigned long map_len = 0; 446 506 447 507 while(low < high) { 448 508 mid = (low + high) / 2; 449 - tmp = (struct btrfs_disk_key *)(p + mid * item_size); 509 + offset = p + mid * item_size; 510 + 511 + if (!map_token || offset < map_start || 512 + (offset + sizeof(struct btrfs_disk_key)) > 513 + map_start + map_len) { 514 + if (map_token) 515 + unmap_extent_buffer(eb, map_token, KM_USER0); 516 + map_extent_buffer(eb, offset, &map_token, &kaddr, 517 + &map_start, &map_len, KM_USER0); 518 + 519 + } 520 + if (offset + sizeof(struct btrfs_disk_key) > 521 + map_start + map_len) { 522 + unmap_extent_buffer(eb, map_token, KM_USER0); 523 + read_extent_buffer(eb, &unaligned, 524 + offset, sizeof(unaligned)); 525 + map_token = NULL; 526 + tmp = &unaligned; 527 + } else { 528 + tmp = (struct btrfs_disk_key *)(kaddr + offset - 529 + map_start); 530 + } 450 531 ret = comp_keys(tmp, key); 451 532 452 533 if (ret < 0) ··· 544 447 high = mid; 545 448 else { 546 449 *slot = mid; 450 + unmap_extent_buffer(eb, map_token, KM_USER0); 547 451 return 0; 548 452 } 549 453 } 550 454 *slot = low; 455 + if (map_token) 456 + unmap_extent_buffer(eb, map_token, KM_USER0); 551 457 return 1; 552 458 } 553 459 ··· 558 458 * simple bin_search frontend that does the right thing for 559 459 * leaves vs nodes 560 460 */ 561 - static int bin_search(struct btrfs_node *c, struct btrfs_key *key, int *slot) 461 + static int bin_search(struct extent_buffer *eb, struct btrfs_key *key, 462 + int level, int *slot) 562 463 { 563 - if (btrfs_is_leaf(c)) { 564 - struct btrfs_leaf *l = (struct btrfs_leaf *)c; 565 - return generic_bin_search((void *)l->items, 464 + if (level == 0) { 465 + return generic_bin_search(eb, 466 + offsetof(struct btrfs_leaf, items), 566 467 sizeof(struct btrfs_item), 567 - key, btrfs_header_nritems(&c->header), 468 + key, btrfs_header_nritems(eb), 568 469 slot); 569 470 } else { 570 - return generic_bin_search((void *)c->ptrs, 471 + return generic_bin_search(eb, 472 + offsetof(struct btrfs_node, ptrs), 571 473 sizeof(struct btrfs_key_ptr), 572 - key, btrfs_header_nritems(&c->header), 474 + key, btrfs_header_nritems(eb), 573 475 slot); 574 476 } 575 477 return -1; 576 478 } 577 479 578 - static struct buffer_head *read_node_slot(struct btrfs_root *root, 579 - struct buffer_head *parent_buf, 580 - int slot) 480 + static struct extent_buffer *read_node_slot(struct btrfs_root *root, 481 + struct extent_buffer *parent, int slot) 581 482 { 582 - struct btrfs_node *node = btrfs_buffer_node(parent_buf); 583 483 if (slot < 0) 584 484 return NULL; 585 - if (slot >= btrfs_header_nritems(&node->header)) 485 + if (slot >= btrfs_header_nritems(parent)) 586 486 return NULL; 587 - return read_tree_block(root, btrfs_node_blockptr(node, slot)); 487 + return read_tree_block(root, btrfs_node_blockptr(parent, slot)); 588 488 } 589 489 590 490 static int balance_level(struct btrfs_trans_handle *trans, struct btrfs_root 591 491 *root, struct btrfs_path *path, int level) 592 492 { 593 - struct buffer_head *right_buf; 594 - struct buffer_head *mid_buf; 595 - struct buffer_head *left_buf; 596 - struct buffer_head *parent_buf = NULL; 597 - struct btrfs_node *right = NULL; 598 - struct btrfs_node *mid; 599 - struct btrfs_node *left = NULL; 600 - struct btrfs_node *parent = NULL; 493 + struct extent_buffer *right = NULL; 494 + struct extent_buffer *mid; 495 + struct extent_buffer *left = NULL; 496 + struct extent_buffer *parent = NULL; 601 497 int ret = 0; 602 498 int wret; 603 499 int pslot; ··· 604 508 if (level == 0) 605 509 return 0; 606 510 607 - mid_buf = path->nodes[level]; 608 - mid = btrfs_buffer_node(mid_buf); 511 + mid = path->nodes[level]; 609 512 orig_ptr = btrfs_node_blockptr(mid, orig_slot); 610 513 611 514 if (level < BTRFS_MAX_LEVEL - 1) 612 - parent_buf = path->nodes[level + 1]; 515 + parent = path->nodes[level + 1]; 613 516 pslot = path->slots[level + 1]; 614 517 615 518 /* 616 519 * deal with the case where there is only one pointer in the root 617 520 * by promoting the node below to a root 618 521 */ 619 - if (!parent_buf) { 620 - struct buffer_head *child; 621 - u64 blocknr = bh_blocknr(mid_buf); 522 + if (!parent) { 523 + struct extent_buffer *child; 524 + u64 blocknr = extent_buffer_blocknr(mid); 622 525 623 - if (btrfs_header_nritems(&mid->header) != 1) 526 + if (btrfs_header_nritems(mid) != 1) 624 527 return 0; 625 528 626 529 /* promote the child to a root */ 627 - child = read_node_slot(root, mid_buf, 0); 530 + child = read_node_slot(root, mid, 0); 628 531 BUG_ON(!child); 629 532 root->node = child; 630 533 path->nodes[level] = NULL; 631 - clean_tree_block(trans, root, mid_buf); 632 - wait_on_buffer(mid_buf); 534 + clean_tree_block(trans, root, mid); 535 + wait_on_tree_block_writeback(root, mid); 633 536 /* once for the path */ 634 - btrfs_block_release(root, mid_buf); 537 + free_extent_buffer(mid); 635 538 /* once for the root ptr */ 636 - btrfs_block_release(root, mid_buf); 539 + free_extent_buffer(mid); 637 540 return btrfs_free_extent(trans, root, blocknr, 1, 1); 638 541 } 639 - parent = btrfs_buffer_node(parent_buf); 640 - 641 - if (btrfs_header_nritems(&mid->header) > 542 + if (btrfs_header_nritems(mid) > 642 543 BTRFS_NODEPTRS_PER_BLOCK(root) / 4) 643 544 return 0; 644 545 645 - if (btrfs_header_nritems(&mid->header) < 2) 546 + if (btrfs_header_nritems(mid) < 2) 646 547 err_on_enospc = 1; 647 548 648 - left_buf = read_node_slot(root, parent_buf, pslot - 1); 649 - if (left_buf) { 650 - wret = btrfs_cow_block(trans, root, left_buf, 651 - parent_buf, pslot - 1, &left_buf); 549 + left = read_node_slot(root, parent, pslot - 1); 550 + if (left) { 551 + wret = btrfs_cow_block(trans, root, left, 552 + parent, pslot - 1, &left); 652 553 if (wret) { 653 554 ret = wret; 654 555 goto enospc; 655 556 } 656 557 } 657 - right_buf = read_node_slot(root, parent_buf, pslot + 1); 658 - if (right_buf) { 659 - wret = btrfs_cow_block(trans, root, right_buf, 660 - parent_buf, pslot + 1, &right_buf); 558 + right = read_node_slot(root, parent, pslot + 1); 559 + if (right) { 560 + wret = btrfs_cow_block(trans, root, right, 561 + parent, pslot + 1, &right); 661 562 if (wret) { 662 563 ret = wret; 663 564 goto enospc; ··· 662 569 } 663 570 664 571 /* first, try to make some room in the middle buffer */ 665 - if (left_buf) { 666 - left = btrfs_buffer_node(left_buf); 667 - orig_slot += btrfs_header_nritems(&left->header); 668 - wret = push_node_left(trans, root, left_buf, mid_buf); 572 + if (left) { 573 + orig_slot += btrfs_header_nritems(left); 574 + wret = push_node_left(trans, root, left, mid); 669 575 if (wret < 0) 670 576 ret = wret; 671 - if (btrfs_header_nritems(&mid->header) < 2) 577 + if (btrfs_header_nritems(mid) < 2) 672 578 err_on_enospc = 1; 673 579 } 674 580 675 581 /* 676 582 * then try to empty the right most buffer into the middle 677 583 */ 678 - if (right_buf) { 679 - right = btrfs_buffer_node(right_buf); 680 - wret = push_node_left(trans, root, mid_buf, right_buf); 584 + if (right) { 585 + wret = push_node_left(trans, root, mid, right); 681 586 if (wret < 0 && wret != -ENOSPC) 682 587 ret = wret; 683 - if (btrfs_header_nritems(&right->header) == 0) { 684 - u64 blocknr = bh_blocknr(right_buf); 685 - clean_tree_block(trans, root, right_buf); 686 - wait_on_buffer(right_buf); 687 - btrfs_block_release(root, right_buf); 688 - right_buf = NULL; 588 + if (btrfs_header_nritems(right) == 0) { 589 + u64 blocknr = extent_buffer_blocknr(right); 590 + clean_tree_block(trans, root, right); 591 + wait_on_tree_block_writeback(root, right); 592 + free_extent_buffer(right); 689 593 right = NULL; 690 594 wret = del_ptr(trans, root, path, level + 1, pslot + 691 595 1); ··· 692 602 if (wret) 693 603 ret = wret; 694 604 } else { 695 - btrfs_memcpy(root, parent, 696 - &parent->ptrs[pslot + 1].key, 697 - &right->ptrs[0].key, 698 - sizeof(struct btrfs_disk_key)); 699 - btrfs_mark_buffer_dirty(parent_buf); 605 + struct btrfs_disk_key right_key; 606 + btrfs_node_key(right, &right_key, 0); 607 + btrfs_set_node_key(parent, &right_key, pslot + 1); 608 + btrfs_mark_buffer_dirty(parent); 700 609 } 701 610 } 702 - if (btrfs_header_nritems(&mid->header) == 1) { 611 + if (btrfs_header_nritems(mid) == 1) { 703 612 /* 704 613 * we're not allowed to leave a node with one item in the 705 614 * tree during a delete. A deletion from lower in the tree ··· 708 619 * otherwise we would have pulled some pointers from the 709 620 * right 710 621 */ 711 - BUG_ON(!left_buf); 712 - wret = balance_node_right(trans, root, mid_buf, left_buf); 622 + BUG_ON(!left); 623 + wret = balance_node_right(trans, root, mid, left); 713 624 if (wret < 0) { 714 625 ret = wret; 715 626 goto enospc; 716 627 } 717 628 BUG_ON(wret == 1); 718 629 } 719 - if (btrfs_header_nritems(&mid->header) == 0) { 630 + if (btrfs_header_nritems(mid) == 0) { 720 631 /* we've managed to empty the middle node, drop it */ 721 - u64 blocknr = bh_blocknr(mid_buf); 722 - clean_tree_block(trans, root, mid_buf); 723 - wait_on_buffer(mid_buf); 724 - btrfs_block_release(root, mid_buf); 725 - mid_buf = NULL; 632 + u64 blocknr = extent_buffer_blocknr(mid); 633 + clean_tree_block(trans, root, mid); 634 + wait_on_tree_block_writeback(root, mid); 635 + free_extent_buffer(mid); 726 636 mid = NULL; 727 637 wret = del_ptr(trans, root, path, level + 1, pslot); 728 638 if (wret) ··· 731 643 ret = wret; 732 644 } else { 733 645 /* update the parent key to reflect our changes */ 734 - btrfs_memcpy(root, parent, 735 - &parent->ptrs[pslot].key, &mid->ptrs[0].key, 736 - sizeof(struct btrfs_disk_key)); 737 - btrfs_mark_buffer_dirty(parent_buf); 646 + struct btrfs_disk_key mid_key; 647 + btrfs_node_key(mid, &mid_key, 0); 648 + btrfs_set_node_key(parent, &mid_key, pslot); 649 + btrfs_mark_buffer_dirty(parent); 738 650 } 739 651 740 652 /* update the path */ 741 - if (left_buf) { 742 - if (btrfs_header_nritems(&left->header) > orig_slot) { 743 - get_bh(left_buf); 744 - path->nodes[level] = left_buf; 653 + if (left) { 654 + if (btrfs_header_nritems(left) > orig_slot) { 655 + extent_buffer_get(left); 656 + path->nodes[level] = left; 745 657 path->slots[level + 1] -= 1; 746 658 path->slots[level] = orig_slot; 747 - if (mid_buf) 748 - btrfs_block_release(root, mid_buf); 659 + if (mid) 660 + free_extent_buffer(mid); 749 661 } else { 750 - orig_slot -= btrfs_header_nritems(&left->header); 662 + orig_slot -= btrfs_header_nritems(left); 751 663 path->slots[level] = orig_slot; 752 664 } 753 665 } 754 666 /* double check we haven't messed things up */ 755 667 check_block(root, path, level); 756 668 if (orig_ptr != 757 - btrfs_node_blockptr(btrfs_buffer_node(path->nodes[level]), 758 - path->slots[level])) 669 + btrfs_node_blockptr(path->nodes[level], path->slots[level])) 759 670 BUG(); 760 671 enospc: 761 - if (right_buf) 762 - btrfs_block_release(root, right_buf); 763 - if (left_buf) 764 - btrfs_block_release(root, left_buf); 672 + if (right) 673 + free_extent_buffer(right); 674 + if (left) 675 + free_extent_buffer(left); 765 676 return ret; 766 677 } 767 678 ··· 769 682 struct btrfs_root *root, 770 683 struct btrfs_path *path, int level) 771 684 { 772 - struct buffer_head *right_buf; 773 - struct buffer_head *mid_buf; 774 - struct buffer_head *left_buf; 775 - struct buffer_head *parent_buf = NULL; 776 - struct btrfs_node *right = NULL; 777 - struct btrfs_node *mid; 778 - struct btrfs_node *left = NULL; 779 - struct btrfs_node *parent = NULL; 685 + struct extent_buffer *right = NULL; 686 + struct extent_buffer *mid; 687 + struct extent_buffer *left = NULL; 688 + struct extent_buffer *parent = NULL; 780 689 int ret = 0; 781 690 int wret; 782 691 int pslot; ··· 782 699 if (level == 0) 783 700 return 1; 784 701 785 - mid_buf = path->nodes[level]; 786 - mid = btrfs_buffer_node(mid_buf); 702 + mid = path->nodes[level]; 787 703 orig_ptr = btrfs_node_blockptr(mid, orig_slot); 788 704 789 705 if (level < BTRFS_MAX_LEVEL - 1) 790 - parent_buf = path->nodes[level + 1]; 706 + parent = path->nodes[level + 1]; 791 707 pslot = path->slots[level + 1]; 792 708 793 - if (!parent_buf) 709 + if (!parent) 794 710 return 1; 795 - parent = btrfs_buffer_node(parent_buf); 796 711 797 - left_buf = read_node_slot(root, parent_buf, pslot - 1); 712 + left = read_node_slot(root, parent, pslot - 1); 798 713 799 714 /* first, try to make some room in the middle buffer */ 800 - if (left_buf) { 715 + if (left) { 801 716 u32 left_nr; 802 - left = btrfs_buffer_node(left_buf); 803 - left_nr = btrfs_header_nritems(&left->header); 717 + left_nr = btrfs_header_nritems(left); 804 718 if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { 805 719 wret = 1; 806 720 } else { 807 - ret = btrfs_cow_block(trans, root, left_buf, parent_buf, 808 - pslot - 1, &left_buf); 721 + ret = btrfs_cow_block(trans, root, left, parent, 722 + pslot - 1, &left); 809 723 if (ret) 810 724 wret = 1; 811 725 else { 812 - left = btrfs_buffer_node(left_buf); 813 726 wret = push_node_left(trans, root, 814 - left_buf, mid_buf); 727 + left, mid); 815 728 } 816 729 } 817 730 if (wret < 0) 818 731 ret = wret; 819 732 if (wret == 0) { 733 + struct btrfs_disk_key disk_key; 820 734 orig_slot += left_nr; 821 - btrfs_memcpy(root, parent, 822 - &parent->ptrs[pslot].key, 823 - &mid->ptrs[0].key, 824 - sizeof(struct btrfs_disk_key)); 825 - btrfs_mark_buffer_dirty(parent_buf); 826 - if (btrfs_header_nritems(&left->header) > orig_slot) { 827 - path->nodes[level] = left_buf; 735 + btrfs_node_key(mid, &disk_key, 0); 736 + btrfs_set_node_key(parent, &disk_key, pslot); 737 + btrfs_mark_buffer_dirty(parent); 738 + if (btrfs_header_nritems(left) > orig_slot) { 739 + path->nodes[level] = left; 828 740 path->slots[level + 1] -= 1; 829 741 path->slots[level] = orig_slot; 830 - btrfs_block_release(root, mid_buf); 742 + free_extent_buffer(mid); 831 743 } else { 832 744 orig_slot -= 833 - btrfs_header_nritems(&left->header); 745 + btrfs_header_nritems(left); 834 746 path->slots[level] = orig_slot; 835 - btrfs_block_release(root, left_buf); 747 + free_extent_buffer(left); 836 748 } 837 749 check_node(root, path, level); 838 750 return 0; 839 751 } 840 - btrfs_block_release(root, left_buf); 752 + free_extent_buffer(left); 841 753 } 842 - right_buf = read_node_slot(root, parent_buf, pslot + 1); 754 + right= read_node_slot(root, parent, pslot + 1); 843 755 844 756 /* 845 757 * then try to empty the right most buffer into the middle 846 758 */ 847 - if (right_buf) { 759 + if (right) { 848 760 u32 right_nr; 849 - right = btrfs_buffer_node(right_buf); 850 - right_nr = btrfs_header_nritems(&right->header); 761 + right_nr = btrfs_header_nritems(right); 851 762 if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { 852 763 wret = 1; 853 764 } else { 854 - ret = btrfs_cow_block(trans, root, right_buf, 855 - parent_buf, pslot + 1, 856 - &right_buf); 765 + ret = btrfs_cow_block(trans, root, right, 766 + parent, pslot + 1, 767 + &right); 857 768 if (ret) 858 769 wret = 1; 859 770 else { 860 - right = btrfs_buffer_node(right_buf); 861 771 wret = balance_node_right(trans, root, 862 - right_buf, mid_buf); 772 + right, mid); 863 773 } 864 774 } 865 775 if (wret < 0) 866 776 ret = wret; 867 777 if (wret == 0) { 868 - btrfs_memcpy(root, parent, 869 - &parent->ptrs[pslot + 1].key, 870 - &right->ptrs[0].key, 871 - sizeof(struct btrfs_disk_key)); 872 - btrfs_mark_buffer_dirty(parent_buf); 873 - if (btrfs_header_nritems(&mid->header) <= orig_slot) { 874 - path->nodes[level] = right_buf; 778 + struct btrfs_disk_key disk_key; 779 + 780 + btrfs_node_key(right, &disk_key, 0); 781 + btrfs_set_node_key(parent, &disk_key, pslot + 1); 782 + btrfs_mark_buffer_dirty(parent); 783 + 784 + if (btrfs_header_nritems(mid) <= orig_slot) { 785 + path->nodes[level] = right; 875 786 path->slots[level + 1] += 1; 876 787 path->slots[level] = orig_slot - 877 - btrfs_header_nritems(&mid->header); 878 - btrfs_block_release(root, mid_buf); 788 + btrfs_header_nritems(mid); 789 + free_extent_buffer(mid); 879 790 } else { 880 - btrfs_block_release(root, right_buf); 791 + free_extent_buffer(right); 881 792 } 882 793 check_node(root, path, level); 883 794 return 0; 884 795 } 885 - btrfs_block_release(root, right_buf); 796 + free_extent_buffer(right); 886 797 } 887 798 check_node(root, path, level); 888 799 return 1; ··· 888 811 static void reada_for_search(struct btrfs_root *root, struct btrfs_path *path, 889 812 int level, int slot) 890 813 { 891 - struct btrfs_node *node; 814 + struct extent_buffer *node; 892 815 int i; 893 816 u32 nritems; 894 - u64 item_objectid; 895 817 u64 blocknr; 896 818 u64 search; 897 819 u64 cluster_start; ··· 899 823 int direction = path->reada; 900 824 struct radix_tree_root found; 901 825 unsigned long gang[8]; 902 - struct buffer_head *bh; 826 + struct extent_buffer *eb; 903 827 904 828 if (level == 0) 905 829 return; ··· 907 831 if (!path->nodes[level]) 908 832 return; 909 833 910 - node = btrfs_buffer_node(path->nodes[level]); 834 + node = path->nodes[level]; 911 835 search = btrfs_node_blockptr(node, slot); 912 - bh = btrfs_find_tree_block(root, search); 913 - if (bh) { 914 - brelse(bh); 836 + eb = btrfs_find_tree_block(root, search); 837 + if (eb) { 838 + free_extent_buffer(eb); 915 839 return; 916 840 } 917 841 918 842 init_bit_radix(&found); 919 - nritems = btrfs_header_nritems(&node->header); 843 + nritems = btrfs_header_nritems(node); 920 844 for (i = slot; i < nritems; i++) { 921 - item_objectid = btrfs_disk_key_objectid(&node->ptrs[i].key); 922 845 blocknr = btrfs_node_blockptr(node, i); 923 846 set_radix_bit(&found, blocknr); 924 847 } ··· 961 886 *root, struct btrfs_key *key, struct btrfs_path *p, int 962 887 ins_len, int cow) 963 888 { 964 - struct buffer_head *b; 965 - struct btrfs_node *c; 889 + struct extent_buffer *b; 966 890 u64 blocknr; 967 891 int slot; 968 892 int ret; ··· 975 901 WARN_ON(!mutex_is_locked(&root->fs_info->fs_mutex)); 976 902 again: 977 903 b = root->node; 978 - get_bh(b); 904 + extent_buffer_get(b); 979 905 while (b) { 980 - c = btrfs_buffer_node(b); 981 - level = btrfs_header_level(&c->header); 906 + level = btrfs_header_level(b); 982 907 if (cow) { 983 908 int wret; 984 909 wret = btrfs_cow_block(trans, root, b, ··· 985 912 p->slots[level + 1], 986 913 &b); 987 914 if (wret) { 988 - btrfs_block_release(root, b); 915 + free_extent_buffer(b); 989 916 return wret; 990 917 } 991 - c = btrfs_buffer_node(b); 992 918 } 993 919 BUG_ON(!cow && ins_len); 994 - if (level != btrfs_header_level(&c->header)) 920 + if (level != btrfs_header_level(b)) 995 921 WARN_ON(1); 996 - level = btrfs_header_level(&c->header); 922 + level = btrfs_header_level(b); 997 923 p->nodes[level] = b; 998 924 ret = check_block(root, p, level); 999 925 if (ret) 1000 926 return -1; 1001 - ret = bin_search(c, key, &slot); 1002 - if (!btrfs_is_leaf(c)) { 927 + ret = bin_search(b, key, level, &slot); 928 + if (level != 0) { 1003 929 if (ret && slot > 0) 1004 930 slot -= 1; 1005 931 p->slots[level] = slot; 1006 - if (ins_len > 0 && btrfs_header_nritems(&c->header) >= 932 + if (ins_len > 0 && btrfs_header_nritems(b) >= 1007 933 BTRFS_NODEPTRS_PER_BLOCK(root) - 1) { 1008 934 int sret = split_node(trans, root, p, level); 1009 935 BUG_ON(sret > 0); 1010 936 if (sret) 1011 937 return sret; 1012 938 b = p->nodes[level]; 1013 - c = btrfs_buffer_node(b); 1014 939 slot = p->slots[level]; 1015 940 } else if (ins_len < 0) { 1016 941 int sret = balance_level(trans, root, p, ··· 1018 947 b = p->nodes[level]; 1019 948 if (!b) 1020 949 goto again; 1021 - c = btrfs_buffer_node(b); 1022 950 slot = p->slots[level]; 1023 - BUG_ON(btrfs_header_nritems(&c->header) == 1); 951 + BUG_ON(btrfs_header_nritems(b) == 1); 1024 952 } 1025 953 /* this is only true while dropping a snapshot */ 1026 954 if (level == lowest_level) 1027 955 break; 1028 - blocknr = btrfs_node_blockptr(c, slot); 956 + blocknr = btrfs_node_blockptr(b, slot); 1029 957 if (should_reada) 1030 958 reada_for_search(root, p, level, slot); 1031 - b = read_tree_block(root, btrfs_node_blockptr(c, slot)); 1032 - 959 + b = read_tree_block(root, btrfs_node_blockptr(b, slot)); 1033 960 } else { 1034 - struct btrfs_leaf *l = (struct btrfs_leaf *)c; 1035 961 p->slots[level] = slot; 1036 - if (ins_len > 0 && btrfs_leaf_free_space(root, l) < 962 + if (ins_len > 0 && btrfs_leaf_free_space(root, b) < 1037 963 sizeof(struct btrfs_item) + ins_len) { 1038 964 int sret = split_leaf(trans, root, key, 1039 965 p, ins_len); ··· 1054 986 * If this fails to write a tree block, it returns -1, but continues 1055 987 * fixing up the blocks in ram so the tree is consistent. 1056 988 */ 1057 - static int fixup_low_keys(struct btrfs_trans_handle *trans, struct btrfs_root 1058 - *root, struct btrfs_path *path, struct btrfs_disk_key 1059 - *key, int level) 989 + static int fixup_low_keys(struct btrfs_trans_handle *trans, 990 + struct btrfs_root *root, struct btrfs_path *path, 991 + struct btrfs_disk_key *key, int level) 1060 992 { 1061 993 int i; 1062 994 int ret = 0; 995 + struct extent_buffer *t; 996 + 1063 997 for (i = level; i < BTRFS_MAX_LEVEL; i++) { 1064 - struct btrfs_node *t; 1065 998 int tslot = path->slots[i]; 1066 999 if (!path->nodes[i]) 1067 1000 break; 1068 - t = btrfs_buffer_node(path->nodes[i]); 1069 - btrfs_memcpy(root, t, &t->ptrs[tslot].key, key, sizeof(*key)); 1001 + t = path->nodes[i]; 1002 + btrfs_set_node_key(t, key, tslot); 1070 1003 btrfs_mark_buffer_dirty(path->nodes[i]); 1071 1004 if (tslot != 0) 1072 1005 break; ··· 1083 1014 * error, and > 0 if there was no room in the left hand block. 1084 1015 */ 1085 1016 static int push_node_left(struct btrfs_trans_handle *trans, struct btrfs_root 1086 - *root, struct buffer_head *dst_buf, struct 1087 - buffer_head *src_buf) 1017 + *root, struct extent_buffer *dst, 1018 + struct extent_buffer *src) 1088 1019 { 1089 - struct btrfs_node *src = btrfs_buffer_node(src_buf); 1090 - struct btrfs_node *dst = btrfs_buffer_node(dst_buf); 1091 1020 int push_items = 0; 1092 1021 int src_nritems; 1093 1022 int dst_nritems; 1094 1023 int ret = 0; 1095 1024 1096 - src_nritems = btrfs_header_nritems(&src->header); 1097 - dst_nritems = btrfs_header_nritems(&dst->header); 1025 + src_nritems = btrfs_header_nritems(src); 1026 + dst_nritems = btrfs_header_nritems(dst); 1098 1027 push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems; 1099 1028 1100 1029 if (push_items <= 0) { ··· 1102 1035 if (src_nritems < push_items) 1103 1036 push_items = src_nritems; 1104 1037 1105 - btrfs_memcpy(root, dst, dst->ptrs + dst_nritems, src->ptrs, 1106 - push_items * sizeof(struct btrfs_key_ptr)); 1038 + copy_extent_buffer(dst, src, 1039 + btrfs_node_key_ptr_offset(dst_nritems), 1040 + btrfs_node_key_ptr_offset(0), 1041 + push_items * sizeof(struct btrfs_key_ptr)); 1042 + 1107 1043 if (push_items < src_nritems) { 1108 - btrfs_memmove(root, src, src->ptrs, src->ptrs + push_items, 1109 - (src_nritems - push_items) * 1110 - sizeof(struct btrfs_key_ptr)); 1044 + memmove_extent_buffer(src, btrfs_node_key_ptr_offset(0), 1045 + btrfs_node_key_ptr_offset(push_items), 1046 + (src_nritems - push_items) * 1047 + sizeof(struct btrfs_key_ptr)); 1111 1048 } 1112 - btrfs_set_header_nritems(&src->header, src_nritems - push_items); 1113 - btrfs_set_header_nritems(&dst->header, dst_nritems + push_items); 1114 - btrfs_mark_buffer_dirty(src_buf); 1115 - btrfs_mark_buffer_dirty(dst_buf); 1049 + btrfs_set_header_nritems(src, src_nritems - push_items); 1050 + btrfs_set_header_nritems(dst, dst_nritems + push_items); 1051 + btrfs_mark_buffer_dirty(src); 1052 + btrfs_mark_buffer_dirty(dst); 1116 1053 return ret; 1117 1054 } 1118 1055 ··· 1129 1058 * 1130 1059 * this will only push up to 1/2 the contents of the left node over 1131 1060 */ 1132 - static int balance_node_right(struct btrfs_trans_handle *trans, struct 1133 - btrfs_root *root, struct buffer_head *dst_buf, 1134 - struct buffer_head *src_buf) 1061 + static int balance_node_right(struct btrfs_trans_handle *trans, 1062 + struct btrfs_root *root, 1063 + struct extent_buffer *dst, 1064 + struct extent_buffer *src) 1135 1065 { 1136 - struct btrfs_node *src = btrfs_buffer_node(src_buf); 1137 - struct btrfs_node *dst = btrfs_buffer_node(dst_buf); 1138 1066 int push_items = 0; 1139 1067 int max_push; 1140 1068 int src_nritems; 1141 1069 int dst_nritems; 1142 1070 int ret = 0; 1143 1071 1144 - src_nritems = btrfs_header_nritems(&src->header); 1145 - dst_nritems = btrfs_header_nritems(&dst->header); 1072 + src_nritems = btrfs_header_nritems(src); 1073 + dst_nritems = btrfs_header_nritems(dst); 1146 1074 push_items = BTRFS_NODEPTRS_PER_BLOCK(root) - dst_nritems; 1147 - if (push_items <= 0) { 1075 + if (push_items <= 0) 1148 1076 return 1; 1149 - } 1150 1077 1151 1078 max_push = src_nritems / 2 + 1; 1152 1079 /* don't try to empty the node */ ··· 1154 1085 if (max_push < push_items) 1155 1086 push_items = max_push; 1156 1087 1157 - btrfs_memmove(root, dst, dst->ptrs + push_items, dst->ptrs, 1158 - dst_nritems * sizeof(struct btrfs_key_ptr)); 1088 + memmove_extent_buffer(dst, btrfs_node_key_ptr_offset(push_items), 1089 + btrfs_node_key_ptr_offset(0), 1090 + (dst_nritems) * 1091 + sizeof(struct btrfs_key_ptr)); 1159 1092 1160 - btrfs_memcpy(root, dst, dst->ptrs, 1161 - src->ptrs + src_nritems - push_items, 1162 - push_items * sizeof(struct btrfs_key_ptr)); 1093 + copy_extent_buffer(dst, src, 1094 + btrfs_node_key_ptr_offset(0), 1095 + btrfs_node_key_ptr_offset(src_nritems - push_items), 1096 + push_items * sizeof(struct btrfs_key_ptr)); 1163 1097 1164 - btrfs_set_header_nritems(&src->header, src_nritems - push_items); 1165 - btrfs_set_header_nritems(&dst->header, dst_nritems + push_items); 1098 + btrfs_set_header_nritems(src, src_nritems - push_items); 1099 + btrfs_set_header_nritems(dst, dst_nritems + push_items); 1166 1100 1167 - btrfs_mark_buffer_dirty(src_buf); 1168 - btrfs_mark_buffer_dirty(dst_buf); 1101 + btrfs_mark_buffer_dirty(src); 1102 + btrfs_mark_buffer_dirty(dst); 1169 1103 return ret; 1170 1104 } 1171 1105 ··· 1179 1107 * 1180 1108 * returns zero on success or < 0 on failure. 1181 1109 */ 1182 - static int insert_new_root(struct btrfs_trans_handle *trans, struct btrfs_root 1183 - *root, struct btrfs_path *path, int level) 1110 + static int insert_new_root(struct btrfs_trans_handle *trans, 1111 + struct btrfs_root *root, 1112 + struct btrfs_path *path, int level) 1184 1113 { 1185 - struct buffer_head *t; 1186 - struct btrfs_node *lower; 1187 - struct btrfs_node *c; 1188 - struct btrfs_disk_key *lower_key; 1114 + struct extent_buffer *lower; 1115 + struct extent_buffer *c; 1116 + struct btrfs_disk_key lower_key; 1189 1117 1190 1118 BUG_ON(path->nodes[level]); 1191 1119 BUG_ON(path->nodes[level-1] != root->node); 1192 1120 1193 - t = btrfs_alloc_free_block(trans, root, root->node->b_blocknr, 0); 1194 - if (IS_ERR(t)) 1195 - return PTR_ERR(t); 1196 - c = btrfs_buffer_node(t); 1197 - memset(c, 0, root->blocksize); 1198 - btrfs_set_header_nritems(&c->header, 1); 1199 - btrfs_set_header_level(&c->header, level); 1200 - btrfs_set_header_blocknr(&c->header, bh_blocknr(t)); 1201 - btrfs_set_header_generation(&c->header, trans->transid); 1202 - btrfs_set_header_owner(&c->header, root->root_key.objectid); 1203 - lower = btrfs_buffer_node(path->nodes[level-1]); 1204 - memcpy(c->header.fsid, root->fs_info->disk_super->fsid, 1205 - sizeof(c->header.fsid)); 1206 - if (btrfs_is_leaf(lower)) 1207 - lower_key = &((struct btrfs_leaf *)lower)->items[0].key; 1208 - else 1209 - lower_key = &lower->ptrs[0].key; 1210 - btrfs_memcpy(root, c, &c->ptrs[0].key, lower_key, 1211 - sizeof(struct btrfs_disk_key)); 1212 - btrfs_set_node_blockptr(c, 0, bh_blocknr(path->nodes[level - 1])); 1121 + c = btrfs_alloc_free_block(trans, root, 1122 + extent_buffer_blocknr(root->node), 0); 1123 + if (IS_ERR(c)) 1124 + return PTR_ERR(c); 1125 + memset_extent_buffer(c, 0, 0, root->nodesize); 1126 + btrfs_set_header_nritems(c, 1); 1127 + btrfs_set_header_level(c, level); 1128 + btrfs_set_header_blocknr(c, extent_buffer_blocknr(c)); 1129 + btrfs_set_header_generation(c, trans->transid); 1130 + btrfs_set_header_owner(c, root->root_key.objectid); 1131 + lower = path->nodes[level-1]; 1213 1132 1214 - btrfs_mark_buffer_dirty(t); 1133 + write_extent_buffer(c, root->fs_info->fsid, 1134 + (unsigned long)btrfs_header_fsid(c), 1135 + BTRFS_FSID_SIZE); 1136 + if (level == 1) 1137 + btrfs_item_key(lower, &lower_key, 0); 1138 + else 1139 + btrfs_node_key(lower, &lower_key, 0); 1140 + btrfs_set_node_key(c, &lower_key, 0); 1141 + btrfs_set_node_blockptr(c, 0, extent_buffer_blocknr(lower)); 1142 + 1143 + btrfs_mark_buffer_dirty(c); 1215 1144 1216 1145 /* the super has an extra ref to root->node */ 1217 - btrfs_block_release(root, root->node); 1218 - root->node = t; 1219 - get_bh(t); 1220 - path->nodes[level] = t; 1146 + free_extent_buffer(root->node); 1147 + root->node = c; 1148 + extent_buffer_get(c); 1149 + path->nodes[level] = c; 1221 1150 path->slots[level] = 0; 1222 1151 return 0; 1223 1152 } ··· 1236 1163 *root, struct btrfs_path *path, struct btrfs_disk_key 1237 1164 *key, u64 blocknr, int slot, int level) 1238 1165 { 1239 - struct btrfs_node *lower; 1166 + struct extent_buffer *lower; 1240 1167 int nritems; 1241 1168 1242 1169 BUG_ON(!path->nodes[level]); 1243 - lower = btrfs_buffer_node(path->nodes[level]); 1244 - nritems = btrfs_header_nritems(&lower->header); 1170 + lower = path->nodes[level]; 1171 + nritems = btrfs_header_nritems(lower); 1245 1172 if (slot > nritems) 1246 1173 BUG(); 1247 1174 if (nritems == BTRFS_NODEPTRS_PER_BLOCK(root)) 1248 1175 BUG(); 1249 1176 if (slot != nritems) { 1250 - btrfs_memmove(root, lower, lower->ptrs + slot + 1, 1251 - lower->ptrs + slot, 1177 + memmove_extent_buffer(lower, 1178 + btrfs_node_key_ptr_offset(slot + 1), 1179 + btrfs_node_key_ptr_offset(slot), 1252 1180 (nritems - slot) * sizeof(struct btrfs_key_ptr)); 1253 1181 } 1254 - btrfs_memcpy(root, lower, &lower->ptrs[slot].key, 1255 - key, sizeof(struct btrfs_disk_key)); 1182 + btrfs_set_node_key(lower, key, slot); 1256 1183 btrfs_set_node_blockptr(lower, slot, blocknr); 1257 - btrfs_set_header_nritems(&lower->header, nritems + 1); 1258 - btrfs_mark_buffer_dirty(path->nodes[level]); 1184 + btrfs_set_header_nritems(lower, nritems + 1); 1185 + btrfs_mark_buffer_dirty(lower); 1259 1186 check_node(root, path, level); 1260 1187 return 0; 1261 1188 } ··· 1272 1199 static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root 1273 1200 *root, struct btrfs_path *path, int level) 1274 1201 { 1275 - struct buffer_head *t; 1276 - struct btrfs_node *c; 1277 - struct buffer_head *split_buffer; 1278 - struct btrfs_node *split; 1202 + struct extent_buffer *c; 1203 + struct extent_buffer *split; 1204 + struct btrfs_disk_key disk_key; 1279 1205 int mid; 1280 1206 int ret; 1281 1207 int wret; 1282 1208 u32 c_nritems; 1283 1209 1284 - t = path->nodes[level]; 1285 - c = btrfs_buffer_node(t); 1286 - if (t == root->node) { 1210 + c = path->nodes[level]; 1211 + if (c == root->node) { 1287 1212 /* trying to split the root, lets make a new one */ 1288 1213 ret = insert_new_root(trans, root, path, level + 1); 1289 1214 if (ret) 1290 1215 return ret; 1291 1216 } else { 1292 1217 ret = push_nodes_for_insert(trans, root, path, level); 1293 - t = path->nodes[level]; 1294 - c = btrfs_buffer_node(t); 1295 - if (!ret && 1296 - btrfs_header_nritems(&c->header) < 1218 + c = path->nodes[level]; 1219 + if (!ret && btrfs_header_nritems(c) < 1297 1220 BTRFS_NODEPTRS_PER_BLOCK(root) - 1) 1298 1221 return 0; 1299 1222 if (ret < 0) 1300 1223 return ret; 1301 1224 } 1302 1225 1303 - c_nritems = btrfs_header_nritems(&c->header); 1304 - split_buffer = btrfs_alloc_free_block(trans, root, t->b_blocknr, 0); 1305 - if (IS_ERR(split_buffer)) 1306 - return PTR_ERR(split_buffer); 1226 + c_nritems = btrfs_header_nritems(c); 1227 + split = btrfs_alloc_free_block(trans, root, 1228 + extent_buffer_blocknr(c), 0); 1229 + if (IS_ERR(split)) 1230 + return PTR_ERR(split); 1307 1231 1308 - split = btrfs_buffer_node(split_buffer); 1309 - btrfs_set_header_flags(&split->header, btrfs_header_flags(&c->header)); 1310 - btrfs_set_header_level(&split->header, btrfs_header_level(&c->header)); 1311 - btrfs_set_header_blocknr(&split->header, bh_blocknr(split_buffer)); 1312 - btrfs_set_header_generation(&split->header, trans->transid); 1313 - btrfs_set_header_owner(&split->header, root->root_key.objectid); 1314 - memcpy(split->header.fsid, root->fs_info->disk_super->fsid, 1315 - sizeof(split->header.fsid)); 1232 + btrfs_set_header_flags(split, btrfs_header_flags(c)); 1233 + btrfs_set_header_level(split, btrfs_header_level(c)); 1234 + btrfs_set_header_blocknr(split, extent_buffer_blocknr(split)); 1235 + btrfs_set_header_generation(split, trans->transid); 1236 + btrfs_set_header_owner(split, root->root_key.objectid); 1237 + write_extent_buffer(split, root->fs_info->fsid, 1238 + (unsigned long)btrfs_header_fsid(split), 1239 + BTRFS_FSID_SIZE); 1240 + 1316 1241 mid = (c_nritems + 1) / 2; 1317 - btrfs_memcpy(root, split, split->ptrs, c->ptrs + mid, 1318 - (c_nritems - mid) * sizeof(struct btrfs_key_ptr)); 1319 - btrfs_set_header_nritems(&split->header, c_nritems - mid); 1320 - btrfs_set_header_nritems(&c->header, mid); 1242 + 1243 + copy_extent_buffer(split, c, 1244 + btrfs_node_key_ptr_offset(0), 1245 + btrfs_node_key_ptr_offset(mid), 1246 + (c_nritems - mid) * sizeof(struct btrfs_key_ptr)); 1247 + btrfs_set_header_nritems(split, c_nritems - mid); 1248 + btrfs_set_header_nritems(c, mid); 1321 1249 ret = 0; 1322 1250 1323 - btrfs_mark_buffer_dirty(t); 1324 - btrfs_mark_buffer_dirty(split_buffer); 1325 - wret = insert_ptr(trans, root, path, &split->ptrs[0].key, 1326 - bh_blocknr(split_buffer), path->slots[level + 1] + 1, 1251 + btrfs_mark_buffer_dirty(c); 1252 + btrfs_mark_buffer_dirty(split); 1253 + 1254 + btrfs_node_key(split, &disk_key, 0); 1255 + wret = insert_ptr(trans, root, path, &disk_key, 1256 + extent_buffer_blocknr(split), 1257 + path->slots[level + 1] + 1, 1327 1258 level + 1); 1328 1259 if (wret) 1329 1260 ret = wret; 1330 1261 1331 1262 if (path->slots[level] >= mid) { 1332 1263 path->slots[level] -= mid; 1333 - btrfs_block_release(root, t); 1334 - path->nodes[level] = split_buffer; 1264 + free_extent_buffer(c); 1265 + path->nodes[level] = split; 1335 1266 path->slots[level + 1] += 1; 1336 1267 } else { 1337 - btrfs_block_release(root, split_buffer); 1268 + free_extent_buffer(split); 1338 1269 } 1339 1270 return ret; 1340 1271 } ··· 1348 1271 * and nr indicate which items in the leaf to check. This totals up the 1349 1272 * space used both by the item structs and the item data 1350 1273 */ 1351 - static int leaf_space_used(struct btrfs_leaf *l, int start, int nr) 1274 + static int leaf_space_used(struct extent_buffer *l, int start, int nr) 1352 1275 { 1353 1276 int data_len; 1354 - int nritems = btrfs_header_nritems(&l->header); 1277 + int nritems = btrfs_header_nritems(l); 1355 1278 int end = min(nritems, start + nr) - 1; 1356 1279 1357 1280 if (!nr) 1358 1281 return 0; 1359 - data_len = btrfs_item_end(l->items + start); 1360 - data_len = data_len - btrfs_item_offset(l->items + end); 1282 + data_len = btrfs_item_end_nr(l, start); 1283 + data_len = data_len - btrfs_item_offset_nr(l, end); 1361 1284 data_len += sizeof(struct btrfs_item) * nr; 1362 1285 WARN_ON(data_len < 0); 1363 1286 return data_len; ··· 1368 1291 * the start of the leaf data. IOW, how much room 1369 1292 * the leaf has left for both items and data 1370 1293 */ 1371 - int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf) 1294 + int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf) 1372 1295 { 1373 - int nritems = btrfs_header_nritems(&leaf->header); 1374 - return BTRFS_LEAF_DATA_SIZE(root) - leaf_space_used(leaf, 0, nritems); 1296 + int nritems = btrfs_header_nritems(leaf); 1297 + int ret; 1298 + ret = BTRFS_LEAF_DATA_SIZE(root) - leaf_space_used(leaf, 0, nritems); 1299 + if (ret < 0) { 1300 + printk("leaf free space ret %d, leaf data size %lu, used %d nritems %d\n", 1301 + ret, BTRFS_LEAF_DATA_SIZE(root), 1302 + leaf_space_used(leaf, 0, nritems), nritems); 1303 + } 1304 + return ret; 1375 1305 } 1376 1306 1377 1307 /* ··· 1391 1307 static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root 1392 1308 *root, struct btrfs_path *path, int data_size) 1393 1309 { 1394 - struct buffer_head *left_buf = path->nodes[0]; 1395 - struct btrfs_leaf *left = btrfs_buffer_leaf(left_buf); 1396 - struct btrfs_leaf *right; 1397 - struct buffer_head *right_buf; 1398 - struct buffer_head *upper; 1399 - struct btrfs_node *upper_node; 1310 + struct extent_buffer *left = path->nodes[0]; 1311 + struct extent_buffer *right; 1312 + struct extent_buffer *upper; 1313 + struct btrfs_disk_key disk_key; 1400 1314 int slot; 1401 1315 int i; 1402 1316 int free_space; ··· 1403 1321 struct btrfs_item *item; 1404 1322 u32 left_nritems; 1405 1323 u32 right_nritems; 1324 + u32 data_end; 1406 1325 int ret; 1407 1326 1408 1327 slot = path->slots[1]; ··· 1411 1328 return 1; 1412 1329 } 1413 1330 upper = path->nodes[1]; 1414 - upper_node = btrfs_buffer_node(upper); 1415 - if (slot >= btrfs_header_nritems(&upper_node->header) - 1) { 1331 + if (slot >= btrfs_header_nritems(upper) - 1) 1416 1332 return 1; 1417 - } 1418 - right_buf = read_tree_block(root, 1419 - btrfs_node_blockptr(btrfs_buffer_node(upper), slot + 1)); 1420 - right = btrfs_buffer_leaf(right_buf); 1333 + 1334 + right = read_tree_block(root, btrfs_node_blockptr(upper, slot + 1)); 1421 1335 free_space = btrfs_leaf_free_space(root, right); 1422 1336 if (free_space < data_size + sizeof(struct btrfs_item)) { 1423 - btrfs_block_release(root, right_buf); 1424 - return 1; 1425 - } 1426 - /* cow and double check */ 1427 - ret = btrfs_cow_block(trans, root, right_buf, upper, 1428 - slot + 1, &right_buf); 1429 - if (ret) { 1430 - btrfs_block_release(root, right_buf); 1431 - return 1; 1432 - } 1433 - right = btrfs_buffer_leaf(right_buf); 1434 - free_space = btrfs_leaf_free_space(root, right); 1435 - if (free_space < data_size + sizeof(struct btrfs_item)) { 1436 - btrfs_block_release(root, right_buf); 1337 + free_extent_buffer(right); 1437 1338 return 1; 1438 1339 } 1439 1340 1440 - left_nritems = btrfs_header_nritems(&left->header); 1441 - if (left_nritems == 0) { 1442 - btrfs_block_release(root, right_buf); 1341 + /* cow and double check */ 1342 + ret = btrfs_cow_block(trans, root, right, upper, 1343 + slot + 1, &right); 1344 + if (ret) { 1345 + free_extent_buffer(right); 1443 1346 return 1; 1444 1347 } 1348 + free_space = btrfs_leaf_free_space(root, right); 1349 + if (free_space < data_size + sizeof(struct btrfs_item)) { 1350 + free_extent_buffer(right); 1351 + return 1; 1352 + } 1353 + 1354 + left_nritems = btrfs_header_nritems(left); 1355 + if (left_nritems == 0) { 1356 + free_extent_buffer(right); 1357 + return 1; 1358 + } 1359 + 1445 1360 for (i = left_nritems - 1; i >= 1; i--) { 1446 - item = left->items + i; 1361 + item = btrfs_item_nr(left, i); 1447 1362 if (path->slots[0] == i) 1448 1363 push_space += data_size + sizeof(*item); 1449 - if (btrfs_item_size(item) + sizeof(*item) + push_space > 1364 + if (btrfs_item_size(left, item) + sizeof(*item) + push_space > 1450 1365 free_space) 1451 1366 break; 1452 1367 push_items++; 1453 - push_space += btrfs_item_size(item) + sizeof(*item); 1368 + push_space += btrfs_item_size(left, item) + sizeof(*item); 1454 1369 } 1370 + 1455 1371 if (push_items == 0) { 1456 - btrfs_block_release(root, right_buf); 1372 + free_extent_buffer(right); 1457 1373 return 1; 1458 1374 } 1375 + 1459 1376 if (push_items == left_nritems) 1460 1377 WARN_ON(1); 1461 - right_nritems = btrfs_header_nritems(&right->header); 1378 + 1462 1379 /* push left to right */ 1463 - push_space = btrfs_item_end(left->items + left_nritems - push_items); 1380 + right_nritems = btrfs_header_nritems(right); 1381 + push_space = btrfs_item_end_nr(left, left_nritems - push_items); 1464 1382 push_space -= leaf_data_end(root, left); 1383 + 1465 1384 /* make room in the right data area */ 1466 - btrfs_memmove(root, right, btrfs_leaf_data(right) + 1467 - leaf_data_end(root, right) - push_space, 1468 - btrfs_leaf_data(right) + 1469 - leaf_data_end(root, right), BTRFS_LEAF_DATA_SIZE(root) - 1470 - leaf_data_end(root, right)); 1385 + data_end = leaf_data_end(root, right); 1386 + memmove_extent_buffer(right, 1387 + btrfs_leaf_data(right) + data_end - push_space, 1388 + btrfs_leaf_data(right) + data_end, 1389 + BTRFS_LEAF_DATA_SIZE(root) - data_end); 1390 + 1471 1391 /* copy from the left data area */ 1472 - btrfs_memcpy(root, right, btrfs_leaf_data(right) + 1392 + copy_extent_buffer(right, left, btrfs_leaf_data(right) + 1473 1393 BTRFS_LEAF_DATA_SIZE(root) - push_space, 1474 1394 btrfs_leaf_data(left) + leaf_data_end(root, left), 1475 1395 push_space); 1476 - btrfs_memmove(root, right, right->items + push_items, right->items, 1477 - right_nritems * sizeof(struct btrfs_item)); 1396 + 1397 + memmove_extent_buffer(right, btrfs_item_nr_offset(push_items), 1398 + btrfs_item_nr_offset(0), 1399 + right_nritems * sizeof(struct btrfs_item)); 1400 + 1478 1401 /* copy the items from left to right */ 1479 - btrfs_memcpy(root, right, right->items, left->items + 1480 - left_nritems - push_items, 1481 - push_items * sizeof(struct btrfs_item)); 1402 + copy_extent_buffer(right, left, btrfs_item_nr_offset(0), 1403 + btrfs_item_nr_offset(left_nritems - push_items), 1404 + push_items * sizeof(struct btrfs_item)); 1482 1405 1483 1406 /* update the item pointers */ 1484 1407 right_nritems += push_items; 1485 - btrfs_set_header_nritems(&right->header, right_nritems); 1408 + btrfs_set_header_nritems(right, right_nritems); 1486 1409 push_space = BTRFS_LEAF_DATA_SIZE(root); 1487 1410 for (i = 0; i < right_nritems; i++) { 1488 - btrfs_set_item_offset(right->items + i, push_space - 1489 - btrfs_item_size(right->items + i)); 1490 - push_space = btrfs_item_offset(right->items + i); 1411 + item = btrfs_item_nr(right, i); 1412 + btrfs_set_item_offset(right, item, push_space - 1413 + btrfs_item_size(right, item)); 1414 + push_space = btrfs_item_offset(right, item); 1491 1415 } 1492 1416 left_nritems -= push_items; 1493 - btrfs_set_header_nritems(&left->header, left_nritems); 1417 + btrfs_set_header_nritems(left, left_nritems); 1494 1418 1495 - btrfs_mark_buffer_dirty(left_buf); 1496 - btrfs_mark_buffer_dirty(right_buf); 1419 + btrfs_mark_buffer_dirty(left); 1420 + btrfs_mark_buffer_dirty(right); 1497 1421 1498 - btrfs_memcpy(root, upper_node, &upper_node->ptrs[slot + 1].key, 1499 - &right->items[0].key, sizeof(struct btrfs_disk_key)); 1422 + btrfs_item_key(right, &disk_key, 0); 1423 + btrfs_set_node_key(upper, &disk_key, slot + 1); 1500 1424 btrfs_mark_buffer_dirty(upper); 1501 1425 1502 1426 /* then fixup the leaf pointer in the path */ 1503 1427 if (path->slots[0] >= left_nritems) { 1504 1428 path->slots[0] -= left_nritems; 1505 - btrfs_block_release(root, path->nodes[0]); 1506 - path->nodes[0] = right_buf; 1429 + free_extent_buffer(path->nodes[0]); 1430 + path->nodes[0] = right; 1507 1431 path->slots[1] += 1; 1508 1432 } else { 1509 - btrfs_block_release(root, right_buf); 1433 + free_extent_buffer(right); 1510 1434 } 1511 1435 if (path->nodes[1]) 1512 1436 check_node(root, path, 1); ··· 1526 1436 static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root 1527 1437 *root, struct btrfs_path *path, int data_size) 1528 1438 { 1529 - struct buffer_head *right_buf = path->nodes[0]; 1530 - struct btrfs_leaf *right = btrfs_buffer_leaf(right_buf); 1531 - struct buffer_head *t; 1532 - struct btrfs_leaf *left; 1439 + struct btrfs_disk_key disk_key; 1440 + struct extent_buffer *right = path->nodes[0]; 1441 + struct extent_buffer *left; 1533 1442 int slot; 1534 1443 int i; 1535 1444 int free_space; ··· 1536 1447 int push_items = 0; 1537 1448 struct btrfs_item *item; 1538 1449 u32 old_left_nritems; 1450 + u32 right_nritems; 1539 1451 int ret = 0; 1540 1452 int wret; 1541 1453 1542 1454 slot = path->slots[1]; 1543 - if (slot == 0) { 1455 + if (slot == 0) 1544 1456 return 1; 1545 - } 1546 - if (!path->nodes[1]) { 1457 + if (!path->nodes[1]) 1547 1458 return 1; 1548 - } 1549 - t = read_tree_block(root, 1550 - btrfs_node_blockptr(btrfs_buffer_node(path->nodes[1]), slot - 1)); 1551 - left = btrfs_buffer_leaf(t); 1459 + 1460 + left = read_tree_block(root, btrfs_node_blockptr(path->nodes[1], 1461 + slot - 1)); 1552 1462 free_space = btrfs_leaf_free_space(root, left); 1553 1463 if (free_space < data_size + sizeof(struct btrfs_item)) { 1554 - btrfs_block_release(root, t); 1464 + free_extent_buffer(left); 1555 1465 return 1; 1556 1466 } 1557 1467 1558 1468 /* cow and double check */ 1559 - ret = btrfs_cow_block(trans, root, t, path->nodes[1], slot - 1, &t); 1469 + ret = btrfs_cow_block(trans, root, left, 1470 + path->nodes[1], slot - 1, &left); 1560 1471 if (ret) { 1561 1472 /* we hit -ENOSPC, but it isn't fatal here */ 1562 - btrfs_block_release(root, t); 1473 + free_extent_buffer(left); 1563 1474 return 1; 1564 1475 } 1565 - left = btrfs_buffer_leaf(t); 1566 1476 free_space = btrfs_leaf_free_space(root, left); 1567 1477 if (free_space < data_size + sizeof(struct btrfs_item)) { 1568 - btrfs_block_release(root, t); 1478 + free_extent_buffer(left); 1569 1479 return 1; 1570 1480 } 1571 1481 1572 - if (btrfs_header_nritems(&right->header) == 0) { 1573 - btrfs_block_release(root, t); 1482 + right_nritems = btrfs_header_nritems(right); 1483 + if (right_nritems == 0) { 1484 + free_extent_buffer(left); 1574 1485 return 1; 1575 1486 } 1576 1487 1577 - for (i = 0; i < btrfs_header_nritems(&right->header) - 1; i++) { 1578 - item = right->items + i; 1488 + for (i = 0; i < right_nritems - 1; i++) { 1489 + item = btrfs_item_nr(right, i); 1579 1490 if (path->slots[0] == i) 1580 1491 push_space += data_size + sizeof(*item); 1581 - if (btrfs_item_size(item) + sizeof(*item) + push_space > 1492 + if (btrfs_item_size(right, item) + sizeof(*item) + push_space > 1582 1493 free_space) 1583 1494 break; 1584 1495 push_items++; 1585 - push_space += btrfs_item_size(item) + sizeof(*item); 1496 + push_space += btrfs_item_size(right, item) + sizeof(*item); 1586 1497 } 1587 1498 if (push_items == 0) { 1588 - btrfs_block_release(root, t); 1499 + free_extent_buffer(left); 1589 1500 return 1; 1590 1501 } 1591 - if (push_items == btrfs_header_nritems(&right->header)) 1502 + if (push_items == btrfs_header_nritems(right)) 1592 1503 WARN_ON(1); 1504 + 1593 1505 /* push data from right to left */ 1594 - btrfs_memcpy(root, left, left->items + 1595 - btrfs_header_nritems(&left->header), 1596 - right->items, push_items * sizeof(struct btrfs_item)); 1506 + copy_extent_buffer(left, right, 1507 + btrfs_item_nr_offset(btrfs_header_nritems(left)), 1508 + btrfs_item_nr_offset(0), 1509 + push_items * sizeof(struct btrfs_item)); 1510 + 1597 1511 push_space = BTRFS_LEAF_DATA_SIZE(root) - 1598 - btrfs_item_offset(right->items + push_items -1); 1599 - btrfs_memcpy(root, left, btrfs_leaf_data(left) + 1512 + btrfs_item_offset_nr(right, push_items -1); 1513 + 1514 + copy_extent_buffer(left, right, btrfs_leaf_data(left) + 1600 1515 leaf_data_end(root, left) - push_space, 1601 1516 btrfs_leaf_data(right) + 1602 - btrfs_item_offset(right->items + push_items - 1), 1517 + btrfs_item_offset_nr(right, push_items - 1), 1603 1518 push_space); 1604 - old_left_nritems = btrfs_header_nritems(&left->header); 1519 + old_left_nritems = btrfs_header_nritems(left); 1605 1520 BUG_ON(old_left_nritems < 0); 1606 1521 1607 1522 for (i = old_left_nritems; i < old_left_nritems + push_items; i++) { 1608 - u32 ioff = btrfs_item_offset(left->items + i); 1609 - btrfs_set_item_offset(left->items + i, ioff - 1610 - (BTRFS_LEAF_DATA_SIZE(root) - 1611 - btrfs_item_offset(left->items + 1612 - old_left_nritems - 1))); 1523 + u32 ioff; 1524 + item = btrfs_item_nr(left, i); 1525 + ioff = btrfs_item_offset(left, item); 1526 + btrfs_set_item_offset(left, item, 1527 + ioff - (BTRFS_LEAF_DATA_SIZE(root) - 1528 + btrfs_item_offset_nr(left, old_left_nritems - 1))); 1613 1529 } 1614 - btrfs_set_header_nritems(&left->header, old_left_nritems + push_items); 1530 + btrfs_set_header_nritems(left, old_left_nritems + push_items); 1615 1531 1616 1532 /* fixup right node */ 1617 - push_space = btrfs_item_offset(right->items + push_items - 1) - 1618 - leaf_data_end(root, right); 1619 - btrfs_memmove(root, right, btrfs_leaf_data(right) + 1620 - BTRFS_LEAF_DATA_SIZE(root) - push_space, 1621 - btrfs_leaf_data(right) + 1622 - leaf_data_end(root, right), push_space); 1623 - btrfs_memmove(root, right, right->items, right->items + push_items, 1624 - (btrfs_header_nritems(&right->header) - push_items) * 1625 - sizeof(struct btrfs_item)); 1626 - btrfs_set_header_nritems(&right->header, 1627 - btrfs_header_nritems(&right->header) - 1628 - push_items); 1533 + push_space = btrfs_item_offset_nr(right, push_items - 1) - 1534 + leaf_data_end(root, right); 1535 + memmove_extent_buffer(right, btrfs_leaf_data(right) + 1536 + BTRFS_LEAF_DATA_SIZE(root) - push_space, 1537 + btrfs_leaf_data(right) + 1538 + leaf_data_end(root, right), push_space); 1539 + 1540 + memmove_extent_buffer(right, btrfs_item_nr_offset(0), 1541 + btrfs_item_nr_offset(push_items), 1542 + (btrfs_header_nritems(right) - push_items) * 1543 + sizeof(struct btrfs_item)); 1544 + 1545 + right_nritems = btrfs_header_nritems(right) - push_items; 1546 + btrfs_set_header_nritems(right, right_nritems); 1629 1547 push_space = BTRFS_LEAF_DATA_SIZE(root); 1630 1548 1631 - for (i = 0; i < btrfs_header_nritems(&right->header); i++) { 1632 - btrfs_set_item_offset(right->items + i, push_space - 1633 - btrfs_item_size(right->items + i)); 1634 - push_space = btrfs_item_offset(right->items + i); 1549 + for (i = 0; i < right_nritems; i++) { 1550 + item = btrfs_item_nr(right, i); 1551 + btrfs_set_item_offset(right, item, push_space - 1552 + btrfs_item_size(right, item)); 1553 + push_space = btrfs_item_offset(right, item); 1635 1554 } 1636 1555 1637 - btrfs_mark_buffer_dirty(t); 1638 - btrfs_mark_buffer_dirty(right_buf); 1556 + btrfs_mark_buffer_dirty(left); 1557 + btrfs_mark_buffer_dirty(right); 1639 1558 1640 - wret = fixup_low_keys(trans, root, path, &right->items[0].key, 1); 1559 + btrfs_item_key(right, &disk_key, 0); 1560 + wret = fixup_low_keys(trans, root, path, &disk_key, 1); 1641 1561 if (wret) 1642 1562 ret = wret; 1643 1563 1644 1564 /* then fixup the leaf pointer in the path */ 1645 1565 if (path->slots[0] < push_items) { 1646 1566 path->slots[0] += old_left_nritems; 1647 - btrfs_block_release(root, path->nodes[0]); 1648 - path->nodes[0] = t; 1567 + free_extent_buffer(path->nodes[0]); 1568 + path->nodes[0] = left; 1649 1569 path->slots[1] -= 1; 1650 1570 } else { 1651 - btrfs_block_release(root, t); 1571 + free_extent_buffer(left); 1652 1572 path->slots[0] -= push_items; 1653 1573 } 1654 1574 BUG_ON(path->slots[0] < 0); ··· 1676 1578 *root, struct btrfs_key *ins_key, 1677 1579 struct btrfs_path *path, int data_size) 1678 1580 { 1679 - struct buffer_head *l_buf; 1680 - struct btrfs_leaf *l; 1581 + struct extent_buffer *l; 1681 1582 u32 nritems; 1682 1583 int mid; 1683 1584 int slot; 1684 - struct btrfs_leaf *right; 1685 - struct buffer_head *right_buffer; 1585 + struct extent_buffer *right; 1686 1586 int space_needed = data_size + sizeof(struct btrfs_item); 1687 1587 int data_copy_size; 1688 1588 int rt_data_off; ··· 1699 1603 if (wret < 0) 1700 1604 return wret; 1701 1605 } 1702 - l_buf = path->nodes[0]; 1703 - l = btrfs_buffer_leaf(l_buf); 1606 + l = path->nodes[0]; 1704 1607 1705 1608 /* did the pushes work? */ 1706 1609 if (btrfs_leaf_free_space(root, l) >= ··· 1712 1617 return ret; 1713 1618 } 1714 1619 slot = path->slots[0]; 1715 - nritems = btrfs_header_nritems(&l->header); 1620 + nritems = btrfs_header_nritems(l); 1716 1621 mid = (nritems + 1)/ 2; 1717 1622 1718 - right_buffer = btrfs_alloc_free_block(trans, root, l_buf->b_blocknr, 0); 1719 - if (IS_ERR(right_buffer)) 1720 - return PTR_ERR(right_buffer); 1623 + right = btrfs_alloc_free_block(trans, root, 1624 + extent_buffer_blocknr(l), 0); 1625 + if (IS_ERR(right)) 1626 + return PTR_ERR(right); 1721 1627 1722 - right = btrfs_buffer_leaf(right_buffer); 1723 - memset(&right->header, 0, sizeof(right->header)); 1724 - btrfs_set_header_blocknr(&right->header, bh_blocknr(right_buffer)); 1725 - btrfs_set_header_generation(&right->header, trans->transid); 1726 - btrfs_set_header_owner(&right->header, root->root_key.objectid); 1727 - btrfs_set_header_level(&right->header, 0); 1728 - memcpy(right->header.fsid, root->fs_info->disk_super->fsid, 1729 - sizeof(right->header.fsid)); 1628 + memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header)); 1629 + btrfs_set_header_blocknr(right, extent_buffer_blocknr(right)); 1630 + btrfs_set_header_generation(right, trans->transid); 1631 + btrfs_set_header_owner(right, root->root_key.objectid); 1632 + btrfs_set_header_level(right, 0); 1633 + write_extent_buffer(right, root->fs_info->fsid, 1634 + (unsigned long)btrfs_header_fsid(right), 1635 + BTRFS_FSID_SIZE); 1636 + 1730 1637 if (mid <= slot) { 1731 1638 if (nritems == 1 || 1732 1639 leaf_space_used(l, mid, nritems - mid) + space_needed > 1733 1640 BTRFS_LEAF_DATA_SIZE(root)) { 1734 1641 if (slot >= nritems) { 1735 1642 btrfs_cpu_key_to_disk(&disk_key, ins_key); 1736 - btrfs_set_header_nritems(&right->header, 0); 1643 + btrfs_set_header_nritems(right, 0); 1737 1644 wret = insert_ptr(trans, root, path, 1738 1645 &disk_key, 1739 - bh_blocknr(right_buffer), 1646 + extent_buffer_blocknr(right), 1740 1647 path->slots[1] + 1, 1); 1741 1648 if (wret) 1742 1649 ret = wret; 1743 - btrfs_block_release(root, path->nodes[0]); 1744 - path->nodes[0] = right_buffer; 1650 + free_extent_buffer(path->nodes[0]); 1651 + path->nodes[0] = right; 1745 1652 path->slots[0] = 0; 1746 1653 path->slots[1] += 1; 1747 1654 return ret; ··· 1756 1659 BTRFS_LEAF_DATA_SIZE(root)) { 1757 1660 if (slot == 0) { 1758 1661 btrfs_cpu_key_to_disk(&disk_key, ins_key); 1759 - btrfs_set_header_nritems(&right->header, 0); 1662 + btrfs_set_header_nritems(right, 0); 1760 1663 wret = insert_ptr(trans, root, path, 1761 1664 &disk_key, 1762 - bh_blocknr(right_buffer), 1665 + extent_buffer_blocknr(right), 1763 1666 path->slots[1], 1); 1764 1667 if (wret) 1765 1668 ret = wret; 1766 - btrfs_block_release(root, path->nodes[0]); 1767 - path->nodes[0] = right_buffer; 1669 + free_extent_buffer(path->nodes[0]); 1670 + path->nodes[0] = right; 1768 1671 path->slots[0] = 0; 1769 1672 if (path->slots[1] == 0) { 1770 1673 wret = fixup_low_keys(trans, root, ··· 1778 1681 double_split = 1; 1779 1682 } 1780 1683 } 1781 - btrfs_set_header_nritems(&right->header, nritems - mid); 1782 - data_copy_size = btrfs_item_end(l->items + mid) - 1783 - leaf_data_end(root, l); 1784 - btrfs_memcpy(root, right, right->items, l->items + mid, 1785 - (nritems - mid) * sizeof(struct btrfs_item)); 1786 - btrfs_memcpy(root, right, 1684 + nritems = nritems - mid; 1685 + btrfs_set_header_nritems(right, nritems); 1686 + data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(root, l); 1687 + 1688 + copy_extent_buffer(right, l, btrfs_item_nr_offset(0), 1689 + btrfs_item_nr_offset(mid), 1690 + nritems * sizeof(struct btrfs_item)); 1691 + 1692 + copy_extent_buffer(right, l, 1787 1693 btrfs_leaf_data(right) + BTRFS_LEAF_DATA_SIZE(root) - 1788 1694 data_copy_size, btrfs_leaf_data(l) + 1789 1695 leaf_data_end(root, l), data_copy_size); 1790 - rt_data_off = BTRFS_LEAF_DATA_SIZE(root) - 1791 - btrfs_item_end(l->items + mid); 1792 1696 1793 - for (i = 0; i < btrfs_header_nritems(&right->header); i++) { 1794 - u32 ioff = btrfs_item_offset(right->items + i); 1795 - btrfs_set_item_offset(right->items + i, ioff + rt_data_off); 1697 + rt_data_off = BTRFS_LEAF_DATA_SIZE(root) - 1698 + btrfs_item_end_nr(l, mid); 1699 + 1700 + for (i = 0; i < nritems; i++) { 1701 + struct btrfs_item *item = btrfs_item_nr(right, i); 1702 + u32 ioff = btrfs_item_offset(right, item); 1703 + btrfs_set_item_offset(right, item, ioff + rt_data_off); 1796 1704 } 1797 1705 1798 - btrfs_set_header_nritems(&l->header, mid); 1706 + btrfs_set_header_nritems(l, mid); 1799 1707 ret = 0; 1800 - wret = insert_ptr(trans, root, path, &right->items[0].key, 1801 - bh_blocknr(right_buffer), path->slots[1] + 1, 1); 1708 + btrfs_item_key(right, &disk_key, 0); 1709 + wret = insert_ptr(trans, root, path, &disk_key, 1710 + extent_buffer_blocknr(right), path->slots[1] + 1, 1); 1802 1711 if (wret) 1803 1712 ret = wret; 1804 - btrfs_mark_buffer_dirty(right_buffer); 1805 - btrfs_mark_buffer_dirty(l_buf); 1713 + 1714 + btrfs_mark_buffer_dirty(right); 1715 + btrfs_mark_buffer_dirty(l); 1806 1716 BUG_ON(path->slots[0] != slot); 1717 + 1807 1718 if (mid <= slot) { 1808 - btrfs_block_release(root, path->nodes[0]); 1809 - path->nodes[0] = right_buffer; 1719 + free_extent_buffer(path->nodes[0]); 1720 + path->nodes[0] = right; 1810 1721 path->slots[0] -= mid; 1811 1722 path->slots[1] += 1; 1812 1723 } else 1813 - btrfs_block_release(root, right_buffer); 1724 + free_extent_buffer(right); 1725 + 1814 1726 BUG_ON(path->slots[0] < 0); 1815 1727 check_node(root, path, 1); 1728 + check_leaf(root, path, 0); 1816 1729 1817 1730 if (!double_split) 1818 1731 return ret; 1819 - right_buffer = btrfs_alloc_free_block(trans, root, l_buf->b_blocknr, 0); 1820 - if (IS_ERR(right_buffer)) 1821 - return PTR_ERR(right_buffer); 1822 1732 1823 - right = btrfs_buffer_leaf(right_buffer); 1824 - memset(&right->header, 0, sizeof(right->header)); 1825 - btrfs_set_header_blocknr(&right->header, bh_blocknr(right_buffer)); 1826 - btrfs_set_header_generation(&right->header, trans->transid); 1827 - btrfs_set_header_owner(&right->header, root->root_key.objectid); 1828 - btrfs_set_header_level(&right->header, 0); 1829 - memcpy(right->header.fsid, root->fs_info->disk_super->fsid, 1830 - sizeof(right->header.fsid)); 1733 + right = btrfs_alloc_free_block(trans, root, 1734 + extent_buffer_blocknr(l), 0); 1735 + if (IS_ERR(right)) 1736 + return PTR_ERR(right); 1737 + 1738 + memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header)); 1739 + btrfs_set_header_blocknr(right, extent_buffer_blocknr(right)); 1740 + btrfs_set_header_generation(right, trans->transid); 1741 + btrfs_set_header_owner(right, root->root_key.objectid); 1742 + btrfs_set_header_level(right, 0); 1743 + write_extent_buffer(right, root->fs_info->fsid, 1744 + (unsigned long)btrfs_header_fsid(right), 1745 + BTRFS_FSID_SIZE); 1746 + 1831 1747 btrfs_cpu_key_to_disk(&disk_key, ins_key); 1832 - btrfs_set_header_nritems(&right->header, 0); 1748 + btrfs_set_header_nritems(right, 0); 1833 1749 wret = insert_ptr(trans, root, path, 1834 1750 &disk_key, 1835 - bh_blocknr(right_buffer), 1751 + extent_buffer_blocknr(right), 1836 1752 path->slots[1], 1); 1837 1753 if (wret) 1838 1754 ret = wret; ··· 1854 1744 if (wret) 1855 1745 ret = wret; 1856 1746 } 1857 - btrfs_block_release(root, path->nodes[0]); 1858 - path->nodes[0] = right_buffer; 1747 + free_extent_buffer(path->nodes[0]); 1748 + path->nodes[0] = right; 1859 1749 path->slots[0] = 0; 1860 1750 check_node(root, path, 1); 1861 1751 check_leaf(root, path, 0); ··· 1870 1760 int ret = 0; 1871 1761 int slot; 1872 1762 int slot_orig; 1873 - struct btrfs_leaf *leaf; 1874 - struct buffer_head *leaf_buf; 1763 + struct extent_buffer *leaf; 1764 + struct btrfs_item *item; 1875 1765 u32 nritems; 1876 1766 unsigned int data_end; 1877 1767 unsigned int old_data_start; ··· 1880 1770 int i; 1881 1771 1882 1772 slot_orig = path->slots[0]; 1883 - leaf_buf = path->nodes[0]; 1884 - leaf = btrfs_buffer_leaf(leaf_buf); 1773 + leaf = path->nodes[0]; 1885 1774 1886 - nritems = btrfs_header_nritems(&leaf->header); 1775 + nritems = btrfs_header_nritems(leaf); 1887 1776 data_end = leaf_data_end(root, leaf); 1888 1777 1889 1778 slot = path->slots[0]; 1890 - old_data_start = btrfs_item_offset(leaf->items + slot); 1891 - old_size = btrfs_item_size(leaf->items + slot); 1779 + old_data_start = btrfs_item_offset_nr(leaf, slot); 1780 + old_size = btrfs_item_size_nr(leaf, slot); 1892 1781 BUG_ON(old_size <= new_size); 1893 1782 size_diff = old_size - new_size; 1894 1783 ··· 1899 1790 */ 1900 1791 /* first correct the data pointers */ 1901 1792 for (i = slot; i < nritems; i++) { 1902 - u32 ioff = btrfs_item_offset(leaf->items + i); 1903 - btrfs_set_item_offset(leaf->items + i, 1904 - ioff + size_diff); 1793 + u32 ioff; 1794 + item = btrfs_item_nr(leaf, i); 1795 + ioff = btrfs_item_offset(leaf, item); 1796 + btrfs_set_item_offset(leaf, item, ioff + size_diff); 1905 1797 } 1906 1798 /* shift the data */ 1907 - btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) + 1799 + memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + 1908 1800 data_end + size_diff, btrfs_leaf_data(leaf) + 1909 1801 data_end, old_data_start + new_size - data_end); 1910 - btrfs_set_item_size(leaf->items + slot, new_size); 1911 - btrfs_mark_buffer_dirty(leaf_buf); 1802 + 1803 + item = btrfs_item_nr(leaf, slot); 1804 + btrfs_set_item_size(leaf, item, new_size); 1805 + btrfs_mark_buffer_dirty(leaf); 1912 1806 1913 1807 ret = 0; 1914 - if (btrfs_leaf_free_space(root, leaf) < 0) 1808 + if (btrfs_leaf_free_space(root, leaf) < 0) { 1809 + btrfs_print_leaf(root, leaf); 1915 1810 BUG(); 1811 + } 1916 1812 check_leaf(root, path, 0); 1917 1813 return ret; 1918 1814 } 1919 1815 1920 - int btrfs_extend_item(struct btrfs_trans_handle *trans, struct btrfs_root 1921 - *root, struct btrfs_path *path, u32 data_size) 1816 + int btrfs_extend_item(struct btrfs_trans_handle *trans, 1817 + struct btrfs_root *root, struct btrfs_path *path, 1818 + u32 data_size) 1922 1819 { 1923 1820 int ret = 0; 1924 1821 int slot; 1925 1822 int slot_orig; 1926 - struct btrfs_leaf *leaf; 1927 - struct buffer_head *leaf_buf; 1823 + struct extent_buffer *leaf; 1824 + struct btrfs_item *item; 1928 1825 u32 nritems; 1929 1826 unsigned int data_end; 1930 1827 unsigned int old_data; ··· 1938 1823 int i; 1939 1824 1940 1825 slot_orig = path->slots[0]; 1941 - leaf_buf = path->nodes[0]; 1942 - leaf = btrfs_buffer_leaf(leaf_buf); 1826 + leaf = path->nodes[0]; 1943 1827 1944 - nritems = btrfs_header_nritems(&leaf->header); 1828 + nritems = btrfs_header_nritems(leaf); 1945 1829 data_end = leaf_data_end(root, leaf); 1946 1830 1947 - if (btrfs_leaf_free_space(root, leaf) < data_size) 1831 + if (btrfs_leaf_free_space(root, leaf) < data_size) { 1832 + btrfs_print_leaf(root, leaf); 1948 1833 BUG(); 1834 + } 1949 1835 slot = path->slots[0]; 1950 - old_data = btrfs_item_end(leaf->items + slot); 1836 + old_data = btrfs_item_end_nr(leaf, slot); 1951 1837 1952 1838 BUG_ON(slot < 0); 1953 1839 BUG_ON(slot >= nritems); ··· 1958 1842 */ 1959 1843 /* first correct the data pointers */ 1960 1844 for (i = slot; i < nritems; i++) { 1961 - u32 ioff = btrfs_item_offset(leaf->items + i); 1962 - btrfs_set_item_offset(leaf->items + i, 1963 - ioff - data_size); 1845 + u32 ioff; 1846 + item = btrfs_item_nr(leaf, i); 1847 + ioff = btrfs_item_offset(leaf, item); 1848 + btrfs_set_item_offset(leaf, item, ioff - data_size); 1964 1849 } 1850 + 1965 1851 /* shift the data */ 1966 - btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) + 1852 + memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + 1967 1853 data_end - data_size, btrfs_leaf_data(leaf) + 1968 1854 data_end, old_data - data_end); 1855 + 1969 1856 data_end = old_data; 1970 - old_size = btrfs_item_size(leaf->items + slot); 1971 - btrfs_set_item_size(leaf->items + slot, old_size + data_size); 1972 - btrfs_mark_buffer_dirty(leaf_buf); 1857 + old_size = btrfs_item_size_nr(leaf, slot); 1858 + item = btrfs_item_nr(leaf, slot); 1859 + btrfs_set_item_size(leaf, item, old_size + data_size); 1860 + btrfs_mark_buffer_dirty(leaf); 1973 1861 1974 1862 ret = 0; 1975 - if (btrfs_leaf_free_space(root, leaf) < 0) 1863 + if (btrfs_leaf_free_space(root, leaf) < 0) { 1864 + btrfs_print_leaf(root, leaf); 1976 1865 BUG(); 1866 + } 1977 1867 check_leaf(root, path, 0); 1978 1868 return ret; 1979 1869 } ··· 1988 1866 * Given a key and some data, insert an item into the tree. 1989 1867 * This does all the path init required, making room in the tree if needed. 1990 1868 */ 1991 - int btrfs_insert_empty_item(struct btrfs_trans_handle *trans, struct btrfs_root 1992 - *root, struct btrfs_path *path, struct btrfs_key 1993 - *cpu_key, u32 data_size) 1869 + int btrfs_insert_empty_item(struct btrfs_trans_handle *trans, 1870 + struct btrfs_root *root, 1871 + struct btrfs_path *path, 1872 + struct btrfs_key *cpu_key, u32 data_size) 1994 1873 { 1874 + struct extent_buffer *leaf; 1875 + struct btrfs_item *item; 1995 1876 int ret = 0; 1996 1877 int slot; 1997 1878 int slot_orig; 1998 - struct btrfs_leaf *leaf; 1999 - struct buffer_head *leaf_buf; 2000 1879 u32 nritems; 2001 1880 unsigned int data_end; 2002 1881 struct btrfs_disk_key disk_key; ··· 2007 1884 /* create a root if there isn't one */ 2008 1885 if (!root->node) 2009 1886 BUG(); 1887 + 2010 1888 ret = btrfs_search_slot(trans, root, cpu_key, path, data_size, 1); 2011 1889 if (ret == 0) { 2012 1890 return -EEXIST; ··· 2016 1892 goto out; 2017 1893 2018 1894 slot_orig = path->slots[0]; 2019 - leaf_buf = path->nodes[0]; 2020 - leaf = btrfs_buffer_leaf(leaf_buf); 1895 + leaf = path->nodes[0]; 2021 1896 2022 - nritems = btrfs_header_nritems(&leaf->header); 1897 + nritems = btrfs_header_nritems(leaf); 2023 1898 data_end = leaf_data_end(root, leaf); 2024 1899 2025 1900 if (btrfs_leaf_free_space(root, leaf) < 2026 1901 sizeof(struct btrfs_item) + data_size) { 2027 1902 BUG(); 2028 1903 } 1904 + 2029 1905 slot = path->slots[0]; 2030 1906 BUG_ON(slot < 0); 1907 + 2031 1908 if (slot != nritems) { 2032 1909 int i; 2033 - unsigned int old_data = btrfs_item_end(leaf->items + slot); 1910 + unsigned int old_data = btrfs_item_end_nr(leaf, slot); 2034 1911 1912 + if (old_data < data_end) { 1913 + btrfs_print_leaf(root, leaf); 1914 + printk("slot %d old_data %d data_end %d\n", 1915 + slot, old_data, data_end); 1916 + BUG_ON(1); 1917 + } 2035 1918 /* 2036 1919 * item0..itemN ... dataN.offset..dataN.size .. data0.size 2037 1920 */ 2038 1921 /* first correct the data pointers */ 2039 1922 for (i = slot; i < nritems; i++) { 2040 - u32 ioff = btrfs_item_offset(leaf->items + i); 2041 - btrfs_set_item_offset(leaf->items + i, 2042 - ioff - data_size); 1923 + u32 ioff; 1924 + item = btrfs_item_nr(leaf, i); 1925 + ioff = btrfs_item_offset(leaf, item); 1926 + btrfs_set_item_offset(leaf, item, ioff - data_size); 2043 1927 } 2044 1928 2045 1929 /* shift the items */ 2046 - btrfs_memmove(root, leaf, leaf->items + slot + 1, 2047 - leaf->items + slot, 1930 + memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + 1), 1931 + btrfs_item_nr_offset(slot), 2048 1932 (nritems - slot) * sizeof(struct btrfs_item)); 2049 1933 2050 1934 /* shift the data */ 2051 - btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) + 1935 + memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + 2052 1936 data_end - data_size, btrfs_leaf_data(leaf) + 2053 1937 data_end, old_data - data_end); 2054 1938 data_end = old_data; 2055 1939 } 1940 + 2056 1941 /* setup the item for the new data */ 2057 - btrfs_memcpy(root, leaf, &leaf->items[slot].key, &disk_key, 2058 - sizeof(struct btrfs_disk_key)); 2059 - btrfs_set_item_offset(leaf->items + slot, data_end - data_size); 2060 - btrfs_set_item_size(leaf->items + slot, data_size); 2061 - btrfs_set_header_nritems(&leaf->header, nritems + 1); 2062 - btrfs_mark_buffer_dirty(leaf_buf); 1942 + btrfs_set_item_key(leaf, &disk_key, slot); 1943 + item = btrfs_item_nr(leaf, slot); 1944 + btrfs_set_item_offset(leaf, item, data_end - data_size); 1945 + btrfs_set_item_size(leaf, item, data_size); 1946 + btrfs_set_header_nritems(leaf, nritems + 1); 1947 + btrfs_mark_buffer_dirty(leaf); 2063 1948 2064 1949 ret = 0; 2065 1950 if (slot == 0) 2066 1951 ret = fixup_low_keys(trans, root, path, &disk_key, 1); 2067 1952 2068 - if (btrfs_leaf_free_space(root, leaf) < 0) 1953 + if (btrfs_leaf_free_space(root, leaf) < 0) { 1954 + btrfs_print_leaf(root, leaf); 2069 1955 BUG(); 1956 + } 2070 1957 check_leaf(root, path, 0); 2071 1958 out: 2072 1959 return ret; ··· 2093 1958 { 2094 1959 int ret = 0; 2095 1960 struct btrfs_path *path; 2096 - u8 *ptr; 1961 + struct extent_buffer *leaf; 1962 + unsigned long ptr; 2097 1963 2098 1964 path = btrfs_alloc_path(); 2099 1965 BUG_ON(!path); 2100 1966 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); 2101 1967 if (!ret) { 2102 - ptr = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 2103 - path->slots[0], u8); 2104 - btrfs_memcpy(root, path->nodes[0]->b_data, 2105 - ptr, data, data_size); 2106 - btrfs_mark_buffer_dirty(path->nodes[0]); 1968 + leaf = path->nodes[0]; 1969 + ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); 1970 + write_extent_buffer(leaf, data, ptr, data_size); 1971 + btrfs_mark_buffer_dirty(leaf); 2107 1972 } 2108 1973 btrfs_free_path(path); 2109 1974 return ret; ··· 2119 1984 static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root, 2120 1985 struct btrfs_path *path, int level, int slot) 2121 1986 { 2122 - struct btrfs_node *node; 2123 - struct buffer_head *parent = path->nodes[level]; 1987 + struct extent_buffer *parent = path->nodes[level]; 2124 1988 u32 nritems; 2125 1989 int ret = 0; 2126 1990 int wret; 2127 1991 2128 - node = btrfs_buffer_node(parent); 2129 - nritems = btrfs_header_nritems(&node->header); 1992 + nritems = btrfs_header_nritems(parent); 2130 1993 if (slot != nritems -1) { 2131 - btrfs_memmove(root, node, node->ptrs + slot, 2132 - node->ptrs + slot + 1, 1994 + memmove_extent_buffer(parent, 1995 + btrfs_node_key_ptr_offset(slot), 1996 + btrfs_node_key_ptr_offset(slot + 1), 2133 1997 sizeof(struct btrfs_key_ptr) * 2134 1998 (nritems - slot - 1)); 2135 1999 } 2136 2000 nritems--; 2137 - btrfs_set_header_nritems(&node->header, nritems); 2001 + btrfs_set_header_nritems(parent, nritems); 2138 2002 if (nritems == 0 && parent == root->node) { 2139 - struct btrfs_header *header = btrfs_buffer_header(root->node); 2140 - BUG_ON(btrfs_header_level(header) != 1); 2003 + BUG_ON(btrfs_header_level(root->node) != 1); 2141 2004 /* just turn the root into a leaf and break */ 2142 - btrfs_set_header_level(header, 0); 2005 + btrfs_set_header_level(root->node, 0); 2143 2006 } else if (slot == 0) { 2144 - wret = fixup_low_keys(trans, root, path, &node->ptrs[0].key, 2145 - level + 1); 2007 + struct btrfs_disk_key disk_key; 2008 + 2009 + btrfs_node_key(parent, &disk_key, 0); 2010 + wret = fixup_low_keys(trans, root, path, &disk_key, level + 1); 2146 2011 if (wret) 2147 2012 ret = wret; 2148 2013 } ··· 2158 2023 struct btrfs_path *path) 2159 2024 { 2160 2025 int slot; 2161 - struct btrfs_leaf *leaf; 2162 - struct buffer_head *leaf_buf; 2026 + struct extent_buffer *leaf; 2027 + struct btrfs_item *item; 2163 2028 int doff; 2164 2029 int dsize; 2165 2030 int ret = 0; 2166 2031 int wret; 2167 2032 u32 nritems; 2168 2033 2169 - leaf_buf = path->nodes[0]; 2170 - leaf = btrfs_buffer_leaf(leaf_buf); 2034 + leaf = path->nodes[0]; 2171 2035 slot = path->slots[0]; 2172 - doff = btrfs_item_offset(leaf->items + slot); 2173 - dsize = btrfs_item_size(leaf->items + slot); 2174 - nritems = btrfs_header_nritems(&leaf->header); 2036 + doff = btrfs_item_offset_nr(leaf, slot); 2037 + dsize = btrfs_item_size_nr(leaf, slot); 2038 + nritems = btrfs_header_nritems(leaf); 2175 2039 2176 2040 if (slot != nritems - 1) { 2177 2041 int i; 2178 2042 int data_end = leaf_data_end(root, leaf); 2179 - btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) + 2043 + 2044 + memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + 2180 2045 data_end + dsize, 2181 2046 btrfs_leaf_data(leaf) + data_end, 2182 2047 doff - data_end); 2048 + 2183 2049 for (i = slot + 1; i < nritems; i++) { 2184 - u32 ioff = btrfs_item_offset(leaf->items + i); 2185 - btrfs_set_item_offset(leaf->items + i, ioff + dsize); 2050 + u32 ioff; 2051 + item = btrfs_item_nr(leaf, i); 2052 + ioff = btrfs_item_offset(leaf, item); 2053 + btrfs_set_item_offset(leaf, item, ioff + dsize); 2186 2054 } 2187 - btrfs_memmove(root, leaf, leaf->items + slot, 2188 - leaf->items + slot + 1, 2055 + memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot), 2056 + btrfs_item_nr_offset(slot + 1), 2189 2057 sizeof(struct btrfs_item) * 2190 2058 (nritems - slot - 1)); 2191 2059 } 2192 - btrfs_set_header_nritems(&leaf->header, nritems - 1); 2060 + btrfs_set_header_nritems(leaf, nritems - 1); 2193 2061 nritems--; 2062 + 2194 2063 /* delete the leaf if we've emptied it */ 2195 2064 if (nritems == 0) { 2196 - if (leaf_buf == root->node) { 2197 - btrfs_set_header_level(&leaf->header, 0); 2065 + if (leaf == root->node) { 2066 + btrfs_set_header_level(leaf, 0); 2198 2067 } else { 2199 - clean_tree_block(trans, root, leaf_buf); 2200 - wait_on_buffer(leaf_buf); 2068 + clean_tree_block(trans, root, leaf); 2069 + wait_on_tree_block_writeback(root, leaf); 2201 2070 wret = del_ptr(trans, root, path, 1, path->slots[1]); 2202 2071 if (wret) 2203 2072 ret = wret; 2204 2073 wret = btrfs_free_extent(trans, root, 2205 - bh_blocknr(leaf_buf), 1, 1); 2074 + extent_buffer_blocknr(leaf), 2075 + 1, 1); 2206 2076 if (wret) 2207 2077 ret = wret; 2208 2078 } 2209 2079 } else { 2210 2080 int used = leaf_space_used(leaf, 0, nritems); 2211 2081 if (slot == 0) { 2082 + struct btrfs_disk_key disk_key; 2083 + 2084 + btrfs_item_key(leaf, &disk_key, 0); 2212 2085 wret = fixup_low_keys(trans, root, path, 2213 - &leaf->items[0].key, 1); 2086 + &disk_key, 1); 2214 2087 if (wret) 2215 2088 ret = wret; 2216 2089 } ··· 2230 2087 * for possible call to del_ptr below 2231 2088 */ 2232 2089 slot = path->slots[1]; 2233 - get_bh(leaf_buf); 2090 + extent_buffer_get(leaf); 2091 + 2234 2092 wret = push_leaf_left(trans, root, path, 1); 2235 2093 if (wret < 0 && wret != -ENOSPC) 2236 2094 ret = wret; 2237 - if (path->nodes[0] == leaf_buf && 2238 - btrfs_header_nritems(&leaf->header)) { 2095 + 2096 + if (path->nodes[0] == leaf && 2097 + btrfs_header_nritems(leaf)) { 2239 2098 wret = push_leaf_right(trans, root, path, 1); 2240 2099 if (wret < 0 && wret != -ENOSPC) 2241 2100 ret = wret; 2242 2101 } 2243 - if (btrfs_header_nritems(&leaf->header) == 0) { 2244 - u64 blocknr = bh_blocknr(leaf_buf); 2245 - clean_tree_block(trans, root, leaf_buf); 2246 - wait_on_buffer(leaf_buf); 2102 + 2103 + if (btrfs_header_nritems(leaf) == 0) { 2104 + u64 blocknr = extent_buffer_blocknr(leaf); 2105 + 2106 + clean_tree_block(trans, root, leaf); 2107 + wait_on_tree_block_writeback(root, leaf); 2108 + 2247 2109 wret = del_ptr(trans, root, path, 1, slot); 2248 2110 if (wret) 2249 2111 ret = wret; 2250 - btrfs_block_release(root, leaf_buf); 2112 + 2113 + free_extent_buffer(leaf); 2251 2114 wret = btrfs_free_extent(trans, root, blocknr, 2252 2115 1, 1); 2253 2116 if (wret) 2254 2117 ret = wret; 2255 2118 } else { 2256 - btrfs_mark_buffer_dirty(leaf_buf); 2257 - btrfs_block_release(root, leaf_buf); 2119 + btrfs_mark_buffer_dirty(leaf); 2120 + free_extent_buffer(leaf); 2258 2121 } 2259 2122 } else { 2260 - btrfs_mark_buffer_dirty(leaf_buf); 2123 + btrfs_mark_buffer_dirty(leaf); 2261 2124 } 2262 2125 } 2263 2126 return ret; ··· 2279 2130 int slot; 2280 2131 int level = 1; 2281 2132 u64 blocknr; 2282 - struct buffer_head *c; 2283 - struct btrfs_node *c_node; 2284 - struct buffer_head *next = NULL; 2133 + struct extent_buffer *c; 2134 + struct extent_buffer *next = NULL; 2285 2135 2286 2136 while(level < BTRFS_MAX_LEVEL) { 2287 2137 if (!path->nodes[level]) 2288 2138 return 1; 2139 + 2289 2140 slot = path->slots[level] + 1; 2290 2141 c = path->nodes[level]; 2291 - c_node = btrfs_buffer_node(c); 2292 - if (slot >= btrfs_header_nritems(&c_node->header)) { 2142 + if (slot >= btrfs_header_nritems(c)) { 2293 2143 level++; 2294 2144 continue; 2295 2145 } 2296 - blocknr = btrfs_node_blockptr(c_node, slot); 2146 + 2147 + blocknr = btrfs_node_blockptr(c, slot); 2297 2148 if (next) 2298 - btrfs_block_release(root, next); 2149 + free_extent_buffer(next); 2150 + 2299 2151 if (path->reada) 2300 2152 reada_for_search(root, path, level, slot); 2153 + 2301 2154 next = read_tree_block(root, blocknr); 2302 2155 break; 2303 2156 } ··· 2307 2156 while(1) { 2308 2157 level--; 2309 2158 c = path->nodes[level]; 2310 - btrfs_block_release(root, c); 2159 + free_extent_buffer(c); 2311 2160 path->nodes[level] = next; 2312 2161 path->slots[level] = 0; 2313 2162 if (!level) 2314 2163 break; 2315 2164 if (path->reada) 2316 2165 reada_for_search(root, path, level, 0); 2317 - next = read_tree_block(root, 2318 - btrfs_node_blockptr(btrfs_buffer_node(next), 0)); 2166 + next = read_tree_block(root, btrfs_node_blockptr(next, 0)); 2319 2167 } 2320 2168 return 0; 2321 2169 }
+326 -545
fs/btrfs/ctree.h
··· 20 20 #define __BTRFS__ 21 21 22 22 #include <linux/fs.h> 23 - #include <linux/buffer_head.h> 24 23 #include <linux/workqueue.h> 25 24 #include <linux/completion.h> 26 25 #include "bit-radix.h" 26 + #include "extent_map.h" 27 27 28 28 struct btrfs_trans_handle; 29 29 struct btrfs_transaction; ··· 32 32 extern struct kmem_cache *btrfs_bit_radix_cachep; 33 33 extern struct kmem_cache *btrfs_path_cachep; 34 34 35 - #define BTRFS_MAGIC "_BtRfS_M" 35 + #define BTRFS_MAGIC "_B2RfS_M" 36 36 37 37 #define BTRFS_ROOT_TREE_OBJECTID 1ULL 38 38 #define BTRFS_EXTENT_TREE_OBJECTID 2ULL ··· 78 78 */ 79 79 struct btrfs_disk_key { 80 80 __le64 objectid; 81 - __le32 flags; 81 + u8 type; 82 82 __le64 offset; 83 83 } __attribute__ ((__packed__)); 84 84 85 85 struct btrfs_key { 86 86 u64 objectid; 87 - u32 flags; 87 + u8 type; 88 88 u64 offset; 89 89 } __attribute__ ((__packed__)); 90 90 91 + #define BTRFS_FSID_SIZE 16 91 92 /* 92 93 * every tree block (leaf or node) starts with this header. 93 94 */ 94 95 struct btrfs_header { 95 96 u8 csum[BTRFS_CSUM_SIZE]; 96 - u8 fsid[16]; /* FS specific uuid */ 97 + u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */ 97 98 __le64 blocknr; /* which block this node is supposed to live in */ 98 99 __le64 generation; 99 100 __le64 owner; 100 - __le16 nritems; 101 + __le32 nritems; 101 102 __le16 flags; 102 103 u8 level; 103 104 } __attribute__ ((__packed__)); 104 105 105 106 #define BTRFS_MAX_LEVEL 8 106 - #define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->blocksize - \ 107 + #define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->nodesize - \ 107 108 sizeof(struct btrfs_header)) / \ 108 109 (sizeof(struct btrfs_disk_key) + sizeof(u64))) 109 110 #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header)) 110 - #define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->blocksize)) 111 + #define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->leafsize)) 111 112 #define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \ 112 113 sizeof(struct btrfs_item) - \ 113 114 sizeof(struct btrfs_file_extent_item)) 114 115 115 - struct buffer_head; 116 116 /* 117 117 * the super block basically lists the main trees of the FS 118 118 * it currently lacks any block count etc etc ··· 128 128 __le64 total_blocks; 129 129 __le64 blocks_used; 130 130 __le64 root_dir_objectid; 131 - __le32 blocksize; 131 + __le32 sectorsize; 132 + __le32 nodesize; 133 + __le32 leafsize; 132 134 } __attribute__ ((__packed__)); 133 135 134 136 /* ··· 140 138 struct btrfs_item { 141 139 struct btrfs_disk_key key; 142 140 __le32 offset; 143 - __le16 size; 141 + __le32 size; 144 142 } __attribute__ ((__packed__)); 145 143 146 144 /* ··· 178 176 * used while walking the tree. 179 177 */ 180 178 struct btrfs_path { 181 - struct buffer_head *nodes[BTRFS_MAX_LEVEL]; 179 + struct extent_buffer *nodes[BTRFS_MAX_LEVEL]; 182 180 int slots[BTRFS_MAX_LEVEL]; 183 181 int reada; 184 182 int lowest_level; ··· 294 292 }; 295 293 296 294 struct btrfs_fs_info { 295 + u8 fsid[BTRFS_FSID_SIZE]; 297 296 struct btrfs_root *extent_root; 298 297 struct btrfs_root *tree_root; 299 298 struct radix_tree_root fs_roots_radix; ··· 307 304 u64 generation; 308 305 u64 last_trans_committed; 309 306 struct btrfs_transaction *running_transaction; 310 - struct btrfs_super_block *disk_super; 311 307 struct btrfs_super_block super_copy; 312 - struct buffer_head *sb_buffer; 308 + struct extent_buffer *sb_buffer; 313 309 struct super_block *sb; 314 310 struct inode *btree_inode; 315 311 struct mutex trans_mutex; ··· 327 325 * and for the extent tree extent_root root. 328 326 */ 329 327 struct btrfs_root { 330 - struct buffer_head *node; 331 - struct buffer_head *commit_root; 328 + struct extent_buffer *node; 329 + struct extent_buffer *commit_root; 332 330 struct btrfs_root_item root_item; 333 331 struct btrfs_key root_key; 334 332 struct btrfs_fs_info *fs_info; ··· 338 336 struct rw_semaphore snap_sem; 339 337 u64 objectid; 340 338 u64 last_trans; 341 - u32 blocksize; 339 + 340 + /* data allocations are done in sectorsize units */ 341 + u32 sectorsize; 342 + 343 + /* node allocations are done in nodesize units */ 344 + u32 nodesize; 345 + 346 + /* leaf allocations are done in leafsize units */ 347 + u32 leafsize; 348 + 342 349 u32 type; 343 350 u64 highest_inode; 344 351 u64 last_inode_alloc; ··· 357 346 int defrag_level; 358 347 char *name; 359 348 }; 360 - 361 - /* the lower bits in the key flags defines the item type */ 362 - #define BTRFS_KEY_TYPE_MAX 256 363 - #define BTRFS_KEY_TYPE_SHIFT 24 364 - #define BTRFS_KEY_TYPE_MASK (((u32)BTRFS_KEY_TYPE_MAX - 1) << \ 365 - BTRFS_KEY_TYPE_SHIFT) 366 349 367 350 /* 368 351 * inode items have the data typically returned from stat and store other ··· 407 402 */ 408 403 #define BTRFS_STRING_ITEM_KEY 253 409 404 405 + /* some macros to generate set/get funcs for the struct fields. This 406 + * assumes there is a lefoo_to_cpu for every type, so lets make a simple 407 + * one for u8: 408 + */ 409 + #define le8_to_cpu(v) (v) 410 + #define cpu_to_le8(v) (v) 411 + #define __le8 u8 410 412 411 - static inline u64 btrfs_block_group_used(struct btrfs_block_group_item *bi) 412 - { 413 - return le64_to_cpu(bi->used); 413 + #define read_eb_member(eb, ptr, type, member, result) ( \ 414 + read_extent_buffer(eb, (char *)(result), \ 415 + ((unsigned long)(ptr)) + \ 416 + offsetof(type, member), \ 417 + sizeof(((type *)0)->member))) 418 + 419 + #define write_eb_member(eb, ptr, type, member, result) ( \ 420 + write_extent_buffer(eb, (char *)(result), \ 421 + ((unsigned long)(ptr)) + \ 422 + offsetof(type, member), \ 423 + sizeof(((type *)0)->member))) 424 + 425 + #define BTRFS_SETGET_FUNCS(name, type, member, bits) \ 426 + static inline u##bits btrfs_##name(struct extent_buffer *eb, \ 427 + type *s) \ 428 + { \ 429 + __le##bits res; \ 430 + read_eb_member(eb, s, type, member, &res); \ 431 + return le##bits##_to_cpu(res); \ 432 + } \ 433 + static inline void btrfs_set_##name(struct extent_buffer *eb, \ 434 + type *s, u##bits val) \ 435 + { \ 436 + val = cpu_to_le##bits(val); \ 437 + write_eb_member(eb, s, type, member, &val); \ 414 438 } 415 439 416 - static inline void btrfs_set_block_group_used(struct 417 - btrfs_block_group_item *bi, 418 - u64 val) 419 - { 420 - bi->used = cpu_to_le64(val); 440 + #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \ 441 + static inline u##bits btrfs_##name(struct extent_buffer *eb) \ 442 + { \ 443 + __le##bits res; \ 444 + read_eb_member(eb, NULL, type, member, &res); \ 445 + return le##bits##_to_cpu(res); \ 446 + } \ 447 + static inline void btrfs_set_##name(struct extent_buffer *eb, \ 448 + u##bits val) \ 449 + { \ 450 + val = cpu_to_le##bits(val); \ 451 + write_eb_member(eb, NULL, type, member, &val); \ 421 452 } 422 453 423 - static inline u64 btrfs_inode_generation(struct btrfs_inode_item *i) 424 - { 425 - return le64_to_cpu(i->generation); 454 + #define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \ 455 + static inline u##bits btrfs_##name(type *s) \ 456 + { \ 457 + return le##bits##_to_cpu(s->member); \ 458 + } \ 459 + static inline void btrfs_set_##name(type *s, u##bits val) \ 460 + { \ 461 + s->member = cpu_to_le##bits(val); \ 426 462 } 427 463 428 - static inline void btrfs_set_inode_generation(struct btrfs_inode_item *i, 429 - u64 val) 464 + /* struct btrfs_block_group_item */ 465 + BTRFS_SETGET_STACK_FUNCS(block_group_used, struct btrfs_block_group_item, 466 + used, 64); 467 + BTRFS_SETGET_FUNCS(disk_block_group_used, struct btrfs_block_group_item, 468 + used, 64); 469 + 470 + /* struct btrfs_inode_item */ 471 + BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64); 472 + BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64); 473 + BTRFS_SETGET_FUNCS(inode_nblocks, struct btrfs_inode_item, nblocks, 64); 474 + BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64); 475 + BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32); 476 + BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32); 477 + BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32); 478 + BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32); 479 + BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 32); 480 + BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 16); 481 + BTRFS_SETGET_FUNCS(inode_compat_flags, struct btrfs_inode_item, 482 + compat_flags, 16); 483 + 484 + static inline struct btrfs_inode_timespec * 485 + btrfs_inode_atime(struct btrfs_inode_item *inode_item) 430 486 { 431 - i->generation = cpu_to_le64(val); 487 + unsigned long ptr = (unsigned long)inode_item; 488 + ptr += offsetof(struct btrfs_inode_item, atime); 489 + return (struct btrfs_inode_timespec *)ptr; 432 490 } 433 491 434 - static inline u64 btrfs_inode_size(struct btrfs_inode_item *i) 492 + static inline struct btrfs_inode_timespec * 493 + btrfs_inode_mtime(struct btrfs_inode_item *inode_item) 435 494 { 436 - return le64_to_cpu(i->size); 495 + unsigned long ptr = (unsigned long)inode_item; 496 + ptr += offsetof(struct btrfs_inode_item, mtime); 497 + return (struct btrfs_inode_timespec *)ptr; 437 498 } 438 499 439 - static inline void btrfs_set_inode_size(struct btrfs_inode_item *i, u64 val) 500 + static inline struct btrfs_inode_timespec * 501 + btrfs_inode_ctime(struct btrfs_inode_item *inode_item) 440 502 { 441 - i->size = cpu_to_le64(val); 503 + unsigned long ptr = (unsigned long)inode_item; 504 + ptr += offsetof(struct btrfs_inode_item, ctime); 505 + return (struct btrfs_inode_timespec *)ptr; 442 506 } 443 507 444 - static inline u64 btrfs_inode_nblocks(struct btrfs_inode_item *i) 508 + static inline struct btrfs_inode_timespec * 509 + btrfs_inode_otime(struct btrfs_inode_item *inode_item) 445 510 { 446 - return le64_to_cpu(i->nblocks); 511 + unsigned long ptr = (unsigned long)inode_item; 512 + ptr += offsetof(struct btrfs_inode_item, otime); 513 + return (struct btrfs_inode_timespec *)ptr; 447 514 } 448 515 449 - static inline void btrfs_set_inode_nblocks(struct btrfs_inode_item *i, u64 val) 516 + BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_inode_timespec, sec, 64); 517 + BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_inode_timespec, nsec, 32); 518 + 519 + /* struct btrfs_extent_item */ 520 + BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 32); 521 + BTRFS_SETGET_FUNCS(extent_owner, struct btrfs_extent_item, owner, 32); 522 + 523 + BTRFS_SETGET_STACK_FUNCS(stack_extent_refs, struct btrfs_extent_item, 524 + refs, 32); 525 + BTRFS_SETGET_STACK_FUNCS(stack_extent_owner, struct btrfs_extent_item, 526 + owner, 32); 527 + 528 + /* struct btrfs_node */ 529 + BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64); 530 + 531 + static inline u64 btrfs_node_blockptr(struct extent_buffer *eb, int nr) 450 532 { 451 - i->nblocks = cpu_to_le64(val); 533 + unsigned long ptr; 534 + ptr = offsetof(struct btrfs_node, ptrs) + 535 + sizeof(struct btrfs_key_ptr) * nr; 536 + return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr); 452 537 } 453 538 454 - static inline u64 btrfs_inode_block_group(struct btrfs_inode_item *i) 539 + static inline void btrfs_set_node_blockptr(struct extent_buffer *eb, 540 + int nr, u64 val) 455 541 { 456 - return le64_to_cpu(i->block_group); 542 + unsigned long ptr; 543 + ptr = offsetof(struct btrfs_node, ptrs) + 544 + sizeof(struct btrfs_key_ptr) * nr; 545 + btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val); 457 546 } 458 547 459 - static inline void btrfs_set_inode_block_group(struct btrfs_inode_item *i, 460 - u64 val) 548 + static unsigned long btrfs_node_key_ptr_offset(int nr) 461 549 { 462 - i->block_group = cpu_to_le64(val); 550 + return offsetof(struct btrfs_node, ptrs) + 551 + sizeof(struct btrfs_key_ptr) * nr; 463 552 } 464 553 465 - static inline u32 btrfs_inode_nlink(struct btrfs_inode_item *i) 554 + static void btrfs_node_key(struct extent_buffer *eb, 555 + struct btrfs_disk_key *disk_key, int nr) 466 556 { 467 - return le32_to_cpu(i->nlink); 557 + unsigned long ptr; 558 + ptr = btrfs_node_key_ptr_offset(nr); 559 + read_eb_member(eb, (struct btrfs_key_ptr *)ptr, 560 + struct btrfs_key_ptr, key, disk_key); 561 + } 562 + static inline void btrfs_set_node_key(struct extent_buffer *eb, 563 + struct btrfs_disk_key *disk_key, int nr) 564 + { 565 + unsigned long ptr; 566 + ptr = btrfs_node_key_ptr_offset(nr); 567 + write_eb_member(eb, (struct btrfs_key_ptr *)ptr, 568 + struct btrfs_key_ptr, key, disk_key); 468 569 } 469 570 470 - static inline void btrfs_set_inode_nlink(struct btrfs_inode_item *i, u32 val) 571 + /* struct btrfs_item */ 572 + BTRFS_SETGET_FUNCS(item_offset, struct btrfs_item, offset, 32); 573 + BTRFS_SETGET_FUNCS(item_size, struct btrfs_item, size, 32); 574 + 575 + static inline unsigned long btrfs_item_nr_offset(int nr) 471 576 { 472 - i->nlink = cpu_to_le32(val); 577 + return offsetof(struct btrfs_leaf, items) + 578 + sizeof(struct btrfs_item) * nr; 473 579 } 474 580 475 - static inline u32 btrfs_inode_uid(struct btrfs_inode_item *i) 581 + static inline struct btrfs_item *btrfs_item_nr(struct extent_buffer *eb, 582 + int nr) 476 583 { 477 - return le32_to_cpu(i->uid); 584 + return (struct btrfs_item *)btrfs_item_nr_offset(nr); 478 585 } 479 586 480 - static inline void btrfs_set_inode_uid(struct btrfs_inode_item *i, u32 val) 587 + static inline u32 btrfs_item_end(struct extent_buffer *eb, 588 + struct btrfs_item *item) 481 589 { 482 - i->uid = cpu_to_le32(val); 590 + return btrfs_item_offset(eb, item) + btrfs_item_size(eb, item); 483 591 } 484 592 485 - static inline u32 btrfs_inode_gid(struct btrfs_inode_item *i) 593 + static inline u32 btrfs_item_end_nr(struct extent_buffer *eb, int nr) 486 594 { 487 - return le32_to_cpu(i->gid); 595 + return btrfs_item_end(eb, btrfs_item_nr(eb, nr)); 488 596 } 489 597 490 - static inline void btrfs_set_inode_gid(struct btrfs_inode_item *i, u32 val) 598 + static inline u32 btrfs_item_offset_nr(struct extent_buffer *eb, int nr) 491 599 { 492 - i->gid = cpu_to_le32(val); 600 + return btrfs_item_offset(eb, btrfs_item_nr(eb, nr)); 493 601 } 494 602 495 - static inline u32 btrfs_inode_mode(struct btrfs_inode_item *i) 603 + static inline u32 btrfs_item_size_nr(struct extent_buffer *eb, int nr) 496 604 { 497 - return le32_to_cpu(i->mode); 605 + return btrfs_item_size(eb, btrfs_item_nr(eb, nr)); 498 606 } 499 607 500 - static inline void btrfs_set_inode_mode(struct btrfs_inode_item *i, u32 val) 608 + static inline void btrfs_item_key(struct extent_buffer *eb, 609 + struct btrfs_disk_key *disk_key, int nr) 501 610 { 502 - i->mode = cpu_to_le32(val); 611 + struct btrfs_item *item = btrfs_item_nr(eb, nr); 612 + read_eb_member(eb, item, struct btrfs_item, key, disk_key); 503 613 } 504 614 505 - static inline u32 btrfs_inode_rdev(struct btrfs_inode_item *i) 615 + static inline void btrfs_set_item_key(struct extent_buffer *eb, 616 + struct btrfs_disk_key *disk_key, int nr) 506 617 { 507 - return le32_to_cpu(i->rdev); 618 + struct btrfs_item *item = btrfs_item_nr(eb, nr); 619 + write_eb_member(eb, item, struct btrfs_item, key, disk_key); 508 620 } 509 621 510 - static inline void btrfs_set_inode_rdev(struct btrfs_inode_item *i, u32 val) 622 + /* struct btrfs_dir_item */ 623 + BTRFS_SETGET_FUNCS(dir_flags, struct btrfs_dir_item, flags, 16); 624 + BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8); 625 + BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16); 626 + 627 + static inline void btrfs_dir_item_key(struct extent_buffer *eb, 628 + struct btrfs_dir_item *item, 629 + struct btrfs_disk_key *key) 511 630 { 512 - i->rdev = cpu_to_le32(val); 631 + read_eb_member(eb, item, struct btrfs_dir_item, location, key); 513 632 } 514 633 515 - static inline u16 btrfs_inode_flags(struct btrfs_inode_item *i) 634 + static inline void btrfs_set_dir_item_key(struct extent_buffer *eb, 635 + struct btrfs_dir_item *item, 636 + struct btrfs_disk_key *key) 516 637 { 517 - return le16_to_cpu(i->flags); 638 + write_eb_member(eb, item, struct btrfs_dir_item, location, key); 518 639 } 519 640 520 - static inline void btrfs_set_inode_flags(struct btrfs_inode_item *i, u16 val) 521 - { 522 - i->flags = cpu_to_le16(val); 523 - } 524 - 525 - static inline u16 btrfs_inode_compat_flags(struct btrfs_inode_item *i) 526 - { 527 - return le16_to_cpu(i->compat_flags); 528 - } 529 - 530 - static inline void btrfs_set_inode_compat_flags(struct btrfs_inode_item *i, 531 - u16 val) 532 - { 533 - i->compat_flags = cpu_to_le16(val); 534 - } 535 - 536 - static inline u64 btrfs_timespec_sec(struct btrfs_inode_timespec *ts) 537 - { 538 - return le64_to_cpu(ts->sec); 539 - } 540 - 541 - static inline void btrfs_set_timespec_sec(struct btrfs_inode_timespec *ts, 542 - u64 val) 543 - { 544 - ts->sec = cpu_to_le64(val); 545 - } 546 - 547 - static inline u32 btrfs_timespec_nsec(struct btrfs_inode_timespec *ts) 548 - { 549 - return le32_to_cpu(ts->nsec); 550 - } 551 - 552 - static inline void btrfs_set_timespec_nsec(struct btrfs_inode_timespec *ts, 553 - u32 val) 554 - { 555 - ts->nsec = cpu_to_le32(val); 556 - } 557 - 558 - static inline u32 btrfs_extent_refs(struct btrfs_extent_item *ei) 559 - { 560 - return le32_to_cpu(ei->refs); 561 - } 562 - 563 - static inline void btrfs_set_extent_refs(struct btrfs_extent_item *ei, u32 val) 564 - { 565 - ei->refs = cpu_to_le32(val); 566 - } 567 - 568 - static inline u64 btrfs_extent_owner(struct btrfs_extent_item *ei) 569 - { 570 - return le64_to_cpu(ei->owner); 571 - } 572 - 573 - static inline void btrfs_set_extent_owner(struct btrfs_extent_item *ei, u64 val) 574 - { 575 - ei->owner = cpu_to_le64(val); 576 - } 577 - 578 - static inline u64 btrfs_node_blockptr(struct btrfs_node *n, int nr) 579 - { 580 - return le64_to_cpu(n->ptrs[nr].blockptr); 581 - } 582 - 583 - 584 - static inline void btrfs_set_node_blockptr(struct btrfs_node *n, int nr, 585 - u64 val) 586 - { 587 - n->ptrs[nr].blockptr = cpu_to_le64(val); 588 - } 589 - 590 - static inline u32 btrfs_item_offset(struct btrfs_item *item) 591 - { 592 - return le32_to_cpu(item->offset); 593 - } 594 - 595 - static inline void btrfs_set_item_offset(struct btrfs_item *item, u32 val) 596 - { 597 - item->offset = cpu_to_le32(val); 598 - } 599 - 600 - static inline u32 btrfs_item_end(struct btrfs_item *item) 601 - { 602 - return le32_to_cpu(item->offset) + le16_to_cpu(item->size); 603 - } 604 - 605 - static inline u16 btrfs_item_size(struct btrfs_item *item) 606 - { 607 - return le16_to_cpu(item->size); 608 - } 609 - 610 - static inline void btrfs_set_item_size(struct btrfs_item *item, u16 val) 611 - { 612 - item->size = cpu_to_le16(val); 613 - } 614 - 615 - static inline u16 btrfs_dir_flags(struct btrfs_dir_item *d) 616 - { 617 - return le16_to_cpu(d->flags); 618 - } 619 - 620 - static inline void btrfs_set_dir_flags(struct btrfs_dir_item *d, u16 val) 621 - { 622 - d->flags = cpu_to_le16(val); 623 - } 624 - 625 - static inline u8 btrfs_dir_type(struct btrfs_dir_item *d) 626 - { 627 - return d->type; 628 - } 629 - 630 - static inline void btrfs_set_dir_type(struct btrfs_dir_item *d, u8 val) 631 - { 632 - d->type = val; 633 - } 634 - 635 - static inline u16 btrfs_dir_name_len(struct btrfs_dir_item *d) 636 - { 637 - return le16_to_cpu(d->name_len); 638 - } 639 - 640 - static inline void btrfs_set_dir_name_len(struct btrfs_dir_item *d, u16 val) 641 - { 642 - d->name_len = cpu_to_le16(val); 643 - } 641 + /* struct btrfs_disk_key */ 642 + BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key, 643 + objectid, 64); 644 + BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64); 645 + BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8); 644 646 645 647 static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu, 646 648 struct btrfs_disk_key *disk) 647 649 { 648 650 cpu->offset = le64_to_cpu(disk->offset); 649 - cpu->flags = le32_to_cpu(disk->flags); 651 + cpu->type = disk->type; 650 652 cpu->objectid = le64_to_cpu(disk->objectid); 651 653 } 652 654 ··· 661 649 struct btrfs_key *cpu) 662 650 { 663 651 disk->offset = cpu_to_le64(cpu->offset); 664 - disk->flags = cpu_to_le32(cpu->flags); 652 + disk->type = cpu->type; 665 653 disk->objectid = cpu_to_le64(cpu->objectid); 666 654 } 667 655 668 - static inline u64 btrfs_disk_key_objectid(struct btrfs_disk_key *disk) 656 + static inline void btrfs_node_key_to_cpu(struct extent_buffer *eb, 657 + struct btrfs_key *key, int nr) 669 658 { 670 - return le64_to_cpu(disk->objectid); 659 + struct btrfs_disk_key disk_key; 660 + btrfs_node_key(eb, &disk_key, nr); 661 + btrfs_disk_key_to_cpu(key, &disk_key); 671 662 } 672 663 673 - static inline void btrfs_set_disk_key_objectid(struct btrfs_disk_key *disk, 674 - u64 val) 664 + static inline void btrfs_item_key_to_cpu(struct extent_buffer *eb, 665 + struct btrfs_key *key, int nr) 675 666 { 676 - disk->objectid = cpu_to_le64(val); 667 + struct btrfs_disk_key disk_key; 668 + btrfs_item_key(eb, &disk_key, nr); 669 + btrfs_disk_key_to_cpu(key, &disk_key); 677 670 } 678 671 679 - static inline u64 btrfs_disk_key_offset(struct btrfs_disk_key *disk) 672 + static inline void btrfs_dir_item_key_to_cpu(struct extent_buffer *eb, 673 + struct btrfs_dir_item *item, 674 + struct btrfs_key *key) 680 675 { 681 - return le64_to_cpu(disk->offset); 676 + struct btrfs_disk_key disk_key; 677 + btrfs_dir_item_key(eb, item, &disk_key); 678 + btrfs_disk_key_to_cpu(key, &disk_key); 682 679 } 683 680 684 - static inline void btrfs_set_disk_key_offset(struct btrfs_disk_key *disk, 685 - u64 val) 681 + 682 + static inline u8 btrfs_key_type(struct btrfs_key *key) 686 683 { 687 - disk->offset = cpu_to_le64(val); 684 + return key->type; 688 685 } 689 686 690 - static inline u32 btrfs_disk_key_flags(struct btrfs_disk_key *disk) 687 + static inline void btrfs_set_key_type(struct btrfs_key *key, u8 val) 691 688 { 692 - return le32_to_cpu(disk->flags); 689 + key->type = val; 693 690 } 694 691 695 - static inline void btrfs_set_disk_key_flags(struct btrfs_disk_key *disk, 696 - u32 val) 692 + /* struct btrfs_header */ 693 + BTRFS_SETGET_HEADER_FUNCS(header_blocknr, struct btrfs_header, blocknr, 64); 694 + BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header, 695 + generation, 64); 696 + BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64); 697 + BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32); 698 + BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 16); 699 + BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8); 700 + 701 + static inline u8 *btrfs_header_fsid(struct extent_buffer *eb) 697 702 { 698 - disk->flags = cpu_to_le32(val); 703 + unsigned long ptr = offsetof(struct btrfs_header, fsid); 704 + return (u8 *)ptr; 699 705 } 700 706 701 - static inline u32 btrfs_disk_key_type(struct btrfs_disk_key *key) 707 + static inline u8 *btrfs_super_fsid(struct extent_buffer *eb) 702 708 { 703 - return le32_to_cpu(key->flags) >> BTRFS_KEY_TYPE_SHIFT; 709 + unsigned long ptr = offsetof(struct btrfs_super_block, fsid); 710 + return (u8 *)ptr; 704 711 } 705 712 706 - static inline void btrfs_set_disk_key_type(struct btrfs_disk_key *key, 707 - u32 val) 713 + static inline u8 *btrfs_header_csum(struct extent_buffer *eb) 708 714 { 709 - u32 flags = btrfs_disk_key_flags(key); 710 - BUG_ON(val >= BTRFS_KEY_TYPE_MAX); 711 - val = val << BTRFS_KEY_TYPE_SHIFT; 712 - flags = (flags & ~BTRFS_KEY_TYPE_MASK) | val; 713 - btrfs_set_disk_key_flags(key, flags); 715 + unsigned long ptr = offsetof(struct btrfs_header, csum); 716 + return (u8 *)ptr; 714 717 } 715 718 716 - static inline u32 btrfs_key_type(struct btrfs_key *key) 719 + static inline struct btrfs_node *btrfs_buffer_node(struct extent_buffer *eb) 717 720 { 718 - return key->flags >> BTRFS_KEY_TYPE_SHIFT; 721 + return NULL; 719 722 } 720 723 721 - static inline void btrfs_set_key_type(struct btrfs_key *key, u32 val) 724 + static inline struct btrfs_leaf *btrfs_buffer_leaf(struct extent_buffer *eb) 722 725 { 723 - BUG_ON(val >= BTRFS_KEY_TYPE_MAX); 724 - val = val << BTRFS_KEY_TYPE_SHIFT; 725 - key->flags = (key->flags & ~(BTRFS_KEY_TYPE_MASK)) | val; 726 + return NULL; 726 727 } 727 728 728 - static inline u64 btrfs_header_blocknr(struct btrfs_header *h) 729 + static inline struct btrfs_header *btrfs_buffer_header(struct extent_buffer *eb) 729 730 { 730 - return le64_to_cpu(h->blocknr); 731 + return NULL; 731 732 } 732 733 733 - static inline void btrfs_set_header_blocknr(struct btrfs_header *h, u64 blocknr) 734 + static inline int btrfs_is_leaf(struct extent_buffer *eb) 734 735 { 735 - h->blocknr = cpu_to_le64(blocknr); 736 + return (btrfs_header_level(eb) == 0); 736 737 } 737 738 738 - static inline u64 btrfs_header_generation(struct btrfs_header *h) 739 + /* struct btrfs_root_item */ 740 + BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32); 741 + BTRFS_SETGET_FUNCS(disk_root_blocknr, struct btrfs_root_item, blocknr, 64); 742 + 743 + BTRFS_SETGET_STACK_FUNCS(root_blocknr, struct btrfs_root_item, blocknr, 64); 744 + BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64); 745 + BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32); 746 + BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 32); 747 + BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, blocks_used, 64); 748 + BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, block_limit, 64); 749 + 750 + /* struct btrfs_super_block */ 751 + BTRFS_SETGET_STACK_FUNCS(super_blocknr, struct btrfs_super_block, blocknr, 64); 752 + BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block, 753 + generation, 64); 754 + BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64); 755 + BTRFS_SETGET_STACK_FUNCS(super_total_blocks, struct btrfs_super_block, 756 + total_blocks, 64); 757 + BTRFS_SETGET_STACK_FUNCS(super_blocks_used, struct btrfs_super_block, 758 + blocks_used, 64); 759 + BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block, 760 + sectorsize, 32); 761 + BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block, 762 + nodesize, 32); 763 + BTRFS_SETGET_STACK_FUNCS(super_leafsize, struct btrfs_super_block, 764 + leafsize, 32); 765 + BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block, 766 + root_dir_objectid, 64); 767 + 768 + static inline unsigned long btrfs_leaf_data(struct extent_buffer *l) 739 769 { 740 - return le64_to_cpu(h->generation); 770 + return offsetof(struct btrfs_leaf, items); 741 771 } 742 772 743 - static inline void btrfs_set_header_generation(struct btrfs_header *h, 744 - u64 val) 745 - { 746 - h->generation = cpu_to_le64(val); 747 - } 773 + /* struct btrfs_file_extent_item */ 774 + BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8); 748 775 749 - static inline u64 btrfs_header_owner(struct btrfs_header *h) 750 - { 751 - return le64_to_cpu(h->owner); 752 - } 753 - 754 - static inline void btrfs_set_header_owner(struct btrfs_header *h, 755 - u64 val) 756 - { 757 - h->owner = cpu_to_le64(val); 758 - } 759 - 760 - static inline u16 btrfs_header_nritems(struct btrfs_header *h) 761 - { 762 - return le16_to_cpu(h->nritems); 763 - } 764 - 765 - static inline void btrfs_set_header_nritems(struct btrfs_header *h, u16 val) 766 - { 767 - h->nritems = cpu_to_le16(val); 768 - } 769 - 770 - static inline u16 btrfs_header_flags(struct btrfs_header *h) 771 - { 772 - return le16_to_cpu(h->flags); 773 - } 774 - 775 - static inline void btrfs_set_header_flags(struct btrfs_header *h, u16 val) 776 - { 777 - h->flags = cpu_to_le16(val); 778 - } 779 - 780 - static inline int btrfs_header_level(struct btrfs_header *h) 781 - { 782 - return h->level; 783 - } 784 - 785 - static inline void btrfs_set_header_level(struct btrfs_header *h, int level) 786 - { 787 - BUG_ON(level > BTRFS_MAX_LEVEL); 788 - h->level = level; 789 - } 790 - 791 - static inline int btrfs_is_leaf(struct btrfs_node *n) 792 - { 793 - return (btrfs_header_level(&n->header) == 0); 794 - } 795 - 796 - static inline u64 btrfs_root_blocknr(struct btrfs_root_item *item) 797 - { 798 - return le64_to_cpu(item->blocknr); 799 - } 800 - 801 - static inline void btrfs_set_root_blocknr(struct btrfs_root_item *item, u64 val) 802 - { 803 - item->blocknr = cpu_to_le64(val); 804 - } 805 - 806 - static inline u64 btrfs_root_dirid(struct btrfs_root_item *item) 807 - { 808 - return le64_to_cpu(item->root_dirid); 809 - } 810 - 811 - static inline void btrfs_set_root_dirid(struct btrfs_root_item *item, u64 val) 812 - { 813 - item->root_dirid = cpu_to_le64(val); 814 - } 815 - 816 - static inline u32 btrfs_root_refs(struct btrfs_root_item *item) 817 - { 818 - return le32_to_cpu(item->refs); 819 - } 820 - 821 - static inline void btrfs_set_root_refs(struct btrfs_root_item *item, u32 val) 822 - { 823 - item->refs = cpu_to_le32(val); 824 - } 825 - 826 - static inline u32 btrfs_root_flags(struct btrfs_root_item *item) 827 - { 828 - return le32_to_cpu(item->flags); 829 - } 830 - 831 - static inline void btrfs_set_root_flags(struct btrfs_root_item *item, u32 val) 832 - { 833 - item->flags = cpu_to_le32(val); 834 - } 835 - 836 - static inline void btrfs_set_root_blocks_used(struct btrfs_root_item *item, 837 - u64 val) 838 - { 839 - item->blocks_used = cpu_to_le64(val); 840 - } 841 - 842 - static inline u64 btrfs_root_blocks_used(struct btrfs_root_item *item) 843 - { 844 - return le64_to_cpu(item->blocks_used); 845 - } 846 - 847 - static inline void btrfs_set_root_block_limit(struct btrfs_root_item *item, 848 - u64 val) 849 - { 850 - item->block_limit = cpu_to_le64(val); 851 - } 852 - 853 - static inline u64 btrfs_root_block_limit(struct btrfs_root_item *item) 854 - { 855 - return le64_to_cpu(item->block_limit); 856 - } 857 - 858 - static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s) 859 - { 860 - return le64_to_cpu(s->blocknr); 861 - } 862 - 863 - static inline void btrfs_set_super_blocknr(struct btrfs_super_block *s, u64 val) 864 - { 865 - s->blocknr = cpu_to_le64(val); 866 - } 867 - 868 - static inline u64 btrfs_super_generation(struct btrfs_super_block *s) 869 - { 870 - return le64_to_cpu(s->generation); 871 - } 872 - 873 - static inline void btrfs_set_super_generation(struct btrfs_super_block *s, 874 - u64 val) 875 - { 876 - s->generation = cpu_to_le64(val); 877 - } 878 - 879 - static inline u64 btrfs_super_root(struct btrfs_super_block *s) 880 - { 881 - return le64_to_cpu(s->root); 882 - } 883 - 884 - static inline void btrfs_set_super_root(struct btrfs_super_block *s, u64 val) 885 - { 886 - s->root = cpu_to_le64(val); 887 - } 888 - 889 - static inline u64 btrfs_super_total_blocks(struct btrfs_super_block *s) 890 - { 891 - return le64_to_cpu(s->total_blocks); 892 - } 893 - 894 - static inline void btrfs_set_super_total_blocks(struct btrfs_super_block *s, 895 - u64 val) 896 - { 897 - s->total_blocks = cpu_to_le64(val); 898 - } 899 - 900 - static inline u64 btrfs_super_blocks_used(struct btrfs_super_block *s) 901 - { 902 - return le64_to_cpu(s->blocks_used); 903 - } 904 - 905 - static inline void btrfs_set_super_blocks_used(struct btrfs_super_block *s, 906 - u64 val) 907 - { 908 - s->blocks_used = cpu_to_le64(val); 909 - } 910 - 911 - static inline u32 btrfs_super_blocksize(struct btrfs_super_block *s) 912 - { 913 - return le32_to_cpu(s->blocksize); 914 - } 915 - 916 - static inline void btrfs_set_super_blocksize(struct btrfs_super_block *s, 917 - u32 val) 918 - { 919 - s->blocksize = cpu_to_le32(val); 920 - } 921 - 922 - static inline u64 btrfs_super_root_dir(struct btrfs_super_block *s) 923 - { 924 - return le64_to_cpu(s->root_dir_objectid); 925 - } 926 - 927 - static inline void btrfs_set_super_root_dir(struct btrfs_super_block *s, u64 928 - val) 929 - { 930 - s->root_dir_objectid = cpu_to_le64(val); 931 - } 932 - 933 - static inline u8 *btrfs_leaf_data(struct btrfs_leaf *l) 934 - { 935 - return (u8 *)l->items; 936 - } 937 - 938 - static inline int btrfs_file_extent_type(struct btrfs_file_extent_item *e) 939 - { 940 - return e->type; 941 - } 942 - static inline void btrfs_set_file_extent_type(struct btrfs_file_extent_item *e, 943 - u8 val) 944 - { 945 - e->type = val; 946 - } 947 - 948 - static inline char *btrfs_file_extent_inline_start(struct 776 + static inline unsigned long btrfs_file_extent_inline_start(struct 949 777 btrfs_file_extent_item *e) 950 778 { 951 - return (char *)(&e->disk_blocknr); 779 + unsigned long offset = (unsigned long)e; 780 + offset += offsetof(struct btrfs_file_extent_item, disk_blocknr); 781 + return offset; 952 782 } 953 783 954 784 static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize) 955 785 { 956 - return (unsigned long)(&((struct 957 - btrfs_file_extent_item *)NULL)->disk_blocknr) + datasize; 786 + return offsetof(struct btrfs_file_extent_item, disk_blocknr) + datasize; 958 787 } 959 788 960 - static inline u32 btrfs_file_extent_inline_len(struct btrfs_item *e) 789 + static inline u32 btrfs_file_extent_inline_len(struct extent_buffer *eb, 790 + struct btrfs_item *e) 961 791 { 962 - struct btrfs_file_extent_item *fe = NULL; 963 - return btrfs_item_size(e) - (unsigned long)(&fe->disk_blocknr); 792 + unsigned long offset; 793 + offset = offsetof(struct btrfs_file_extent_item, disk_blocknr); 794 + return btrfs_item_size(eb, e) - offset; 964 795 } 965 796 966 - static inline u64 btrfs_file_extent_disk_blocknr(struct btrfs_file_extent_item 967 - *e) 968 - { 969 - return le64_to_cpu(e->disk_blocknr); 970 - } 971 - 972 - static inline void btrfs_set_file_extent_disk_blocknr(struct 973 - btrfs_file_extent_item 974 - *e, u64 val) 975 - { 976 - e->disk_blocknr = cpu_to_le64(val); 977 - } 978 - 979 - static inline u64 btrfs_file_extent_generation(struct btrfs_file_extent_item *e) 980 - { 981 - return le64_to_cpu(e->generation); 982 - } 983 - 984 - static inline void btrfs_set_file_extent_generation(struct 985 - btrfs_file_extent_item *e, 986 - u64 val) 987 - { 988 - e->generation = cpu_to_le64(val); 989 - } 990 - 991 - static inline u64 btrfs_file_extent_disk_num_blocks(struct 992 - btrfs_file_extent_item *e) 993 - { 994 - return le64_to_cpu(e->disk_num_blocks); 995 - } 996 - 997 - static inline void btrfs_set_file_extent_disk_num_blocks(struct 998 - btrfs_file_extent_item 999 - *e, u64 val) 1000 - { 1001 - e->disk_num_blocks = cpu_to_le64(val); 1002 - } 1003 - 1004 - static inline u64 btrfs_file_extent_offset(struct btrfs_file_extent_item *e) 1005 - { 1006 - return le64_to_cpu(e->offset); 1007 - } 1008 - 1009 - static inline void btrfs_set_file_extent_offset(struct btrfs_file_extent_item 1010 - *e, u64 val) 1011 - { 1012 - e->offset = cpu_to_le64(val); 1013 - } 1014 - 1015 - static inline u64 btrfs_file_extent_num_blocks(struct btrfs_file_extent_item 1016 - *e) 1017 - { 1018 - return le64_to_cpu(e->num_blocks); 1019 - } 1020 - 1021 - static inline void btrfs_set_file_extent_num_blocks(struct 1022 - btrfs_file_extent_item *e, 1023 - u64 val) 1024 - { 1025 - e->num_blocks = cpu_to_le64(val); 1026 - } 797 + BTRFS_SETGET_FUNCS(file_extent_disk_blocknr, struct btrfs_file_extent_item, 798 + disk_blocknr, 64); 799 + BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item, 800 + generation, 64); 801 + BTRFS_SETGET_FUNCS(file_extent_disk_num_blocks, struct btrfs_file_extent_item, 802 + disk_num_blocks, 64); 803 + BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item, 804 + offset, 64); 805 + BTRFS_SETGET_FUNCS(file_extent_num_blocks, struct btrfs_file_extent_item, 806 + num_blocks, 64); 1027 807 1028 808 static inline struct btrfs_root *btrfs_sb(struct super_block *sb) 1029 809 { 1030 810 return sb->s_fs_info; 1031 - } 1032 - 1033 - static inline void btrfs_check_bounds(void *vptr, size_t len, 1034 - void *vcontainer, size_t container_len) 1035 - { 1036 - char *ptr = vptr; 1037 - char *container = vcontainer; 1038 - WARN_ON(ptr < container); 1039 - WARN_ON(ptr + len > container + container_len); 1040 - } 1041 - 1042 - static inline void btrfs_memcpy(struct btrfs_root *root, 1043 - void *dst_block, 1044 - void *dst, const void *src, size_t nr) 1045 - { 1046 - btrfs_check_bounds(dst, nr, dst_block, root->fs_info->sb->s_blocksize); 1047 - memcpy(dst, src, nr); 1048 - } 1049 - 1050 - static inline void btrfs_memmove(struct btrfs_root *root, 1051 - void *dst_block, 1052 - void *dst, void *src, size_t nr) 1053 - { 1054 - btrfs_check_bounds(dst, nr, dst_block, root->fs_info->sb->s_blocksize); 1055 - memmove(dst, src, nr); 1056 811 } 1057 812 1058 813 static inline int btrfs_set_root_name(struct btrfs_root *root, ··· 842 1063 /* helper function to cast into the data area of the leaf. */ 843 1064 #define btrfs_item_ptr(leaf, slot, type) \ 844 1065 ((type *)(btrfs_leaf_data(leaf) + \ 845 - btrfs_item_offset((leaf)->items + (slot)))) 1066 + btrfs_item_offset_nr(leaf, slot))) 1067 + 1068 + #define btrfs_item_ptr_offset(leaf, slot) \ 1069 + ((unsigned long)(btrfs_leaf_data(leaf) + \ 1070 + btrfs_item_offset_nr(leaf, slot))) 846 1071 847 1072 /* mount option defines and helpers */ 848 1073 #define BTRFS_MOUNT_SUBVOL 0x000001 ··· 867 1084 int data, int owner); 868 1085 int btrfs_inc_root_ref(struct btrfs_trans_handle *trans, 869 1086 struct btrfs_root *root); 870 - struct buffer_head *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, 1087 + struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, 871 1088 struct btrfs_root *root, u64 hint, 872 1089 u64 empty_size); 873 1090 int btrfs_alloc_extent(struct btrfs_trans_handle *trans, ··· 875 1092 u64 num_blocks, u64 empty_size, u64 search_start, 876 1093 u64 search_end, struct btrfs_key *ins, int data); 877 1094 int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, 878 - struct buffer_head *buf); 1095 + struct extent_buffer *buf); 879 1096 int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root 880 1097 *root, u64 blocknr, u64 num_blocks, int pin); 881 1098 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, ··· 889 1106 int btrfs_free_block_groups(struct btrfs_fs_info *info); 890 1107 int btrfs_read_block_groups(struct btrfs_root *root); 891 1108 /* ctree.c */ 892 - int btrfs_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root 893 - *root, struct buffer_head *buf, struct buffer_head 894 - *parent, int parent_slot, struct buffer_head 895 - **cow_ret); 1109 + int btrfs_cow_block(struct btrfs_trans_handle *trans, 1110 + struct btrfs_root *root, struct extent_buffer *buf, 1111 + struct extent_buffer *parent, int parent_slot, 1112 + struct extent_buffer **cow_ret); 896 1113 int btrfs_extend_item(struct btrfs_trans_handle *trans, struct btrfs_root 897 1114 *root, struct btrfs_path *path, u32 data_size); 898 1115 int btrfs_truncate_item(struct btrfs_trans_handle *trans, ··· 903 1120 *root, struct btrfs_key *key, struct btrfs_path *p, int 904 1121 ins_len, int cow); 905 1122 int btrfs_realloc_node(struct btrfs_trans_handle *trans, 906 - struct btrfs_root *root, struct buffer_head *parent, 1123 + struct btrfs_root *root, struct extent_buffer *parent, 907 1124 int cache_only, u64 *last_ret); 908 1125 void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p); 909 1126 struct btrfs_path *btrfs_alloc_path(void); ··· 917 1134 *root, struct btrfs_path *path, struct btrfs_key 918 1135 *cpu_key, u32 data_size); 919 1136 int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path); 920 - int btrfs_leaf_free_space(struct btrfs_root *root, struct btrfs_leaf *leaf); 1137 + int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf); 921 1138 int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root 922 1139 *root); 923 1140 /* root-item.c */ ··· 962 1179 int btrfs_find_highest_inode(struct btrfs_root *fs_root, u64 *objectid); 963 1180 964 1181 /* inode-item.c */ 965 - int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root 966 - *root, u64 objectid, struct btrfs_inode_item 967 - *inode_item); 1182 + int btrfs_insert_empty_inode(struct btrfs_trans_handle *trans, 1183 + struct btrfs_root *root, 1184 + struct btrfs_path *path, u64 objectid); 968 1185 int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root 969 1186 *root, struct btrfs_path *path, 970 1187 struct btrfs_key *location, int mod); ··· 1007 1224 struct btrfs_root *root); 1008 1225 int btrfs_commit_write(struct file *file, struct page *page, 1009 1226 unsigned from, unsigned to); 1010 - int btrfs_get_block(struct inode *inode, sector_t iblock, 1011 - struct buffer_head *result, int create); 1012 1227 struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, 1013 1228 size_t page_offset, u64 start, u64 end, 1014 1229 int create);
+56 -46
fs/btrfs/dir-item.c
··· 33 33 int ret; 34 34 char *ptr; 35 35 struct btrfs_item *item; 36 - struct btrfs_leaf *leaf; 36 + struct extent_buffer *leaf; 37 37 38 38 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); 39 39 if (ret == -EEXIST) { ··· 49 49 if (ret < 0) 50 50 return ERR_PTR(ret); 51 51 WARN_ON(ret > 0); 52 - leaf = btrfs_buffer_leaf(path->nodes[0]); 53 - item = leaf->items + path->slots[0]; 52 + leaf = path->nodes[0]; 53 + item = btrfs_item_nr(leaf, path->slots[0]); 54 54 ptr = btrfs_item_ptr(leaf, path->slots[0], char); 55 - BUG_ON(data_size > btrfs_item_size(item)); 56 - ptr += btrfs_item_size(item) - data_size; 55 + BUG_ON(data_size > btrfs_item_size(leaf, item)); 56 + ptr += btrfs_item_size(leaf, item) - data_size; 57 57 return (struct btrfs_dir_item *)ptr; 58 58 } 59 59 ··· 65 65 int ret2 = 0; 66 66 struct btrfs_path *path; 67 67 struct btrfs_dir_item *dir_item; 68 - char *name_ptr; 68 + struct extent_buffer *leaf; 69 + unsigned long name_ptr; 69 70 struct btrfs_key key; 71 + struct btrfs_disk_key disk_key; 70 72 u32 data_size; 71 73 72 74 key.objectid = dir; 73 - key.flags = 0; 74 75 btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY); 75 76 ret = btrfs_name_hash(name, name_len, &key.offset); 76 77 BUG_ON(ret); ··· 86 85 goto out; 87 86 } 88 87 89 - btrfs_cpu_key_to_disk(&dir_item->location, location); 90 - btrfs_set_dir_type(dir_item, type); 91 - btrfs_set_dir_flags(dir_item, 0); 92 - btrfs_set_dir_name_len(dir_item, name_len); 93 - name_ptr = (char *)(dir_item + 1); 88 + leaf = path->nodes[0]; 89 + btrfs_cpu_key_to_disk(&disk_key, location); 90 + btrfs_set_dir_item_key(leaf, dir_item, &disk_key); 91 + btrfs_set_dir_type(leaf, dir_item, type); 92 + btrfs_set_dir_flags(leaf, dir_item, 0); 93 + btrfs_set_dir_name_len(leaf, dir_item, name_len); 94 + name_ptr = (unsigned long)(dir_item + 1); 94 95 95 - btrfs_memcpy(root, path->nodes[0]->b_data, name_ptr, name, name_len); 96 - btrfs_mark_buffer_dirty(path->nodes[0]); 96 + write_extent_buffer(leaf, name, name_ptr, name_len); 97 + btrfs_mark_buffer_dirty(leaf); 97 98 98 99 second_insert: 99 100 /* FIXME, use some real flag for selecting the extra index */ ··· 113 110 ret2 = PTR_ERR(dir_item); 114 111 goto out; 115 112 } 116 - btrfs_cpu_key_to_disk(&dir_item->location, location); 117 - btrfs_set_dir_type(dir_item, type); 118 - btrfs_set_dir_flags(dir_item, 0); 119 - btrfs_set_dir_name_len(dir_item, name_len); 120 - name_ptr = (char *)(dir_item + 1); 121 - btrfs_memcpy(root, path->nodes[0]->b_data, name_ptr, name, name_len); 122 - btrfs_mark_buffer_dirty(path->nodes[0]); 113 + leaf = path->nodes[0]; 114 + btrfs_cpu_key_to_disk(&disk_key, location); 115 + btrfs_set_dir_item_key(leaf, dir_item, &disk_key); 116 + btrfs_set_dir_type(leaf, dir_item, type); 117 + btrfs_set_dir_flags(leaf, dir_item, 0); 118 + btrfs_set_dir_name_len(leaf, dir_item, name_len); 119 + name_ptr = (unsigned long)(dir_item + 1); 120 + write_extent_buffer(leaf, name, name_ptr, name_len); 121 + btrfs_mark_buffer_dirty(leaf); 123 122 out: 124 123 btrfs_free_path(path); 125 124 if (ret) ··· 141 136 struct btrfs_key key; 142 137 int ins_len = mod < 0 ? -1 : 0; 143 138 int cow = mod != 0; 144 - struct btrfs_disk_key *found_key; 145 - struct btrfs_leaf *leaf; 139 + struct btrfs_key found_key; 140 + struct extent_buffer *leaf; 146 141 147 142 key.objectid = dir; 148 - key.flags = 0; 149 143 btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY); 144 + 150 145 ret = btrfs_name_hash(name, name_len, &key.offset); 151 146 BUG_ON(ret); 147 + 152 148 ret = btrfs_search_slot(trans, root, &key, path, ins_len, cow); 153 149 if (ret < 0) 154 150 return ERR_PTR(ret); ··· 158 152 return NULL; 159 153 path->slots[0]--; 160 154 } 161 - leaf = btrfs_buffer_leaf(path->nodes[0]); 162 - found_key = &leaf->items[path->slots[0]].key; 163 155 164 - if (btrfs_disk_key_objectid(found_key) != dir || 165 - btrfs_disk_key_type(found_key) != BTRFS_DIR_ITEM_KEY || 166 - btrfs_disk_key_offset(found_key) != key.offset) 156 + leaf = path->nodes[0]; 157 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 158 + 159 + if (found_key.objectid != dir || 160 + btrfs_key_type(&found_key) != BTRFS_DIR_ITEM_KEY || 161 + found_key.offset != key.offset) 167 162 return NULL; 168 163 169 164 return btrfs_match_dir_item_name(root, path, name, name_len); ··· 183 176 int cow = mod != 0; 184 177 185 178 key.objectid = dir; 186 - key.flags = 0; 187 179 btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY); 188 180 key.offset = objectid; 189 181 ··· 199 193 const char *name, int name_len) 200 194 { 201 195 struct btrfs_dir_item *dir_item; 202 - char *name_ptr; 196 + unsigned long name_ptr; 203 197 u32 total_len; 204 198 u32 cur = 0; 205 199 u32 this_len; 206 - struct btrfs_leaf *leaf; 200 + struct extent_buffer *leaf; 207 201 208 - leaf = btrfs_buffer_leaf(path->nodes[0]); 202 + leaf = path->nodes[0]; 209 203 dir_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dir_item); 210 - total_len = btrfs_item_size(leaf->items + path->slots[0]); 204 + total_len = btrfs_item_size_nr(leaf, path->slots[0]); 211 205 while(cur < total_len) { 212 - this_len = sizeof(*dir_item) + btrfs_dir_name_len(dir_item); 213 - name_ptr = (char *)(dir_item + 1); 206 + this_len = sizeof(*dir_item) + 207 + btrfs_dir_name_len(leaf, dir_item); 208 + name_ptr = (unsigned long)(dir_item + 1); 214 209 215 - if (btrfs_dir_name_len(dir_item) == name_len && 216 - memcmp(name_ptr, name, name_len) == 0) 210 + if (btrfs_dir_name_len(leaf, dir_item) == name_len && 211 + memcmp_extent_buffer(leaf, name, name_ptr, name_len) == 0) 217 212 return dir_item; 218 213 219 214 cur += this_len; ··· 230 223 struct btrfs_dir_item *di) 231 224 { 232 225 233 - struct btrfs_leaf *leaf; 226 + struct extent_buffer *leaf; 234 227 u32 sub_item_len; 235 228 u32 item_len; 236 229 int ret = 0; 237 230 238 - leaf = btrfs_buffer_leaf(path->nodes[0]); 239 - sub_item_len = sizeof(*di) + btrfs_dir_name_len(di); 240 - item_len = btrfs_item_size(leaf->items + path->slots[0]); 241 - if (sub_item_len == btrfs_item_size(leaf->items + path->slots[0])) { 231 + leaf = path->nodes[0]; 232 + sub_item_len = sizeof(*di) + btrfs_dir_name_len(leaf, di); 233 + item_len = btrfs_item_size_nr(leaf, path->slots[0]); 234 + if (sub_item_len == item_len) { 242 235 ret = btrfs_del_item(trans, root, path); 243 236 } else { 244 - char *ptr = (char *)di; 245 - char *start = btrfs_item_ptr(leaf, path->slots[0], char); 246 - btrfs_memmove(root, leaf, ptr, ptr + sub_item_len, 237 + /* MARKER */ 238 + unsigned long ptr = (unsigned long)di; 239 + unsigned long start; 240 + 241 + start = btrfs_item_ptr_offset(leaf, path->slots[0]); 242 + memmove_extent_buffer(leaf, ptr, ptr + sub_item_len, 247 243 item_len - (ptr + sub_item_len - start)); 248 244 ret = btrfs_truncate_item(trans, root, path, 249 245 item_len - sub_item_len);
+182 -213
fs/btrfs/disk-io.c
··· 23 23 #include <linux/swap.h> 24 24 #include <linux/radix-tree.h> 25 25 #include <linux/writeback.h> 26 + #include <linux/buffer_head.h> // for block_sync_page 26 27 #include "ctree.h" 27 28 #include "disk-io.h" 28 29 #include "transaction.h" 29 30 #include "btrfs_inode.h" 30 31 31 - u64 bh_blocknr(struct buffer_head *bh) 32 + #if 0 33 + static int check_tree_block(struct btrfs_root *root, struct extent_buffer *buf) 32 34 { 33 - return bh->b_blocknr; 34 - } 35 - 36 - static int check_tree_block(struct btrfs_root *root, struct buffer_head *buf) 37 - { 38 - struct btrfs_node *node = btrfs_buffer_node(buf); 39 - if (bh_blocknr(buf) != btrfs_header_blocknr(&node->header)) { 40 - printk(KERN_CRIT "bh_blocknr(buf) is %llu, header is %llu\n", 41 - (unsigned long long)bh_blocknr(buf), 42 - (unsigned long long)btrfs_header_blocknr(&node->header)); 35 + if (extent_buffer_blocknr(buf) != btrfs_header_blocknr(buf)) { 36 + printk(KERN_CRIT "buf blocknr(buf) is %llu, header is %llu\n", 37 + (unsigned long long)extent_buffer_blocknr(buf), 38 + (unsigned long long)btrfs_header_blocknr(buf)); 43 39 return 1; 44 40 } 45 41 return 0; 46 42 } 43 + #endif 47 44 48 - struct buffer_head *btrfs_find_tree_block(struct btrfs_root *root, u64 blocknr) 45 + struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root, 46 + u64 blocknr) 49 47 { 50 - struct address_space *mapping = root->fs_info->btree_inode->i_mapping; 51 - int blockbits = root->fs_info->sb->s_blocksize_bits; 52 - unsigned long index = blocknr >> (PAGE_CACHE_SHIFT - blockbits); 53 - struct page *page; 54 - struct buffer_head *bh; 55 - struct buffer_head *head; 56 - struct buffer_head *ret = NULL; 57 - 58 - 59 - page = find_lock_page(mapping, index); 60 - if (!page) 61 - return NULL; 62 - 63 - if (!page_has_buffers(page)) 64 - goto out_unlock; 65 - 66 - head = page_buffers(page); 67 - bh = head; 68 - do { 69 - if (buffer_mapped(bh) && bh_blocknr(bh) == blocknr) { 70 - ret = bh; 71 - get_bh(bh); 72 - goto out_unlock; 73 - } 74 - bh = bh->b_this_page; 75 - } while (bh != head); 76 - out_unlock: 77 - unlock_page(page); 78 - page_cache_release(page); 79 - return ret; 48 + struct inode *btree_inode = root->fs_info->btree_inode; 49 + return find_extent_buffer(&BTRFS_I(btree_inode)->extent_tree, 50 + blocknr * root->sectorsize, 51 + root->sectorsize, GFP_NOFS); 80 52 } 81 53 82 - int btrfs_map_bh_to_logical(struct btrfs_root *root, struct buffer_head *bh, 83 - u64 logical) 84 - { 85 - if (logical == 0) { 86 - bh->b_bdev = NULL; 87 - bh->b_blocknr = 0; 88 - set_buffer_mapped(bh); 89 - } else { 90 - map_bh(bh, root->fs_info->sb, logical); 91 - } 92 - return 0; 93 - } 94 - 95 - struct buffer_head *btrfs_find_create_tree_block(struct btrfs_root *root, 54 + struct extent_buffer *btrfs_find_create_tree_block(struct btrfs_root *root, 96 55 u64 blocknr) 97 56 { 98 - struct address_space *mapping = root->fs_info->btree_inode->i_mapping; 99 - int blockbits = root->fs_info->sb->s_blocksize_bits; 100 - unsigned long index = blocknr >> (PAGE_CACHE_SHIFT - blockbits); 101 - struct page *page; 102 - struct buffer_head *bh; 103 - struct buffer_head *head; 104 - struct buffer_head *ret = NULL; 105 - int err; 106 - u64 first_block = index << (PAGE_CACHE_SHIFT - blockbits); 57 + struct inode *btree_inode = root->fs_info->btree_inode; 58 + return alloc_extent_buffer(&BTRFS_I(btree_inode)->extent_tree, 59 + blocknr * root->sectorsize, 60 + root->sectorsize, GFP_NOFS); 61 + } 107 62 108 - page = find_or_create_page(mapping, index, GFP_NOFS); 109 - if (!page) 110 - return NULL; 63 + struct extent_map *btree_get_extent(struct inode *inode, struct page *page, 64 + size_t page_offset, u64 start, u64 end, 65 + int create) 66 + { 67 + struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 68 + struct extent_map *em; 69 + int ret; 111 70 112 - if (!page_has_buffers(page)) 113 - create_empty_buffers(page, root->fs_info->sb->s_blocksize, 0); 114 - head = page_buffers(page); 115 - bh = head; 116 - do { 117 - if (!buffer_mapped(bh)) { 118 - err = btrfs_map_bh_to_logical(root, bh, first_block); 119 - BUG_ON(err); 120 - } 121 - if (bh_blocknr(bh) == blocknr) { 122 - ret = bh; 123 - get_bh(bh); 124 - goto out_unlock; 125 - } 126 - bh = bh->b_this_page; 127 - first_block++; 128 - } while (bh != head); 129 - out_unlock: 130 - unlock_page(page); 131 - if (ret) 132 - touch_buffer(ret); 133 - page_cache_release(page); 71 + again: 72 + em = lookup_extent_mapping(em_tree, start, end); 73 + if (em) { 74 + goto out; 75 + } 76 + em = alloc_extent_map(GFP_NOFS); 77 + if (!em) { 78 + em = ERR_PTR(-ENOMEM); 79 + goto out; 80 + } 81 + em->start = 0; 82 + em->end = (i_size_read(inode) & ~((u64)PAGE_CACHE_SIZE -1)) - 1; 83 + em->block_start = 0; 84 + em->block_end = em->end; 85 + em->bdev = inode->i_sb->s_bdev; 86 + ret = add_extent_mapping(em_tree, em); 87 + if (ret == -EEXIST) { 88 + free_extent_map(em); 89 + em = NULL; 90 + goto again; 91 + } else if (ret) { 92 + em = ERR_PTR(ret); 93 + } 94 + out: 95 + return em; 96 + } 97 + 98 + static int btree_writepage(struct page *page, struct writeback_control *wbc) 99 + { 100 + struct extent_map_tree *tree; 101 + tree = &BTRFS_I(page->mapping->host)->extent_tree; 102 + return extent_write_full_page(tree, page, btree_get_extent, wbc); 103 + } 104 + int btree_readpage(struct file *file, struct page *page) 105 + { 106 + struct extent_map_tree *tree; 107 + tree = &BTRFS_I(page->mapping->host)->extent_tree; 108 + return extent_read_full_page(tree, page, btree_get_extent); 109 + } 110 + 111 + static int btree_releasepage(struct page *page, gfp_t unused_gfp_flags) 112 + { 113 + struct extent_map_tree *tree; 114 + int ret; 115 + 116 + BUG_ON(page->private != 1); 117 + tree = &BTRFS_I(page->mapping->host)->extent_tree; 118 + ret = try_release_extent_mapping(tree, page); 119 + if (ret == 1) { 120 + ClearPagePrivate(page); 121 + set_page_private(page, 0); 122 + page_cache_release(page); 123 + } 134 124 return ret; 135 125 } 136 126 137 - static int btree_get_block(struct inode *inode, sector_t iblock, 138 - struct buffer_head *bh, int create) 127 + static void btree_invalidatepage(struct page *page, unsigned long offset) 139 128 { 140 - int err; 141 - struct btrfs_root *root = BTRFS_I(bh->b_page->mapping->host)->root; 142 - err = btrfs_map_bh_to_logical(root, bh, iblock); 143 - return err; 129 + struct extent_map_tree *tree; 130 + tree = &BTRFS_I(page->mapping->host)->extent_tree; 131 + extent_invalidatepage(tree, page, offset); 132 + btree_releasepage(page, GFP_NOFS); 144 133 } 145 134 146 135 int btrfs_csum_data(struct btrfs_root * root, char *data, size_t len, 147 136 char *result) 148 137 { 138 + return 0; 139 + #if 0 149 140 u32 crc; 150 141 crc = crc32c(0, data, len); 151 142 memcpy(result, &crc, BTRFS_CRC32_SIZE); 152 143 return 0; 144 + #endif 153 145 } 154 146 155 - static int csum_tree_block(struct btrfs_root *root, struct buffer_head *bh, 147 + #if 0 148 + static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, 156 149 int verify) 157 150 { 151 + return 0; 158 152 char result[BTRFS_CRC32_SIZE]; 159 153 int ret; 160 154 struct btrfs_node *node; ··· 170 176 } 171 177 return 0; 172 178 } 179 + #endif 173 180 181 + #if 0 174 182 static int btree_writepage(struct page *page, struct writeback_control *wbc) 175 183 { 176 184 struct buffer_head *bh; ··· 191 195 } while (bh != head); 192 196 return block_write_full_page(page, btree_get_block, wbc); 193 197 } 194 - 195 - static int btree_readpage(struct file * file, struct page * page) 196 - { 197 - return block_read_full_page(page, btree_get_block); 198 - } 198 + #endif 199 199 200 200 static struct address_space_operations btree_aops = { 201 201 .readpage = btree_readpage, 202 202 .writepage = btree_writepage, 203 + .releasepage = btree_releasepage, 204 + .invalidatepage = btree_invalidatepage, 203 205 .sync_page = block_sync_page, 204 206 }; 205 207 206 208 int readahead_tree_block(struct btrfs_root *root, u64 blocknr) 207 209 { 208 - struct buffer_head *bh = NULL; 210 + struct extent_buffer *buf = NULL; 211 + struct inode *btree_inode = root->fs_info->btree_inode; 209 212 int ret = 0; 210 213 211 - bh = btrfs_find_create_tree_block(root, blocknr); 212 - if (!bh) 214 + buf = btrfs_find_create_tree_block(root, blocknr); 215 + if (!buf) 213 216 return 0; 214 - if (buffer_uptodate(bh)) { 215 - ret = 1; 216 - goto done; 217 - } 218 - if (test_set_buffer_locked(bh)) { 219 - ret = 1; 220 - goto done; 221 - } 222 - if (!buffer_uptodate(bh)) { 223 - get_bh(bh); 224 - bh->b_end_io = end_buffer_read_sync; 225 - submit_bh(READ, bh); 226 - } else { 227 - unlock_buffer(bh); 228 - ret = 1; 229 - } 230 - done: 231 - brelse(bh); 217 + read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree, 218 + buf, 0); 219 + free_extent_buffer(buf); 232 220 return ret; 233 221 } 234 222 235 - struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr) 223 + struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 blocknr) 236 224 { 237 - struct buffer_head *bh = NULL; 225 + struct extent_buffer *buf = NULL; 226 + struct inode *btree_inode = root->fs_info->btree_inode; 238 227 239 - bh = btrfs_find_create_tree_block(root, blocknr); 240 - if (!bh) 241 - return bh; 242 - if (buffer_uptodate(bh)) 243 - goto uptodate; 244 - lock_buffer(bh); 245 - if (!buffer_uptodate(bh)) { 246 - get_bh(bh); 247 - bh->b_end_io = end_buffer_read_sync; 248 - submit_bh(READ, bh); 249 - wait_on_buffer(bh); 250 - if (!buffer_uptodate(bh)) 251 - goto fail; 252 - } else { 253 - unlock_buffer(bh); 254 - } 255 - uptodate: 256 - if (!buffer_checked(bh)) { 257 - csum_tree_block(root, bh, 1); 258 - set_buffer_checked(bh); 259 - } 260 - if (check_tree_block(root, bh)) 261 - goto fail; 262 - return bh; 263 - fail: 264 - brelse(bh); 265 - return NULL; 228 + buf = btrfs_find_create_tree_block(root, blocknr); 229 + if (!buf) 230 + return NULL; 231 + read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree, 232 + buf, 1); 233 + return buf; 266 234 } 267 235 268 236 int clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root, 269 - struct buffer_head *buf) 237 + struct extent_buffer *buf) 270 238 { 271 - WARN_ON(atomic_read(&buf->b_count) == 0); 272 - lock_buffer(buf); 273 - clear_buffer_dirty(buf); 274 - unlock_buffer(buf); 239 + struct inode *btree_inode = root->fs_info->btree_inode; 240 + clear_extent_buffer_dirty(&BTRFS_I(btree_inode)->extent_tree, buf); 241 + return 0; 242 + } 243 + 244 + int wait_on_tree_block_writeback(struct btrfs_root *root, 245 + struct extent_buffer *buf) 246 + { 247 + struct inode *btree_inode = root->fs_info->btree_inode; 248 + wait_on_extent_buffer_writeback(&BTRFS_I(btree_inode)->extent_tree, 249 + buf); 250 + return 0; 251 + } 252 + 253 + int set_tree_block_dirty(struct btrfs_root *root, struct extent_buffer *buf) 254 + { 255 + struct inode *btree_inode = root->fs_info->btree_inode; 256 + set_extent_buffer_dirty(&BTRFS_I(btree_inode)->extent_tree, buf); 275 257 return 0; 276 258 } 277 259 ··· 261 287 root->node = NULL; 262 288 root->inode = NULL; 263 289 root->commit_root = NULL; 264 - root->blocksize = blocksize; 290 + root->sectorsize = blocksize; 291 + root->nodesize = blocksize; 292 + root->leafsize = blocksize; 265 293 root->ref_cows = 0; 266 294 root->fs_info = fs_info; 267 295 root->objectid = objectid; ··· 308 332 struct btrfs_root *root; 309 333 struct btrfs_root *tree_root = fs_info->tree_root; 310 334 struct btrfs_path *path; 311 - struct btrfs_leaf *l; 335 + struct extent_buffer *l; 312 336 u64 highest_inode; 313 337 int ret = 0; 314 338 ··· 337 361 ret = -ENOENT; 338 362 goto out; 339 363 } 340 - l = btrfs_buffer_leaf(path->nodes[0]); 341 - memcpy(&root->root_item, 342 - btrfs_item_ptr(l, path->slots[0], struct btrfs_root_item), 364 + l = path->nodes[0]; 365 + read_extent_buffer(l, &root->root_item, 366 + btrfs_item_ptr_offset(l, path->slots[0]), 343 367 sizeof(root->root_item)); 344 - memcpy(&root->root_key, location, sizeof(*location)); 345 368 ret = 0; 346 369 out: 347 370 btrfs_release_path(root, path); ··· 381 406 (unsigned long)root->root_key.objectid, 382 407 root); 383 408 if (ret) { 384 - brelse(root->node); 409 + free_extent_buffer(root->node); 385 410 kfree(root); 386 411 return ERR_PTR(ret); 387 412 } 388 413 389 414 ret = btrfs_set_root_name(root, name, namelen); 390 415 if (ret) { 391 - brelse(root->node); 416 + free_extent_buffer(root->node); 392 417 kfree(root); 393 418 return ERR_PTR(ret); 394 419 } 395 420 396 421 ret = btrfs_sysfs_add_root(root); 397 422 if (ret) { 398 - brelse(root->node); 423 + free_extent_buffer(root->node); 399 424 kfree(root->name); 400 425 kfree(root); 401 426 return ERR_PTR(ret); ··· 446 471 fs_info->btree_inode->i_nlink = 1; 447 472 fs_info->btree_inode->i_size = sb->s_bdev->bd_inode->i_size; 448 473 fs_info->btree_inode->i_mapping->a_ops = &btree_aops; 474 + extent_map_tree_init(&BTRFS_I(fs_info->btree_inode)->extent_tree, 475 + fs_info->btree_inode->i_mapping, 476 + GFP_NOFS); 449 477 fs_info->do_barriers = 1; 450 478 fs_info->closing = 0; 451 479 ··· 471 493 472 494 if (!fs_info->sb_buffer) 473 495 goto fail_iput; 474 - disk_super = (struct btrfs_super_block *)fs_info->sb_buffer->b_data; 475 - fs_info->disk_super = disk_super; 476 - memcpy(&fs_info->super_copy, disk_super, sizeof(fs_info->super_copy)); 477 496 497 + read_extent_buffer(fs_info->sb_buffer, &fs_info->super_copy, 0, 498 + sizeof(fs_info->super_copy)); 499 + 500 + read_extent_buffer(fs_info->sb_buffer, fs_info->fsid, 501 + (unsigned long)btrfs_super_fsid(fs_info->sb_buffer), 502 + BTRFS_FSID_SIZE); 503 + disk_super = &fs_info->super_copy; 478 504 if (!btrfs_super_root(disk_super)) 479 505 goto fail_sb_buffer; 480 506 ··· 512 530 return tree_root; 513 531 514 532 fail_tree_root: 515 - btrfs_block_release(tree_root, tree_root->node); 533 + free_extent_buffer(tree_root->node); 516 534 fail_sb_buffer: 517 - btrfs_block_release(tree_root, fs_info->sb_buffer); 535 + free_extent_buffer(fs_info->sb_buffer); 518 536 fail_iput: 519 537 iput(fs_info->btree_inode); 520 538 fail: ··· 528 546 *root) 529 547 { 530 548 int ret; 531 - struct buffer_head *bh = root->fs_info->sb_buffer; 549 + struct extent_buffer *super = root->fs_info->sb_buffer; 550 + struct inode *btree_inode = root->fs_info->btree_inode; 532 551 533 - lock_buffer(bh); 534 - WARN_ON(atomic_read(&bh->b_count) < 1); 535 - clear_buffer_dirty(bh); 536 - csum_tree_block(root, bh, 0); 537 - bh->b_end_io = end_buffer_write_sync; 538 - get_bh(bh); 539 - if (root->fs_info->do_barriers) 540 - ret = submit_bh(WRITE_BARRIER, bh); 541 - else 542 - ret = submit_bh(WRITE, bh); 543 - if (ret == -EOPNOTSUPP) { 544 - get_bh(bh); 545 - lock_buffer(bh); 546 - set_buffer_uptodate(bh); 547 - root->fs_info->do_barriers = 0; 548 - ret = submit_bh(WRITE, bh); 549 - } 550 - wait_on_buffer(bh); 551 - if (!buffer_uptodate(bh)) { 552 - WARN_ON(1); 553 - return -EIO; 554 - } 555 - return 0; 552 + set_extent_buffer_dirty(&BTRFS_I(btree_inode)->extent_tree, super); 553 + ret = sync_page_range_nolock(btree_inode, btree_inode->i_mapping, 554 + super->start, super->len); 555 + return ret; 556 556 } 557 557 558 558 int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root) ··· 545 581 if (root->inode) 546 582 iput(root->inode); 547 583 if (root->node) 548 - brelse(root->node); 584 + free_extent_buffer(root->node); 549 585 if (root->commit_root) 550 - brelse(root->commit_root); 586 + free_extent_buffer(root->commit_root); 551 587 if (root->name) 552 588 kfree(root->name); 553 589 kfree(root); ··· 593 629 mutex_unlock(&fs_info->fs_mutex); 594 630 595 631 if (fs_info->extent_root->node) 596 - btrfs_block_release(fs_info->extent_root, 597 - fs_info->extent_root->node); 632 + free_extent_buffer(fs_info->extent_root->node); 598 633 if (fs_info->tree_root->node) 599 - btrfs_block_release(fs_info->tree_root, 600 - fs_info->tree_root->node); 601 - btrfs_block_release(root, fs_info->sb_buffer); 634 + free_extent_buffer(fs_info->tree_root->node); 635 + free_extent_buffer(fs_info->sb_buffer); 602 636 truncate_inode_pages(fs_info->btree_inode->i_mapping, 0); 603 637 iput(fs_info->btree_inode); 604 638 ··· 607 645 return 0; 608 646 } 609 647 610 - void btrfs_mark_buffer_dirty(struct buffer_head *bh) 648 + int btrfs_buffer_uptodate(struct extent_buffer *buf) 611 649 { 612 - struct btrfs_root *root = BTRFS_I(bh->b_page->mapping->host)->root; 613 - u64 transid = btrfs_header_generation(btrfs_buffer_header(bh)); 650 + struct inode *btree_inode = buf->pages[0]->mapping->host; 651 + return extent_buffer_uptodate(&BTRFS_I(btree_inode)->extent_tree, buf); 652 + } 614 653 615 - WARN_ON(!atomic_read(&bh->b_count)); 654 + int btrfs_set_buffer_uptodate(struct extent_buffer *buf) 655 + { 656 + struct inode *btree_inode = buf->pages[0]->mapping->host; 657 + return set_extent_buffer_uptodate(&BTRFS_I(btree_inode)->extent_tree, 658 + buf); 659 + } 660 + 661 + void btrfs_mark_buffer_dirty(struct extent_buffer *buf) 662 + { 663 + struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 664 + u64 transid = btrfs_header_generation(buf); 665 + struct inode *btree_inode = root->fs_info->btree_inode; 616 666 617 667 if (transid != root->fs_info->generation) { 618 668 printk(KERN_CRIT "transid mismatch buffer %llu, found %Lu running %Lu\n", 619 - (unsigned long long)bh->b_blocknr, 669 + (unsigned long long)extent_buffer_blocknr(buf), 620 670 transid, root->fs_info->generation); 621 671 WARN_ON(1); 622 672 } 623 - mark_buffer_dirty(bh); 624 - } 625 - 626 - void btrfs_block_release(struct btrfs_root *root, struct buffer_head *buf) 627 - { 628 - brelse(buf); 673 + set_extent_buffer_dirty(&BTRFS_I(btree_inode)->extent_tree, buf); 629 674 } 630 675 631 676 void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr)
+11 -44
fs/btrfs/disk-io.h
··· 19 19 #ifndef __DISKIO__ 20 20 #define __DISKIO__ 21 21 22 - #include <linux/buffer_head.h> 23 - 24 22 #define BTRFS_SUPER_INFO_OFFSET (16 * 1024) 25 23 26 - enum btrfs_bh_state_bits { 27 - BH_Checked = BH_PrivateStart, 28 - BH_Defrag, 29 - BH_DefragDone, 30 - }; 31 - BUFFER_FNS(Checked, checked); 32 - BUFFER_FNS(Defrag, defrag); 33 - BUFFER_FNS(DefragDone, defrag_done); 34 - 35 - static inline struct btrfs_node *btrfs_buffer_node(struct buffer_head *bh) 36 - { 37 - return (struct btrfs_node *)bh->b_data; 38 - } 39 - 40 - static inline struct btrfs_leaf *btrfs_buffer_leaf(struct buffer_head *bh) 41 - { 42 - return (struct btrfs_leaf *)bh->b_data; 43 - } 44 - 45 - static inline struct btrfs_header *btrfs_buffer_header(struct buffer_head *bh) 46 - { 47 - return &((struct btrfs_node *)bh->b_data)->header; 48 - } 49 - 50 - struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr); 24 + struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 blocknr); 51 25 int readahead_tree_block(struct btrfs_root *root, u64 blocknr); 52 - struct buffer_head *btrfs_find_create_tree_block(struct btrfs_root *root, 53 - u64 blocknr); 54 - int write_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root, 55 - struct buffer_head *buf); 56 - int dirty_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root, 57 - struct buffer_head *buf); 26 + struct extent_buffer *btrfs_find_create_tree_block(struct btrfs_root *root, 27 + u64 blocknr); 58 28 int clean_tree_block(struct btrfs_trans_handle *trans, 59 - struct btrfs_root *root, struct buffer_head *buf); 60 - int btrfs_commit_transaction(struct btrfs_trans_handle *trans, 61 - struct btrfs_root *root); 29 + struct btrfs_root *root, struct extent_buffer *buf); 62 30 struct btrfs_root *open_ctree(struct super_block *sb); 63 31 int close_ctree(struct btrfs_root *root); 64 - void btrfs_block_release(struct btrfs_root *root, struct buffer_head *buf); 65 32 int write_ctree_super(struct btrfs_trans_handle *trans, 66 33 struct btrfs_root *root); 67 - struct buffer_head *btrfs_find_tree_block(struct btrfs_root *root, u64 blocknr); 68 - int btrfs_csum_data(struct btrfs_root * root, char *data, size_t len, 69 - char *result); 34 + struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root, 35 + u64 blocknr); 70 36 struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, 71 37 struct btrfs_key *location, 72 38 const char *name, int namelen); 73 39 struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_fs_info *fs_info, 74 40 struct btrfs_key *location); 75 - u64 bh_blocknr(struct buffer_head *bh); 76 41 int btrfs_insert_dev_radix(struct btrfs_root *root, 77 42 struct block_device *bdev, 78 43 u64 device_id, 79 44 u64 block_start, 80 45 u64 num_blocks); 81 - int btrfs_map_bh_to_logical(struct btrfs_root *root, struct buffer_head *bh, 82 - u64 logical); 83 46 void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr); 84 47 int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root); 85 - void btrfs_mark_buffer_dirty(struct buffer_head *bh); 48 + void btrfs_mark_buffer_dirty(struct extent_buffer *buf); 49 + int btrfs_buffer_uptodate(struct extent_buffer *buf); 50 + int btrfs_set_buffer_uptodate(struct extent_buffer *buf); 51 + int wait_on_tree_block_writeback(struct btrfs_root *root, 52 + struct extent_buffer *buf); 86 53 #endif
+150 -144
fs/btrfs/extent-tree.c
··· 33 33 struct btrfs_path *path; 34 34 int ret; 35 35 struct btrfs_key key; 36 - struct btrfs_leaf *leaf; 36 + struct extent_buffer *leaf; 37 37 struct radix_tree_root *extent_radix; 38 38 int slot; 39 39 u64 i; ··· 56 56 path->reada = 2; 57 57 first_free = block_group->key.objectid; 58 58 key.objectid = block_group->key.objectid; 59 - key.flags = 0; 60 59 key.offset = 0; 61 60 62 61 btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); ··· 68 69 path->slots[0]--; 69 70 70 71 while(1) { 71 - leaf = btrfs_buffer_leaf(path->nodes[0]); 72 + leaf = path->nodes[0]; 72 73 slot = path->slots[0]; 73 - if (slot >= btrfs_header_nritems(&leaf->header)) { 74 + if (slot >= btrfs_header_nritems(leaf)) { 74 75 ret = btrfs_next_leaf(root, path); 75 76 if (ret < 0) 76 77 goto err; ··· 81 82 } 82 83 } 83 84 84 - btrfs_disk_key_to_cpu(&key, &leaf->items[slot].key); 85 + btrfs_item_key_to_cpu(leaf, &key, slot); 85 86 if (key.objectid < block_group->key.objectid) { 86 87 if (key.objectid + key.offset > first_free) 87 88 first_free = key.objectid + key.offset; ··· 115 116 hole_size = block_group->key.objectid + 116 117 block_group->key.offset - last; 117 118 for (i = 0; i < hole_size; i++) { 118 - set_radix_bit(extent_radix, 119 - last + i); 119 + set_radix_bit(extent_radix, last + i); 120 120 } 121 121 } 122 122 block_group->cached = 1; ··· 364 366 struct btrfs_path *path; 365 367 int ret; 366 368 struct btrfs_key key; 367 - struct btrfs_leaf *l; 369 + struct extent_buffer *l; 368 370 struct btrfs_extent_item *item; 369 371 u32 refs; 370 372 ··· 373 375 return -ENOMEM; 374 376 375 377 key.objectid = blocknr; 376 - key.flags = 0; 377 378 btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); 378 379 key.offset = num_blocks; 379 380 ret = btrfs_search_slot(trans, root->fs_info->extent_root, &key, path, ··· 383 386 BUG(); 384 387 } 385 388 BUG_ON(ret != 0); 386 - l = btrfs_buffer_leaf(path->nodes[0]); 389 + l = path->nodes[0]; 387 390 item = btrfs_item_ptr(l, path->slots[0], struct btrfs_extent_item); 388 - refs = btrfs_extent_refs(item); 389 - btrfs_set_extent_refs(item, refs + 1); 391 + refs = btrfs_extent_refs(l, item); 392 + btrfs_set_extent_refs(l, item, refs + 1); 390 393 btrfs_mark_buffer_dirty(path->nodes[0]); 391 394 392 395 btrfs_release_path(root->fs_info->extent_root, path); ··· 411 414 struct btrfs_path *path; 412 415 int ret; 413 416 struct btrfs_key key; 414 - struct btrfs_leaf *l; 417 + struct extent_buffer *l; 415 418 struct btrfs_extent_item *item; 416 419 417 420 path = btrfs_alloc_path(); 418 421 key.objectid = blocknr; 419 422 key.offset = num_blocks; 420 - key.flags = 0; 421 423 btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); 422 424 ret = btrfs_search_slot(trans, root->fs_info->extent_root, &key, path, 423 425 0, 0); 424 426 if (ret < 0) 425 427 goto out; 426 - if (ret != 0) 428 + if (ret != 0) { 429 + btrfs_print_leaf(root, path->nodes[0]); 430 + printk("failed to find block number %Lu\n", blocknr); 427 431 BUG(); 428 - l = btrfs_buffer_leaf(path->nodes[0]); 432 + } 433 + l = path->nodes[0]; 429 434 item = btrfs_item_ptr(l, path->slots[0], struct btrfs_extent_item); 430 - *refs = btrfs_extent_refs(item); 435 + *refs = btrfs_extent_refs(l, item); 431 436 out: 432 437 btrfs_free_path(path); 433 438 return 0; ··· 438 439 int btrfs_inc_root_ref(struct btrfs_trans_handle *trans, 439 440 struct btrfs_root *root) 440 441 { 441 - return btrfs_inc_extent_ref(trans, root, bh_blocknr(root->node), 1); 442 + return btrfs_inc_extent_ref(trans, root, 443 + extent_buffer_blocknr(root->node), 1); 442 444 } 443 445 444 446 int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, 445 - struct buffer_head *buf) 447 + struct extent_buffer *buf) 446 448 { 447 449 u64 blocknr; 448 - struct btrfs_node *buf_node; 449 - struct btrfs_leaf *buf_leaf; 450 - struct btrfs_disk_key *key; 450 + u32 nritems; 451 + struct btrfs_key key; 451 452 struct btrfs_file_extent_item *fi; 452 453 int i; 453 454 int leaf; ··· 457 458 458 459 if (!root->ref_cows) 459 460 return 0; 460 - buf_node = btrfs_buffer_node(buf); 461 - leaf = btrfs_is_leaf(buf_node); 462 - buf_leaf = btrfs_buffer_leaf(buf); 463 - for (i = 0; i < btrfs_header_nritems(&buf_node->header); i++) { 461 + 462 + leaf = btrfs_is_leaf(buf); 463 + nritems = btrfs_header_nritems(buf); 464 + for (i = 0; i < nritems; i++) { 464 465 if (leaf) { 465 466 u64 disk_blocknr; 466 - key = &buf_leaf->items[i].key; 467 - if (btrfs_disk_key_type(key) != BTRFS_EXTENT_DATA_KEY) 467 + btrfs_item_key_to_cpu(buf, &key, i); 468 + if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY) 468 469 continue; 469 - fi = btrfs_item_ptr(buf_leaf, i, 470 + fi = btrfs_item_ptr(buf, i, 470 471 struct btrfs_file_extent_item); 471 - if (btrfs_file_extent_type(fi) == 472 + if (btrfs_file_extent_type(buf, fi) == 472 473 BTRFS_FILE_EXTENT_INLINE) 473 474 continue; 474 - disk_blocknr = btrfs_file_extent_disk_blocknr(fi); 475 + disk_blocknr = btrfs_file_extent_disk_blocknr(buf, fi); 475 476 if (disk_blocknr == 0) 476 477 continue; 477 478 ret = btrfs_inc_extent_ref(trans, root, disk_blocknr, 478 - btrfs_file_extent_disk_num_blocks(fi)); 479 + btrfs_file_extent_disk_num_blocks(buf, fi)); 479 480 if (ret) { 480 481 faili = i; 481 482 goto fail; 482 483 } 483 484 } else { 484 - blocknr = btrfs_node_blockptr(buf_node, i); 485 + blocknr = btrfs_node_blockptr(buf, i); 485 486 ret = btrfs_inc_extent_ref(trans, root, blocknr, 1); 486 487 if (ret) { 487 488 faili = i; ··· 495 496 for (i =0; i < faili; i++) { 496 497 if (leaf) { 497 498 u64 disk_blocknr; 498 - key = &buf_leaf->items[i].key; 499 - if (btrfs_disk_key_type(key) != BTRFS_EXTENT_DATA_KEY) 499 + btrfs_item_key_to_cpu(buf, &key, i); 500 + if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY) 500 501 continue; 501 - fi = btrfs_item_ptr(buf_leaf, i, 502 + fi = btrfs_item_ptr(buf, i, 502 503 struct btrfs_file_extent_item); 503 - if (btrfs_file_extent_type(fi) == 504 + if (btrfs_file_extent_type(buf, fi) == 504 505 BTRFS_FILE_EXTENT_INLINE) 505 506 continue; 506 - disk_blocknr = btrfs_file_extent_disk_blocknr(fi); 507 + disk_blocknr = btrfs_file_extent_disk_blocknr(buf, fi); 507 508 if (disk_blocknr == 0) 508 509 continue; 509 510 err = btrfs_free_extent(trans, root, disk_blocknr, 510 - btrfs_file_extent_disk_num_blocks(fi), 0); 511 + btrfs_file_extent_disk_num_blocks(buf, 512 + fi), 0); 511 513 BUG_ON(err); 512 514 } else { 513 - blocknr = btrfs_node_blockptr(buf_node, i); 515 + blocknr = btrfs_node_blockptr(buf, i); 514 516 err = btrfs_free_extent(trans, root, blocknr, 1, 0); 515 517 BUG_ON(err); 516 518 } ··· 527 527 int ret; 528 528 int pending_ret; 529 529 struct btrfs_root *extent_root = root->fs_info->extent_root; 530 - struct btrfs_block_group_item *bi; 530 + unsigned long bi; 531 + struct extent_buffer *leaf; 531 532 532 533 ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); 533 534 if (ret < 0) 534 535 goto fail; 535 536 BUG_ON(ret); 536 - bi = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 537 - struct btrfs_block_group_item); 538 - memcpy(bi, &cache->item, sizeof(*bi)); 539 - btrfs_mark_buffer_dirty(path->nodes[0]); 537 + 538 + leaf = path->nodes[0]; 539 + bi = btrfs_item_ptr_offset(leaf, path->slots[0]); 540 + write_extent_buffer(leaf, &cache->item, bi, sizeof(cache->item)); 541 + btrfs_mark_buffer_dirty(leaf); 540 542 btrfs_release_path(extent_root, path); 541 543 fail: 542 544 finish_current_insert(trans, extent_root); ··· 770 768 unsigned long gang[8]; 771 769 struct btrfs_fs_info *info = extent_root->fs_info; 772 770 773 - btrfs_set_extent_refs(&extent_item, 1); 771 + btrfs_set_stack_extent_refs(&extent_item, 1); 774 772 ins.offset = 1; 775 - ins.flags = 0; 776 773 btrfs_set_key_type(&ins, BTRFS_EXTENT_ITEM_KEY); 777 - btrfs_set_extent_owner(&extent_item, extent_root->root_key.objectid); 774 + btrfs_set_stack_extent_owner(&extent_item, 775 + extent_root->root_key.objectid); 778 776 779 777 while(1) { 780 778 ret = find_first_radix_bit(&info->extent_ins_radix, gang, 0, ··· 797 795 static int pin_down_block(struct btrfs_root *root, u64 blocknr, int pending) 798 796 { 799 797 int err; 800 - struct btrfs_header *header; 801 - struct buffer_head *bh; 798 + struct extent_buffer *buf; 802 799 803 800 if (!pending) { 804 - bh = btrfs_find_tree_block(root, blocknr); 805 - if (bh) { 806 - if (buffer_uptodate(bh)) { 801 + buf = btrfs_find_tree_block(root, blocknr); 802 + if (buf) { 803 + if (btrfs_buffer_uptodate(buf)) { 807 804 u64 transid = 808 805 root->fs_info->running_transaction->transid; 809 - header = btrfs_buffer_header(bh); 810 - if (btrfs_header_generation(header) == 811 - transid) { 812 - btrfs_block_release(root, bh); 806 + if (btrfs_header_generation(buf) == transid) { 807 + free_extent_buffer(buf); 813 808 return 0; 814 809 } 815 810 } 816 - btrfs_block_release(root, bh); 811 + free_extent_buffer(buf); 817 812 } 818 813 err = set_radix_bit(&root->fs_info->pinned_radix, blocknr); 819 814 if (!err) { ··· 838 839 struct btrfs_key key; 839 840 struct btrfs_fs_info *info = root->fs_info; 840 841 struct btrfs_root *extent_root = info->extent_root; 842 + struct extent_buffer *leaf; 841 843 int ret; 842 844 struct btrfs_extent_item *ei; 843 845 u32 refs; 844 846 845 847 key.objectid = blocknr; 846 - key.flags = 0; 847 848 btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); 848 849 key.offset = num_blocks; 849 850 ··· 855 856 if (ret < 0) 856 857 return ret; 857 858 BUG_ON(ret); 858 - ei = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 859 + 860 + leaf = path->nodes[0]; 861 + ei = btrfs_item_ptr(leaf, path->slots[0], 859 862 struct btrfs_extent_item); 860 - BUG_ON(ei->refs == 0); 861 - refs = btrfs_extent_refs(ei) - 1; 862 - btrfs_set_extent_refs(ei, refs); 863 - btrfs_mark_buffer_dirty(path->nodes[0]); 863 + refs = btrfs_extent_refs(leaf, ei); 864 + BUG_ON(refs == 0); 865 + refs -= 1; 866 + btrfs_set_extent_refs(leaf, ei, refs); 867 + btrfs_mark_buffer_dirty(leaf); 868 + 864 869 if (refs == 0) { 865 870 u64 super_blocks_used, root_blocks_used; 866 871 ··· 879 876 super_blocks_used - num_blocks); 880 877 881 878 /* block accounting for root item */ 882 - root_blocks_used = btrfs_root_blocks_used(&root->root_item); 883 - btrfs_set_root_blocks_used(&root->root_item, 879 + root_blocks_used = btrfs_root_used(&root->root_item); 880 + btrfs_set_root_used(&root->root_item, 884 881 root_blocks_used - num_blocks); 885 882 886 883 ret = btrfs_del_item(trans, extent_root, path); ··· 987 984 u64 test_block; 988 985 u64 orig_search_start = search_start; 989 986 int start_found; 990 - struct btrfs_leaf *l; 987 + struct extent_buffer *l; 991 988 struct btrfs_root * root = orig_root->fs_info->extent_root; 992 989 struct btrfs_fs_info *info = root->fs_info; 993 990 int total_needed = num_blocks; ··· 997 994 int wrapped = 0; 998 995 999 996 WARN_ON(num_blocks < 1); 1000 - ins->flags = 0; 1001 997 btrfs_set_key_type(ins, BTRFS_EXTENT_ITEM_KEY); 1002 998 1003 - level = btrfs_header_level(btrfs_buffer_header(root->node)); 999 + level = btrfs_header_level(root->node); 1000 + 1004 1001 if (search_end == (u64)-1) 1005 1002 search_end = btrfs_super_total_blocks(&info->super_copy); 1006 1003 if (hint_block) { ··· 1037 1034 path->slots[0]--; 1038 1035 } 1039 1036 1040 - l = btrfs_buffer_leaf(path->nodes[0]); 1041 - btrfs_disk_key_to_cpu(&key, &l->items[path->slots[0]].key); 1037 + l = path->nodes[0]; 1038 + btrfs_item_key_to_cpu(l, &key, path->slots[0]); 1039 + 1042 1040 /* 1043 1041 * a rare case, go back one key if we hit a block group item 1044 1042 * instead of an extent item ··· 1059 1055 } 1060 1056 1061 1057 while (1) { 1062 - l = btrfs_buffer_leaf(path->nodes[0]); 1058 + l = path->nodes[0]; 1063 1059 slot = path->slots[0]; 1064 - if (slot >= btrfs_header_nritems(&l->header)) { 1060 + if (slot >= btrfs_header_nritems(l)) { 1065 1061 ret = btrfs_next_leaf(root, path); 1066 1062 if (ret == 0) 1067 1063 continue; ··· 1079 1075 goto check_pending; 1080 1076 } 1081 1077 1082 - btrfs_disk_key_to_cpu(&key, &l->items[slot].key); 1078 + btrfs_item_key_to_cpu(l, &key, slot); 1083 1079 if (key.objectid >= search_start && key.objectid > last_block && 1084 1080 start_found) { 1085 1081 if (last_block < search_start) ··· 1187 1183 struct btrfs_root *extent_root = info->extent_root; 1188 1184 struct btrfs_extent_item extent_item; 1189 1185 1190 - btrfs_set_extent_refs(&extent_item, 1); 1191 - btrfs_set_extent_owner(&extent_item, owner); 1186 + btrfs_set_stack_extent_refs(&extent_item, 1); 1187 + btrfs_set_stack_extent_owner(&extent_item, owner); 1192 1188 1193 1189 WARN_ON(num_blocks < 1); 1194 1190 ret = find_free_extent(trans, root, num_blocks, empty_size, ··· 1205 1201 num_blocks); 1206 1202 1207 1203 /* block accounting for root item */ 1208 - root_blocks_used = btrfs_root_blocks_used(&root->root_item); 1209 - btrfs_set_root_blocks_used(&root->root_item, root_blocks_used + 1204 + root_blocks_used = btrfs_root_used(&root->root_item); 1205 + btrfs_set_root_used(&root->root_item, root_blocks_used + 1210 1206 num_blocks); 1211 1207 1212 1208 if (root == extent_root) { ··· 1245 1241 * helper function to allocate a block for a given tree 1246 1242 * returns the tree buffer or NULL. 1247 1243 */ 1248 - struct buffer_head *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, 1249 - struct btrfs_root *root, u64 hint, 1250 - u64 empty_size) 1244 + struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, 1245 + struct btrfs_root *root, u64 hint, 1246 + u64 empty_size) 1251 1247 { 1252 1248 struct btrfs_key ins; 1253 1249 int ret; 1254 - struct buffer_head *buf; 1250 + struct extent_buffer *buf; 1255 1251 1256 1252 ret = btrfs_alloc_extent(trans, root, root->root_key.objectid, 1257 1253 1, empty_size, hint, (u64)-1, &ins, 0); ··· 1264 1260 btrfs_free_extent(trans, root, ins.objectid, 1, 0); 1265 1261 return ERR_PTR(-ENOMEM); 1266 1262 } 1267 - WARN_ON(buffer_dirty(buf)); 1268 - set_buffer_uptodate(buf); 1263 + btrfs_set_buffer_uptodate(buf); 1264 + set_extent_dirty(&trans->transaction->dirty_pages, buf->start, 1265 + buf->start + buf->len - 1, GFP_NOFS); 1266 + /* 1269 1267 set_buffer_checked(buf); 1270 1268 set_buffer_defrag(buf); 1271 - set_radix_bit(&trans->transaction->dirty_pages, buf->b_page->index); 1269 + */ 1270 + /* FIXME!!!!!!!!!!!!!!!! 1271 + set_radix_bit(&trans->transaction->dirty_pages, buf->pages[0]->index); 1272 + */ 1272 1273 trans->blocks_used++; 1273 1274 return buf; 1274 1275 } 1275 1276 1276 1277 static int drop_leaf_ref(struct btrfs_trans_handle *trans, 1277 - struct btrfs_root *root, struct buffer_head *cur) 1278 + struct btrfs_root *root, struct extent_buffer *leaf) 1278 1279 { 1279 - struct btrfs_disk_key *key; 1280 - struct btrfs_leaf *leaf; 1280 + struct btrfs_key key; 1281 1281 struct btrfs_file_extent_item *fi; 1282 1282 int i; 1283 1283 int nritems; 1284 1284 int ret; 1285 1285 1286 - BUG_ON(!btrfs_is_leaf(btrfs_buffer_node(cur))); 1287 - leaf = btrfs_buffer_leaf(cur); 1288 - nritems = btrfs_header_nritems(&leaf->header); 1286 + BUG_ON(!btrfs_is_leaf(leaf)); 1287 + nritems = btrfs_header_nritems(leaf); 1289 1288 for (i = 0; i < nritems; i++) { 1290 1289 u64 disk_blocknr; 1291 - key = &leaf->items[i].key; 1292 - if (btrfs_disk_key_type(key) != BTRFS_EXTENT_DATA_KEY) 1290 + 1291 + btrfs_item_key_to_cpu(leaf, &key, i); 1292 + if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY) 1293 1293 continue; 1294 1294 fi = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item); 1295 - if (btrfs_file_extent_type(fi) == BTRFS_FILE_EXTENT_INLINE) 1295 + if (btrfs_file_extent_type(leaf, fi) == 1296 + BTRFS_FILE_EXTENT_INLINE) 1296 1297 continue; 1297 1298 /* 1298 1299 * FIXME make sure to insert a trans record that 1299 1300 * repeats the snapshot del on crash 1300 1301 */ 1301 - disk_blocknr = btrfs_file_extent_disk_blocknr(fi); 1302 + disk_blocknr = btrfs_file_extent_disk_blocknr(leaf, fi); 1302 1303 if (disk_blocknr == 0) 1303 1304 continue; 1304 1305 ret = btrfs_free_extent(trans, root, disk_blocknr, 1305 - btrfs_file_extent_disk_num_blocks(fi), 1306 - 0); 1306 + btrfs_file_extent_disk_num_blocks(leaf, fi), 0); 1307 1307 BUG_ON(ret); 1308 1308 } 1309 1309 return 0; 1310 1310 } 1311 1311 1312 1312 static void reada_walk_down(struct btrfs_root *root, 1313 - struct btrfs_node *node) 1313 + struct extent_buffer *node) 1314 1314 { 1315 1315 int i; 1316 1316 u32 nritems; ··· 1322 1314 int ret; 1323 1315 u32 refs; 1324 1316 1325 - nritems = btrfs_header_nritems(&node->header); 1317 + nritems = btrfs_header_nritems(node); 1326 1318 for (i = 0; i < nritems; i++) { 1327 1319 blocknr = btrfs_node_blockptr(node, i); 1328 1320 ret = lookup_extent_ref(NULL, root, blocknr, 1, &refs); ··· 1345 1337 static int walk_down_tree(struct btrfs_trans_handle *trans, struct btrfs_root 1346 1338 *root, struct btrfs_path *path, int *level) 1347 1339 { 1348 - struct buffer_head *next; 1349 - struct buffer_head *cur; 1340 + struct extent_buffer *next; 1341 + struct extent_buffer *cur; 1350 1342 u64 blocknr; 1351 1343 int ret; 1352 1344 u32 refs; 1353 1345 1354 1346 WARN_ON(*level < 0); 1355 1347 WARN_ON(*level >= BTRFS_MAX_LEVEL); 1356 - ret = lookup_extent_ref(trans, root, bh_blocknr(path->nodes[*level]), 1357 - 1, &refs); 1348 + ret = lookup_extent_ref(trans, root, 1349 + extent_buffer_blocknr(path->nodes[*level]), 1350 + 1, &refs); 1358 1351 BUG_ON(ret); 1359 1352 if (refs > 1) 1360 1353 goto out; ··· 1369 1360 cur = path->nodes[*level]; 1370 1361 1371 1362 if (*level > 0 && path->slots[*level] == 0) 1372 - reada_walk_down(root, btrfs_buffer_node(cur)); 1363 + reada_walk_down(root, cur); 1373 1364 1374 - if (btrfs_header_level(btrfs_buffer_header(cur)) != *level) 1365 + if (btrfs_header_level(cur) != *level) 1375 1366 WARN_ON(1); 1376 1367 1377 1368 if (path->slots[*level] >= 1378 - btrfs_header_nritems(btrfs_buffer_header(cur))) 1369 + btrfs_header_nritems(cur)) 1379 1370 break; 1380 1371 if (*level == 0) { 1381 1372 ret = drop_leaf_ref(trans, root, cur); 1382 1373 BUG_ON(ret); 1383 1374 break; 1384 1375 } 1385 - blocknr = btrfs_node_blockptr(btrfs_buffer_node(cur), 1386 - path->slots[*level]); 1376 + blocknr = btrfs_node_blockptr(cur, path->slots[*level]); 1387 1377 ret = lookup_extent_ref(trans, root, blocknr, 1, &refs); 1388 1378 BUG_ON(ret); 1389 1379 if (refs != 1) { ··· 1392 1384 continue; 1393 1385 } 1394 1386 next = btrfs_find_tree_block(root, blocknr); 1395 - if (!next || !buffer_uptodate(next)) { 1396 - brelse(next); 1387 + if (!next || !btrfs_buffer_uptodate(next)) { 1388 + free_extent_buffer(next); 1397 1389 mutex_unlock(&root->fs_info->fs_mutex); 1398 1390 next = read_tree_block(root, blocknr); 1399 1391 mutex_lock(&root->fs_info->fs_mutex); ··· 1403 1395 BUG_ON(ret); 1404 1396 if (refs != 1) { 1405 1397 path->slots[*level]++; 1406 - brelse(next); 1398 + free_extent_buffer(next); 1407 1399 ret = btrfs_free_extent(trans, root, 1408 1400 blocknr, 1, 1); 1409 1401 BUG_ON(ret); ··· 1412 1404 } 1413 1405 WARN_ON(*level <= 0); 1414 1406 if (path->nodes[*level-1]) 1415 - btrfs_block_release(root, path->nodes[*level-1]); 1407 + free_extent_buffer(path->nodes[*level-1]); 1416 1408 path->nodes[*level-1] = next; 1417 - *level = btrfs_header_level(btrfs_buffer_header(next)); 1409 + *level = btrfs_header_level(next); 1418 1410 path->slots[*level] = 0; 1419 1411 } 1420 1412 out: 1421 1413 WARN_ON(*level < 0); 1422 1414 WARN_ON(*level >= BTRFS_MAX_LEVEL); 1423 1415 ret = btrfs_free_extent(trans, root, 1424 - bh_blocknr(path->nodes[*level]), 1, 1); 1425 - btrfs_block_release(root, path->nodes[*level]); 1416 + extent_buffer_blocknr(path->nodes[*level]), 1, 1); 1417 + free_extent_buffer(path->nodes[*level]); 1426 1418 path->nodes[*level] = NULL; 1427 1419 *level += 1; 1428 1420 BUG_ON(ret); ··· 1444 1436 1445 1437 for(i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) { 1446 1438 slot = path->slots[i]; 1447 - if (slot < btrfs_header_nritems( 1448 - btrfs_buffer_header(path->nodes[i])) - 1) { 1449 - struct btrfs_node *node; 1450 - node = btrfs_buffer_node(path->nodes[i]); 1439 + if (slot < btrfs_header_nritems(path->nodes[i]) - 1) { 1440 + struct extent_buffer *node; 1441 + struct btrfs_disk_key disk_key; 1442 + node = path->nodes[i]; 1451 1443 path->slots[i]++; 1452 1444 *level = i; 1453 1445 WARN_ON(*level == 0); 1446 + btrfs_node_key(node, &disk_key, path->slots[i]); 1454 1447 memcpy(&root_item->drop_progress, 1455 - &node->ptrs[path->slots[i]].key, 1456 - sizeof(root_item->drop_progress)); 1448 + &disk_key, sizeof(disk_key)); 1457 1449 root_item->drop_level = i; 1458 1450 return 0; 1459 1451 } else { 1460 1452 ret = btrfs_free_extent(trans, root, 1461 - bh_blocknr(path->nodes[*level]), 1462 - 1, 1); 1453 + extent_buffer_blocknr(path->nodes[*level]), 1454 + 1, 1); 1463 1455 BUG_ON(ret); 1464 - btrfs_block_release(root, path->nodes[*level]); 1456 + free_extent_buffer(path->nodes[*level]); 1465 1457 path->nodes[*level] = NULL; 1466 1458 *level = i + 1; 1467 1459 } ··· 1488 1480 path = btrfs_alloc_path(); 1489 1481 BUG_ON(!path); 1490 1482 1491 - level = btrfs_header_level(btrfs_buffer_header(root->node)); 1483 + level = btrfs_header_level(root->node); 1492 1484 orig_level = level; 1493 1485 if (btrfs_disk_key_objectid(&root_item->drop_progress) == 0) { 1494 1486 path->nodes[level] = root->node; 1495 1487 path->slots[level] = 0; 1496 1488 } else { 1497 1489 struct btrfs_key key; 1498 - struct btrfs_disk_key *found_key; 1499 - struct btrfs_node *node; 1490 + struct btrfs_disk_key found_key; 1491 + struct extent_buffer *node; 1500 1492 1501 1493 btrfs_disk_key_to_cpu(&key, &root_item->drop_progress); 1502 1494 level = root_item->drop_level; ··· 1506 1498 ret = wret; 1507 1499 goto out; 1508 1500 } 1509 - node = btrfs_buffer_node(path->nodes[level]); 1510 - found_key = &node->ptrs[path->slots[level]].key; 1511 - WARN_ON(memcmp(found_key, &root_item->drop_progress, 1512 - sizeof(*found_key))); 1501 + node = path->nodes[level]; 1502 + btrfs_node_key(node, &found_key, path->slots[level]); 1503 + WARN_ON(memcmp(&found_key, &root_item->drop_progress, 1504 + sizeof(found_key))); 1513 1505 } 1514 1506 while(1) { 1515 1507 wret = walk_down_tree(trans, root, path, &level); ··· 1524 1516 if (wret < 0) 1525 1517 ret = wret; 1526 1518 ret = -EAGAIN; 1527 - get_bh(root->node); 1519 + extent_buffer_get(root->node); 1528 1520 break; 1529 1521 } 1530 1522 for (i = 0; i <= orig_level; i++) { 1531 1523 if (path->nodes[i]) { 1532 - btrfs_block_release(root, path->nodes[i]); 1524 + free_extent_buffer(path->nodes[i]); 1533 1525 path->nodes[i] = 0; 1534 1526 } 1535 1527 } ··· 1589 1581 struct btrfs_path *path; 1590 1582 int ret; 1591 1583 int err = 0; 1592 - struct btrfs_block_group_item *bi; 1593 1584 struct btrfs_block_group_cache *cache; 1594 1585 struct btrfs_fs_info *info = root->fs_info; 1595 1586 struct radix_tree_root *radix; 1596 1587 struct btrfs_key key; 1597 1588 struct btrfs_key found_key; 1598 - struct btrfs_leaf *leaf; 1589 + struct extent_buffer *leaf; 1599 1590 u64 group_size_blocks; 1600 1591 u64 used; 1601 1592 ··· 1603 1596 root = info->extent_root; 1604 1597 key.objectid = 0; 1605 1598 key.offset = group_size_blocks; 1606 - key.flags = 0; 1607 1599 btrfs_set_key_type(&key, BTRFS_BLOCK_GROUP_ITEM_KEY); 1608 1600 1609 1601 path = btrfs_alloc_path(); ··· 1616 1610 err = ret; 1617 1611 break; 1618 1612 } 1619 - leaf = btrfs_buffer_leaf(path->nodes[0]); 1620 - btrfs_disk_key_to_cpu(&found_key, 1621 - &leaf->items[path->slots[0]].key); 1613 + leaf = path->nodes[0]; 1614 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 1622 1615 cache = kmalloc(sizeof(*cache), GFP_NOFS); 1623 1616 if (!cache) { 1624 1617 err = -1; 1625 1618 break; 1626 1619 } 1627 1620 1628 - bi = btrfs_item_ptr(leaf, path->slots[0], 1629 - struct btrfs_block_group_item); 1630 - if (bi->flags & BTRFS_BLOCK_GROUP_DATA) { 1621 + read_extent_buffer(leaf, &cache->item, 1622 + btrfs_item_ptr_offset(leaf, path->slots[0]), 1623 + sizeof(cache->item)); 1624 + if (cache->item.flags & BTRFS_BLOCK_GROUP_DATA) { 1631 1625 radix = &info->block_group_data_radix; 1632 1626 cache->data = 1; 1633 1627 } else { ··· 1635 1629 cache->data = 0; 1636 1630 } 1637 1631 1638 - memcpy(&cache->item, bi, sizeof(*bi)); 1639 1632 memcpy(&cache->key, &found_key, sizeof(found_key)); 1640 1633 cache->last_alloc = cache->key.objectid; 1641 1634 cache->first_free = cache->key.objectid; ··· 1645 1640 1646 1641 key.objectid = found_key.objectid + found_key.offset; 1647 1642 btrfs_release_path(root, path); 1643 + 1648 1644 ret = radix_tree_insert(radix, found_key.objectid + 1649 1645 found_key.offset - 1, 1650 1646 (void *)cache); 1651 1647 BUG_ON(ret); 1652 - used = btrfs_block_group_used(bi); 1648 + used = btrfs_block_group_used(&cache->item); 1653 1649 if (used < div_factor(key.offset, 8)) { 1654 1650 radix_tree_tag_set(radix, found_key.objectid + 1655 1651 found_key.offset - 1,
+656 -16
fs/btrfs/extent_map.c
··· 26 26 struct rb_node rb_node; 27 27 }; 28 28 29 - /* bits for the extent state */ 30 - #define EXTENT_DIRTY 1 31 - #define EXTENT_WRITEBACK (1 << 1) 32 - #define EXTENT_UPTODATE (1 << 2) 33 - #define EXTENT_LOCKED (1 << 3) 34 - #define EXTENT_NEW (1 << 4) 35 - #define EXTENT_DELALLOC (1 << 5) 36 - 37 - #define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK) 38 - 39 29 void __init extent_map_init(void) 40 30 { 41 31 extent_map_cache = btrfs_cache_create("extent_map", ··· 213 223 if (rb) 214 224 prev = rb_entry(rb, struct extent_map, rb_node); 215 225 if (prev && prev->end + 1 == em->start && 216 - ((em->block_start == 0 && prev->block_start == 0) || 226 + ((em->block_start == EXTENT_MAP_HOLE && 227 + prev->block_start == EXTENT_MAP_HOLE) || 217 228 (em->block_start == prev->block_end + 1))) { 218 229 em->start = prev->start; 219 230 em->block_start = prev->block_start; ··· 917 926 } 918 927 EXPORT_SYMBOL(set_range_writeback); 919 928 929 + int find_first_extent_bit(struct extent_map_tree *tree, u64 start, 930 + u64 *start_ret, u64 *end_ret, int bits) 931 + { 932 + struct rb_node *node; 933 + struct extent_state *state; 934 + int ret = 1; 935 + 936 + write_lock_irq(&tree->lock); 937 + /* 938 + * this search will find all the extents that end after 939 + * our range starts. 940 + */ 941 + node = tree_search(&tree->state, start); 942 + if (!node || IS_ERR(node)) { 943 + goto out; 944 + } 945 + 946 + while(1) { 947 + state = rb_entry(node, struct extent_state, rb_node); 948 + if (state->state & bits) { 949 + *start_ret = state->start; 950 + *end_ret = state->end; 951 + ret = 0; 952 + } 953 + node = rb_next(node); 954 + if (!node) 955 + break; 956 + } 957 + out: 958 + write_unlock_irq(&tree->lock); 959 + return ret; 960 + } 961 + EXPORT_SYMBOL(find_first_extent_bit); 962 + 920 963 u64 find_lock_delalloc_range(struct extent_map_tree *tree, 921 964 u64 start, u64 lock_start, u64 *end, u64 max_bytes) 922 965 { ··· 1475 1450 em = NULL; 1476 1451 1477 1452 /* we've found a hole, just zero and go on */ 1478 - if (block_start == 0) { 1453 + if (block_start == EXTENT_MAP_HOLE) { 1479 1454 zero_user_page(page, page_offset, iosize, KM_USER0); 1480 1455 set_extent_uptodate(tree, cur, cur + iosize - 1, 1481 1456 GFP_NOFS); ··· 1618 1593 free_extent_map(em); 1619 1594 em = NULL; 1620 1595 1621 - if (block_start == 0 || block_start == EXTENT_MAP_INLINE) { 1596 + if (block_start == EXTENT_MAP_HOLE || 1597 + block_start == EXTENT_MAP_INLINE) { 1622 1598 clear_extent_dirty(tree, cur, 1623 1599 cur + iosize - 1, GFP_NOFS); 1624 1600 cur = cur + iosize; ··· 1656 1630 nr++; 1657 1631 } 1658 1632 done: 1659 - WARN_ON(test_range_bit(tree, start, page_end, EXTENT_DIRTY, 0)); 1660 1633 unlock_extent(tree, start, page_end, GFP_NOFS); 1661 1634 unlock_page(page); 1662 1635 return 0; ··· 1852 1827 1853 1828 // XXX(hch): block 0 is valid in some cases, e.g. XFS RT device 1854 1829 if (em->block_start == EXTENT_MAP_INLINE || 1855 - em->block_start == 0) 1856 - return 0; 1830 + em->block_start == EXTENT_MAP_HOLE) 1831 + return 0; 1857 1832 1858 1833 return (em->block_start + start - em->start) >> inode->i_blkbits; 1859 1834 } 1835 + 1836 + struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree, 1837 + u64 start, unsigned long len, 1838 + gfp_t mask) 1839 + { 1840 + unsigned long num_pages = ((start + len - 1) >> PAGE_CACHE_SHIFT) - 1841 + (start >> PAGE_CACHE_SHIFT) + 1; 1842 + unsigned long i; 1843 + unsigned long index = start >> PAGE_CACHE_SHIFT; 1844 + struct extent_buffer *eb; 1845 + struct page *p; 1846 + struct address_space *mapping = tree->mapping; 1847 + int uptodate = 0; 1848 + 1849 + eb = kzalloc(EXTENT_BUFFER_SIZE(num_pages), mask); 1850 + if (!eb || IS_ERR(eb)) 1851 + return NULL; 1852 + 1853 + eb->start = start; 1854 + eb->len = len; 1855 + atomic_set(&eb->refs, 1); 1856 + 1857 + for (i = 0; i < num_pages; i++, index++) { 1858 + p = find_or_create_page(mapping, index, mask | __GFP_HIGHMEM); 1859 + if (!p) 1860 + goto fail; 1861 + eb->pages[i] = p; 1862 + if (!PageUptodate(p)) 1863 + uptodate = 0; 1864 + unlock_page(p); 1865 + } 1866 + if (uptodate) 1867 + eb->flags |= EXTENT_UPTODATE; 1868 + return eb; 1869 + fail: 1870 + free_extent_buffer(eb); 1871 + return NULL; 1872 + } 1873 + EXPORT_SYMBOL(alloc_extent_buffer); 1874 + 1875 + struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree, 1876 + u64 start, unsigned long len, 1877 + gfp_t mask) 1878 + { 1879 + unsigned long num_pages = ((start + len - 1) >> PAGE_CACHE_SHIFT) - 1880 + (start >> PAGE_CACHE_SHIFT) + 1; 1881 + unsigned long i; 1882 + unsigned long index = start >> PAGE_CACHE_SHIFT; 1883 + struct extent_buffer *eb; 1884 + struct page *p; 1885 + struct address_space *mapping = tree->mapping; 1886 + 1887 + eb = kzalloc(EXTENT_BUFFER_SIZE(num_pages), mask); 1888 + if (!eb || IS_ERR(eb)) 1889 + return NULL; 1890 + 1891 + eb->start = start; 1892 + eb->len = len; 1893 + atomic_set(&eb->refs, 1); 1894 + 1895 + for (i = 0; i < num_pages; i++, index++) { 1896 + p = find_get_page(mapping, index); 1897 + if (!p) 1898 + goto fail; 1899 + eb->pages[i] = p; 1900 + } 1901 + return eb; 1902 + fail: 1903 + free_extent_buffer(eb); 1904 + return NULL; 1905 + } 1906 + EXPORT_SYMBOL(find_extent_buffer); 1907 + 1908 + void free_extent_buffer(struct extent_buffer *eb) 1909 + { 1910 + unsigned long i; 1911 + unsigned long num_pages; 1912 + 1913 + if (!eb) 1914 + return; 1915 + 1916 + if (!atomic_dec_and_test(&eb->refs)) 1917 + return; 1918 + 1919 + num_pages = ((eb->start + eb->len - 1) >> PAGE_CACHE_SHIFT) - 1920 + (eb->start >> PAGE_CACHE_SHIFT) + 1; 1921 + 1922 + for (i = 0; i < num_pages; i++) { 1923 + if (eb->pages[i]) 1924 + page_cache_release(eb->pages[i]); 1925 + } 1926 + kfree(eb); 1927 + } 1928 + EXPORT_SYMBOL(free_extent_buffer); 1929 + 1930 + int clear_extent_buffer_dirty(struct extent_map_tree *tree, 1931 + struct extent_buffer *eb) 1932 + { 1933 + int set; 1934 + unsigned long i; 1935 + unsigned long num_pages; 1936 + struct page *page; 1937 + 1938 + u64 start = eb->start; 1939 + u64 end = start + eb->len - 1; 1940 + 1941 + set = clear_extent_dirty(tree, start, end, GFP_NOFS); 1942 + num_pages = ((eb->start + eb->len - 1) >> PAGE_CACHE_SHIFT) - 1943 + (eb->start >> PAGE_CACHE_SHIFT) + 1; 1944 + 1945 + for (i = 0; i < num_pages; i++) { 1946 + page = eb->pages[i]; 1947 + lock_page(page); 1948 + /* 1949 + * if we're on the last page or the first page and the 1950 + * block isn't aligned on a page boundary, do extra checks 1951 + * to make sure we don't clean page that is partially dirty 1952 + */ 1953 + if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) || 1954 + ((i == num_pages - 1) && 1955 + ((eb->start + eb->len - 1) & (PAGE_CACHE_SIZE - 1)))) { 1956 + start = page->index << PAGE_CACHE_SHIFT; 1957 + end = start + PAGE_CACHE_SIZE - 1; 1958 + if (test_range_bit(tree, start, end, 1959 + EXTENT_DIRTY, 0)) { 1960 + unlock_page(page); 1961 + continue; 1962 + } 1963 + } 1964 + clear_page_dirty_for_io(page); 1965 + unlock_page(page); 1966 + } 1967 + return 0; 1968 + } 1969 + EXPORT_SYMBOL(clear_extent_buffer_dirty); 1970 + 1971 + int wait_on_extent_buffer_writeback(struct extent_map_tree *tree, 1972 + struct extent_buffer *eb) 1973 + { 1974 + return wait_on_extent_writeback(tree, eb->start, 1975 + eb->start + eb->len - 1); 1976 + } 1977 + EXPORT_SYMBOL(wait_on_extent_buffer_writeback); 1978 + 1979 + int set_extent_buffer_dirty(struct extent_map_tree *tree, 1980 + struct extent_buffer *eb) 1981 + { 1982 + return set_range_dirty(tree, eb->start, eb->start + eb->len - 1); 1983 + } 1984 + EXPORT_SYMBOL(set_extent_buffer_dirty); 1985 + 1986 + int set_extent_buffer_uptodate(struct extent_map_tree *tree, 1987 + struct extent_buffer *eb) 1988 + { 1989 + unsigned long i; 1990 + struct page *page; 1991 + unsigned long num_pages; 1992 + 1993 + num_pages = ((eb->start + eb->len - 1) >> PAGE_CACHE_SHIFT) - 1994 + (eb->start >> PAGE_CACHE_SHIFT) + 1; 1995 + 1996 + set_extent_uptodate(tree, eb->start, eb->start + eb->len - 1, 1997 + GFP_NOFS); 1998 + for (i = 0; i < num_pages; i++) { 1999 + page = eb->pages[i]; 2000 + if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) || 2001 + ((i == num_pages - 1) && 2002 + ((eb->start + eb->len - 1) & (PAGE_CACHE_SIZE - 1)))) { 2003 + check_page_uptodate(tree, page); 2004 + continue; 2005 + } 2006 + SetPageUptodate(page); 2007 + } 2008 + return 0; 2009 + } 2010 + EXPORT_SYMBOL(set_extent_buffer_uptodate); 2011 + 2012 + int extent_buffer_uptodate(struct extent_map_tree *tree, 2013 + struct extent_buffer *eb) 2014 + { 2015 + if (eb->flags & EXTENT_UPTODATE) 2016 + return 1; 2017 + return test_range_bit(tree, eb->start, eb->start + eb->len - 1, 2018 + EXTENT_UPTODATE, 1); 2019 + } 2020 + EXPORT_SYMBOL(extent_buffer_uptodate); 2021 + 2022 + int read_extent_buffer_pages(struct extent_map_tree *tree, 2023 + struct extent_buffer *eb, int wait) 2024 + { 2025 + unsigned long i; 2026 + struct page *page; 2027 + int err; 2028 + int ret = 0; 2029 + unsigned long num_pages; 2030 + 2031 + if (eb->flags & EXTENT_UPTODATE) 2032 + return 0; 2033 + 2034 + if (test_range_bit(tree, eb->start, eb->start + eb->len - 1, 2035 + EXTENT_UPTODATE, 1)) { 2036 + return 0; 2037 + } 2038 + 2039 + num_pages = ((eb->start + eb->len - 1) >> PAGE_CACHE_SHIFT) - 2040 + (eb->start >> PAGE_CACHE_SHIFT) + 1; 2041 + for (i = 0; i < num_pages; i++) { 2042 + page = eb->pages[i]; 2043 + if (PageUptodate(page)) { 2044 + continue; 2045 + } 2046 + if (!wait) { 2047 + if (TestSetPageLocked(page)) { 2048 + continue; 2049 + } 2050 + } else { 2051 + lock_page(page); 2052 + } 2053 + if (!PageUptodate(page)) { 2054 + err = page->mapping->a_ops->readpage(NULL, page); 2055 + if (err) { 2056 + ret = err; 2057 + } 2058 + } else { 2059 + unlock_page(page); 2060 + } 2061 + } 2062 + 2063 + if (ret || !wait) { 2064 + return ret; 2065 + } 2066 + 2067 + for (i = 0; i < num_pages; i++) { 2068 + page = eb->pages[i]; 2069 + wait_on_page_locked(page); 2070 + if (!PageUptodate(page)) { 2071 + ret = -EIO; 2072 + } 2073 + } 2074 + eb->flags |= EXTENT_UPTODATE; 2075 + return ret; 2076 + } 2077 + EXPORT_SYMBOL(read_extent_buffer_pages); 2078 + 2079 + void read_extent_buffer(struct extent_buffer *eb, void *dstv, 2080 + unsigned long start, 2081 + unsigned long len) 2082 + { 2083 + size_t cur; 2084 + size_t offset; 2085 + struct page *page; 2086 + char *kaddr; 2087 + char *dst = (char *)dstv; 2088 + size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1); 2089 + unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT; 2090 + 2091 + WARN_ON(start > eb->len); 2092 + WARN_ON(start + len > eb->start + eb->len); 2093 + 2094 + page = eb->pages[i]; 2095 + offset = start & ((unsigned long)PAGE_CACHE_SIZE - 1); 2096 + if (i == 0) 2097 + offset += start_offset; 2098 + 2099 + while(len > 0) { 2100 + WARN_ON(!PageUptodate(page)); 2101 + 2102 + cur = min(len, (PAGE_CACHE_SIZE - offset)); 2103 + // kaddr = kmap_atomic(page, KM_USER0); 2104 + kaddr = page_address(page); 2105 + memcpy(dst, kaddr + offset, cur); 2106 + // kunmap_atomic(kaddr, KM_USER0); 2107 + 2108 + dst += cur; 2109 + len -= cur; 2110 + offset = 0; 2111 + i++; 2112 + page = eb->pages[i]; 2113 + } 2114 + } 2115 + EXPORT_SYMBOL(read_extent_buffer); 2116 + 2117 + int map_extent_buffer(struct extent_buffer *eb, unsigned long start, 2118 + char **token, char **map, 2119 + unsigned long *map_start, 2120 + unsigned long *map_len, int km) 2121 + { 2122 + size_t offset; 2123 + char *kaddr; 2124 + size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1); 2125 + unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT; 2126 + 2127 + WARN_ON(start > eb->len); 2128 + 2129 + if (i == 0) { 2130 + offset = start_offset; 2131 + *map_start = 0; 2132 + } else { 2133 + offset = 0; 2134 + *map_start = (i << PAGE_CACHE_SHIFT) - offset; 2135 + } 2136 + 2137 + // kaddr = kmap_atomic(eb->pages[i], km); 2138 + kaddr = page_address(eb->pages[i]); 2139 + *token = kaddr; 2140 + *map = kaddr + offset; 2141 + *map_len = PAGE_CACHE_SIZE - offset; 2142 + return 0; 2143 + } 2144 + EXPORT_SYMBOL(map_extent_buffer); 2145 + 2146 + void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km) 2147 + { 2148 + // kunmap_atomic(token, km); 2149 + } 2150 + EXPORT_SYMBOL(unmap_extent_buffer); 2151 + 2152 + int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv, 2153 + unsigned long start, 2154 + unsigned long len) 2155 + { 2156 + size_t cur; 2157 + size_t offset; 2158 + struct page *page; 2159 + char *kaddr; 2160 + char *ptr = (char *)ptrv; 2161 + size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1); 2162 + unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT; 2163 + int ret = 0; 2164 + 2165 + WARN_ON(start > eb->len); 2166 + WARN_ON(start + len > eb->start + eb->len); 2167 + 2168 + page = eb->pages[i]; 2169 + offset = start & ((unsigned long)PAGE_CACHE_SIZE - 1); 2170 + if (i == 0) 2171 + offset += start_offset; 2172 + 2173 + while(len > 0) { 2174 + WARN_ON(!PageUptodate(page)); 2175 + 2176 + cur = min(len, (PAGE_CACHE_SIZE - offset)); 2177 + 2178 + // kaddr = kmap_atomic(page, KM_USER0); 2179 + kaddr = page_address(page); 2180 + ret = memcmp(ptr, kaddr + offset, cur); 2181 + // kunmap_atomic(kaddr, KM_USER0); 2182 + if (ret) 2183 + break; 2184 + 2185 + ptr += cur; 2186 + len -= cur; 2187 + offset = 0; 2188 + i++; 2189 + page = eb->pages[i]; 2190 + } 2191 + return ret; 2192 + } 2193 + EXPORT_SYMBOL(memcmp_extent_buffer); 2194 + 2195 + void write_extent_buffer(struct extent_buffer *eb, const void *srcv, 2196 + unsigned long start, unsigned long len) 2197 + { 2198 + size_t cur; 2199 + size_t offset; 2200 + struct page *page; 2201 + char *kaddr; 2202 + char *src = (char *)srcv; 2203 + size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1); 2204 + unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT; 2205 + 2206 + WARN_ON(start > eb->len); 2207 + WARN_ON(start + len > eb->start + eb->len); 2208 + 2209 + page = eb->pages[i]; 2210 + offset = start & ((unsigned long)PAGE_CACHE_SIZE - 1); 2211 + if (i == 0) 2212 + offset += start_offset; 2213 + 2214 + while(len > 0) { 2215 + WARN_ON(!PageUptodate(page)); 2216 + 2217 + cur = min(len, PAGE_CACHE_SIZE - offset); 2218 + // kaddr = kmap_atomic(page, KM_USER0); 2219 + kaddr = page_address(page); 2220 + memcpy(kaddr + offset, src, cur); 2221 + // kunmap_atomic(kaddr, KM_USER0); 2222 + 2223 + src += cur; 2224 + len -= cur; 2225 + offset = 0; 2226 + i++; 2227 + page = eb->pages[i]; 2228 + } 2229 + } 2230 + EXPORT_SYMBOL(write_extent_buffer); 2231 + 2232 + void memset_extent_buffer(struct extent_buffer *eb, char c, 2233 + unsigned long start, unsigned long len) 2234 + { 2235 + size_t cur; 2236 + size_t offset; 2237 + struct page *page; 2238 + char *kaddr; 2239 + size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1); 2240 + unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT; 2241 + 2242 + WARN_ON(start > eb->len); 2243 + WARN_ON(start + len > eb->start + eb->len); 2244 + 2245 + page = eb->pages[i]; 2246 + offset = start & ((unsigned long)PAGE_CACHE_SIZE - 1); 2247 + if (i == 0) 2248 + offset += start_offset; 2249 + 2250 + while(len > 0) { 2251 + WARN_ON(!PageUptodate(page)); 2252 + 2253 + cur = min(len, PAGE_CACHE_SIZE - offset); 2254 + // kaddr = kmap_atomic(page, KM_USER0); 2255 + kaddr = page_address(page); 2256 + memset(kaddr + offset, c, cur); 2257 + // kunmap_atomic(kaddr, KM_USER0); 2258 + 2259 + len -= cur; 2260 + offset = 0; 2261 + i++; 2262 + page = eb->pages[i]; 2263 + } 2264 + } 2265 + EXPORT_SYMBOL(memset_extent_buffer); 2266 + 2267 + void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src, 2268 + unsigned long dst_offset, unsigned long src_offset, 2269 + unsigned long len) 2270 + { 2271 + u64 dst_len = dst->len; 2272 + size_t cur; 2273 + size_t offset; 2274 + struct page *page; 2275 + char *kaddr; 2276 + size_t start_offset = dst->start & ((u64)PAGE_CACHE_SIZE - 1); 2277 + unsigned long i = (start_offset + dst_offset) >> PAGE_CACHE_SHIFT; 2278 + 2279 + WARN_ON(src->len != dst_len); 2280 + 2281 + offset = dst_offset & ((unsigned long)PAGE_CACHE_SIZE - 1); 2282 + if (i == 0) 2283 + offset += start_offset; 2284 + 2285 + while(len > 0) { 2286 + page = dst->pages[i]; 2287 + WARN_ON(!PageUptodate(page)); 2288 + 2289 + cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - offset)); 2290 + 2291 + // kaddr = kmap_atomic(page, KM_USER1); 2292 + kaddr = page_address(page); 2293 + read_extent_buffer(src, kaddr + offset, src_offset, cur); 2294 + // kunmap_atomic(kaddr, KM_USER1); 2295 + 2296 + src_offset += cur; 2297 + len -= cur; 2298 + offset = 0; 2299 + i++; 2300 + } 2301 + } 2302 + EXPORT_SYMBOL(copy_extent_buffer); 2303 + 2304 + static void move_pages(struct page *dst_page, struct page *src_page, 2305 + unsigned long dst_off, unsigned long src_off, 2306 + unsigned long len) 2307 + { 2308 + // char *dst_kaddr = kmap_atomic(dst_page, KM_USER0); 2309 + char *dst_kaddr = page_address(dst_page); 2310 + if (dst_page == src_page) { 2311 + memmove(dst_kaddr + dst_off, dst_kaddr + src_off, len); 2312 + } else { 2313 + // char *src_kaddr = kmap_atomic(src_page, KM_USER1); 2314 + char *src_kaddr = page_address(src_page); 2315 + char *p = dst_kaddr + dst_off + len; 2316 + char *s = src_kaddr + src_off + len; 2317 + 2318 + while (len--) 2319 + *--p = *--s; 2320 + 2321 + // kunmap_atomic(src_kaddr, KM_USER1); 2322 + } 2323 + // kunmap_atomic(dst_kaddr, KM_USER0); 2324 + } 2325 + 2326 + static void copy_pages(struct page *dst_page, struct page *src_page, 2327 + unsigned long dst_off, unsigned long src_off, 2328 + unsigned long len) 2329 + { 2330 + //kmap_atomic(dst_page, KM_USER0); 2331 + char *dst_kaddr = page_address(dst_page); 2332 + char *src_kaddr; 2333 + 2334 + if (dst_page != src_page) 2335 + src_kaddr = page_address(src_page); // kmap_atomic(src_page, KM_USER1); 2336 + else 2337 + src_kaddr = dst_kaddr; 2338 + 2339 + memcpy(dst_kaddr + dst_off, src_kaddr + src_off, len); 2340 + /* 2341 + kunmap_atomic(dst_kaddr, KM_USER0); 2342 + if (dst_page != src_page) 2343 + kunmap_atomic(src_kaddr, KM_USER1); 2344 + */ 2345 + } 2346 + 2347 + void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, 2348 + unsigned long src_offset, unsigned long len) 2349 + { 2350 + size_t cur; 2351 + size_t dst_off_in_page; 2352 + size_t src_off_in_page; 2353 + size_t start_offset = dst->start & ((u64)PAGE_CACHE_SIZE - 1); 2354 + unsigned long dst_i; 2355 + unsigned long src_i; 2356 + 2357 + if (src_offset + len > dst->len) { 2358 + printk("memmove bogus src_offset %lu move len %lu len %lu\n", 2359 + src_offset, len, dst->len); 2360 + BUG_ON(1); 2361 + } 2362 + if (dst_offset + len > dst->len) { 2363 + printk("memmove bogus dst_offset %lu move len %lu len %lu\n", 2364 + dst_offset, len, dst->len); 2365 + BUG_ON(1); 2366 + } 2367 + 2368 + while(len > 0) { 2369 + dst_off_in_page = dst_offset & 2370 + ((unsigned long)PAGE_CACHE_SIZE - 1); 2371 + src_off_in_page = src_offset & 2372 + ((unsigned long)PAGE_CACHE_SIZE - 1); 2373 + 2374 + dst_i = (start_offset + dst_offset) >> PAGE_CACHE_SHIFT; 2375 + src_i = (start_offset + src_offset) >> PAGE_CACHE_SHIFT; 2376 + 2377 + if (src_i == 0) 2378 + src_off_in_page += start_offset; 2379 + if (dst_i == 0) 2380 + dst_off_in_page += start_offset; 2381 + 2382 + cur = min(len, (unsigned long)(PAGE_CACHE_SIZE - 2383 + src_off_in_page)); 2384 + cur = min(cur, (unsigned long)(PAGE_CACHE_SIZE - 2385 + dst_off_in_page)); 2386 + 2387 + copy_pages(dst->pages[dst_i], dst->pages[src_i], 2388 + dst_off_in_page, src_off_in_page, cur); 2389 + 2390 + src_offset += cur; 2391 + dst_offset += cur; 2392 + len -= cur; 2393 + } 2394 + } 2395 + EXPORT_SYMBOL(memcpy_extent_buffer); 2396 + 2397 + void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, 2398 + unsigned long src_offset, unsigned long len) 2399 + { 2400 + size_t cur; 2401 + size_t dst_off_in_page; 2402 + size_t src_off_in_page; 2403 + unsigned long dst_end = dst_offset + len - 1; 2404 + unsigned long src_end = src_offset + len - 1; 2405 + size_t start_offset = dst->start & ((u64)PAGE_CACHE_SIZE - 1); 2406 + unsigned long dst_i; 2407 + unsigned long src_i; 2408 + 2409 + if (src_offset + len > dst->len) { 2410 + printk("memmove bogus src_offset %lu move len %lu len %lu\n", 2411 + src_offset, len, dst->len); 2412 + BUG_ON(1); 2413 + } 2414 + if (dst_offset + len > dst->len) { 2415 + printk("memmove bogus dst_offset %lu move len %lu len %lu\n", 2416 + dst_offset, len, dst->len); 2417 + BUG_ON(1); 2418 + } 2419 + if (dst_offset < src_offset) { 2420 + memcpy_extent_buffer(dst, dst_offset, src_offset, len); 2421 + return; 2422 + } 2423 + while(len > 0) { 2424 + dst_i = (start_offset + dst_end) >> PAGE_CACHE_SHIFT; 2425 + src_i = (start_offset + src_end) >> PAGE_CACHE_SHIFT; 2426 + 2427 + dst_off_in_page = dst_end & 2428 + ((unsigned long)PAGE_CACHE_SIZE - 1); 2429 + src_off_in_page = src_end & 2430 + ((unsigned long)PAGE_CACHE_SIZE - 1); 2431 + 2432 + if (src_i == 0) 2433 + src_off_in_page += start_offset; 2434 + if (dst_i == 0) 2435 + dst_off_in_page += start_offset; 2436 + 2437 + cur = min(len, src_off_in_page + 1); 2438 + cur = min(cur, dst_off_in_page + 1); 2439 + // printk("move pages orig dst %lu src %lu len %lu, this %lu %lu %lu\n", dst_offset, src_offset, len, dst_off_in_page - cur + 1, src_off_in_page - cur + 1, cur); 2440 + move_pages(dst->pages[dst_i], dst->pages[src_i], 2441 + dst_off_in_page - cur + 1, 2442 + src_off_in_page - cur + 1, cur); 2443 + 2444 + dst_end -= cur - 1; 2445 + src_end -= cur - 1; 2446 + len -= cur; 2447 + } 2448 + } 2449 + EXPORT_SYMBOL(memmove_extent_buffer);
+73 -2
fs/btrfs/extent_map.h
··· 3 3 4 4 #include <linux/rbtree.h> 5 5 6 + #define EXTENT_MAP_HOLE (u64)-3 6 7 #define EXTENT_MAP_INLINE (u64)-2 7 8 #define EXTENT_MAP_DELALLOC (u64)-1 9 + 10 + /* bits for the extent state */ 11 + #define EXTENT_DIRTY 1 12 + #define EXTENT_WRITEBACK (1 << 1) 13 + #define EXTENT_UPTODATE (1 << 2) 14 + #define EXTENT_LOCKED (1 << 3) 15 + #define EXTENT_NEW (1 << 4) 16 + #define EXTENT_DELALLOC (1 << 5) 17 + #define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK) 18 + 8 19 9 20 struct extent_map_ops { 10 21 int (*fill_delalloc)(struct inode *inode, u64 start, u64 end); ··· 62 51 struct list_head list; 63 52 }; 64 53 54 + #define EXTENT_BUFFER_SIZE(nr) (sizeof(struct extent_buffer) + \ 55 + (nr - 1) * sizeof(struct page *)) 65 56 struct extent_buffer { 66 57 u64 start; 67 - u64 end; /* inclusive */ 68 - char *addr; 58 + unsigned long len; 59 + atomic_t refs; 60 + int flags; 69 61 struct page *pages[]; 70 62 }; 71 63 ··· 101 87 gfp_t mask); 102 88 int set_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end, 103 89 gfp_t mask); 90 + int clear_extent_dirty(struct extent_map_tree *tree, u64 start, u64 end, 91 + gfp_t mask); 104 92 int set_extent_delalloc(struct extent_map_tree *tree, u64 start, u64 end, 105 93 gfp_t mask); 94 + int find_first_extent_bit(struct extent_map_tree *tree, u64 start, 95 + u64 *start_ret, u64 *end_ret, int bits); 106 96 int extent_invalidatepage(struct extent_map_tree *tree, 107 97 struct page *page, unsigned long offset); 108 98 int extent_write_full_page(struct extent_map_tree *tree, struct page *page, ··· 124 106 int set_state_private(struct extent_map_tree *tree, u64 start, u64 private); 125 107 int get_state_private(struct extent_map_tree *tree, u64 start, u64 *private); 126 108 void set_page_extent_mapped(struct page *page); 109 + 110 + struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree, 111 + u64 start, unsigned long len, 112 + gfp_t mask); 113 + struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree, 114 + u64 start, unsigned long len, 115 + gfp_t mask); 116 + void free_extent_buffer(struct extent_buffer *eb); 117 + int read_extent_buffer_pages(struct extent_map_tree *tree, 118 + struct extent_buffer *eb, int wait); 119 + 120 + static inline void extent_buffer_get(struct extent_buffer *eb) 121 + { 122 + atomic_inc(&eb->refs); 123 + } 124 + 125 + static inline u64 extent_buffer_blocknr(struct extent_buffer *eb) 126 + { 127 + return eb->start / 4096; 128 + } 129 + 130 + int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv, 131 + unsigned long start, 132 + unsigned long len); 133 + void read_extent_buffer(struct extent_buffer *eb, void *dst, 134 + unsigned long start, 135 + unsigned long len); 136 + void write_extent_buffer(struct extent_buffer *eb, const void *src, 137 + unsigned long start, unsigned long len); 138 + void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src, 139 + unsigned long dst_offset, unsigned long src_offset, 140 + unsigned long len); 141 + void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, 142 + unsigned long src_offset, unsigned long len); 143 + void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, 144 + unsigned long src_offset, unsigned long len); 145 + void memset_extent_buffer(struct extent_buffer *eb, char c, 146 + unsigned long start, unsigned long len); 147 + int wait_on_extent_buffer_writeback(struct extent_map_tree *tree, 148 + struct extent_buffer *eb); 149 + int clear_extent_buffer_dirty(struct extent_map_tree *tree, 150 + struct extent_buffer *eb); 151 + int set_extent_buffer_dirty(struct extent_map_tree *tree, 152 + struct extent_buffer *eb); 153 + int set_extent_buffer_uptodate(struct extent_map_tree *tree, 154 + struct extent_buffer *eb); 155 + int extent_buffer_uptodate(struct extent_map_tree *tree, 156 + struct extent_buffer *eb); 157 + int map_extent_buffer(struct extent_buffer *eb, unsigned long offset, 158 + char **token, char **map, 159 + unsigned long *map_start, 160 + unsigned long *map_len, int km); 161 + void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km); 127 162 #endif
+31 -32
fs/btrfs/file-item.c
··· 34 34 struct btrfs_file_extent_item *item; 35 35 struct btrfs_key file_key; 36 36 struct btrfs_path *path; 37 + struct extent_buffer *leaf; 37 38 38 39 path = btrfs_alloc_path(); 39 40 BUG_ON(!path); 40 41 file_key.objectid = objectid; 41 42 file_key.offset = pos; 42 - file_key.flags = 0; 43 43 btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); 44 44 45 45 ret = btrfs_insert_empty_item(trans, root, path, &file_key, ··· 47 47 if (ret < 0) 48 48 goto out; 49 49 BUG_ON(ret); 50 - item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 50 + leaf = path->nodes[0]; 51 + item = btrfs_item_ptr(leaf, path->slots[0], 51 52 struct btrfs_file_extent_item); 52 - btrfs_set_file_extent_disk_blocknr(item, offset); 53 - btrfs_set_file_extent_disk_num_blocks(item, disk_num_blocks); 54 - btrfs_set_file_extent_offset(item, 0); 55 - btrfs_set_file_extent_num_blocks(item, num_blocks); 56 - btrfs_set_file_extent_generation(item, trans->transid); 57 - btrfs_set_file_extent_type(item, BTRFS_FILE_EXTENT_REG); 58 - btrfs_mark_buffer_dirty(path->nodes[0]); 53 + btrfs_set_file_extent_disk_blocknr(leaf, item, offset); 54 + btrfs_set_file_extent_disk_num_blocks(leaf, item, disk_num_blocks); 55 + btrfs_set_file_extent_offset(leaf, item, 0); 56 + btrfs_set_file_extent_num_blocks(leaf, item, num_blocks); 57 + btrfs_set_file_extent_generation(leaf, item, trans->transid); 58 + btrfs_set_file_extent_type(leaf, item, BTRFS_FILE_EXTENT_REG); 59 + btrfs_mark_buffer_dirty(leaf); 59 60 out: 60 61 btrfs_free_path(path); 61 62 return ret; ··· 72 71 struct btrfs_key file_key; 73 72 struct btrfs_key found_key; 74 73 struct btrfs_csum_item *item; 75 - struct btrfs_leaf *leaf; 74 + struct extent_buffer *leaf; 76 75 u64 csum_offset = 0; 77 76 int csums_in_item; 78 77 79 78 file_key.objectid = objectid; 80 79 file_key.offset = offset; 81 - file_key.flags = 0; 82 80 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); 83 81 ret = btrfs_search_slot(trans, root, &file_key, path, 0, cow); 84 82 if (ret < 0) 85 83 goto fail; 86 - leaf = btrfs_buffer_leaf(path->nodes[0]); 84 + leaf = path->nodes[0]; 87 85 if (ret > 0) { 88 86 ret = 1; 89 87 if (path->slots[0] == 0) 90 88 goto fail; 91 89 path->slots[0]--; 92 - btrfs_disk_key_to_cpu(&found_key, 93 - &leaf->items[path->slots[0]].key); 90 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 94 91 if (btrfs_key_type(&found_key) != BTRFS_CSUM_ITEM_KEY || 95 92 found_key.objectid != objectid) { 96 93 goto fail; 97 94 } 98 95 csum_offset = (offset - found_key.offset) >> 99 96 root->fs_info->sb->s_blocksize_bits; 100 - csums_in_item = btrfs_item_size(leaf->items + path->slots[0]); 97 + csums_in_item = btrfs_item_size_nr(leaf, path->slots[0]); 101 98 csums_in_item /= BTRFS_CRC32_SIZE; 102 99 103 100 if (csum_offset >= csums_in_item) { ··· 126 127 127 128 file_key.objectid = objectid; 128 129 file_key.offset = offset; 129 - file_key.flags = 0; 130 130 btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); 131 131 ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow); 132 132 return ret; ··· 136 138 u64 objectid, u64 offset, 137 139 char *data, size_t len) 138 140 { 141 + return 0; 142 + #if 0 139 143 int ret; 140 144 struct btrfs_key file_key; 141 145 struct btrfs_key found_key; 142 146 struct btrfs_path *path; 143 147 struct btrfs_csum_item *item; 144 - struct btrfs_leaf *leaf; 148 + struct extent_buffer *leaf; 145 149 u64 csum_offset; 146 150 147 151 path = btrfs_alloc_path(); ··· 161 161 if (ret == -EFBIG) { 162 162 u32 item_size; 163 163 /* we found one, but it isn't big enough yet */ 164 - leaf = btrfs_buffer_leaf(path->nodes[0]); 165 - item_size = btrfs_item_size(leaf->items + path->slots[0]); 164 + leaf = path->nodes[0]; 165 + item_size = btrfs_item_size_nr(leaf, path->slots[0]); 166 166 if ((item_size / BTRFS_CRC32_SIZE) >= MAX_CSUM_ITEMS(root)) { 167 167 /* already at max size, make a new one */ 168 168 goto insert; ··· 188 188 goto insert; 189 189 } 190 190 path->slots[0]--; 191 - leaf = btrfs_buffer_leaf(path->nodes[0]); 192 - btrfs_disk_key_to_cpu(&found_key, &leaf->items[path->slots[0]].key); 191 + leaf = path->nodes[0]; 192 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 193 193 csum_offset = (offset - found_key.offset) >> 194 194 root->fs_info->sb->s_blocksize_bits; 195 195 if (btrfs_key_type(&found_key) != BTRFS_CSUM_ITEM_KEY || ··· 197 197 csum_offset >= MAX_CSUM_ITEMS(root)) { 198 198 goto insert; 199 199 } 200 - if (csum_offset >= btrfs_item_size(leaf->items + path->slots[0]) / 200 + if (csum_offset >= btrfs_item_size_nr(leaf, path->slots[0]) / 201 201 BTRFS_CRC32_SIZE) { 202 202 u32 diff = (csum_offset + 1) * BTRFS_CRC32_SIZE; 203 - diff = diff - btrfs_item_size(leaf->items + path->slots[0]); 203 + diff = diff - btrfs_item_size_nr(leaf, path->slots[0]); 204 204 if (diff != BTRFS_CRC32_SIZE) 205 205 goto insert; 206 206 ret = btrfs_extend_item(trans, root, path, diff); ··· 220 220 goto fail; 221 221 } 222 222 csum: 223 - item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 224 - struct btrfs_csum_item); 223 + leaf = path->nodes[0]; 224 + item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item); 225 225 ret = 0; 226 226 item = (struct btrfs_csum_item *)((unsigned char *)item + 227 227 csum_offset * BTRFS_CRC32_SIZE); 228 228 found: 229 - btrfs_check_bounds(&item->csum, BTRFS_CRC32_SIZE, 230 - path->nodes[0]->b_data, 231 - root->fs_info->sb->s_blocksize); 229 + /* FIXME!!!!!!!!!!!! */ 232 230 ret = btrfs_csum_data(root, data, len, &item->csum); 233 231 btrfs_mark_buffer_dirty(path->nodes[0]); 234 232 fail: 235 233 btrfs_release_path(root, path); 236 234 btrfs_free_path(path); 237 235 return ret; 236 + #endif 238 237 } 239 238 240 239 int btrfs_csum_truncate(struct btrfs_trans_handle *trans, ··· 241 242 u64 isize) 242 243 { 243 244 struct btrfs_key key; 244 - struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[0]); 245 + struct extent_buffer *leaf = path->nodes[0]; 245 246 int slot = path->slots[0]; 246 247 int ret; 247 248 u32 new_item_size; 248 249 u64 new_item_span; 249 250 u64 blocks; 250 251 251 - btrfs_disk_key_to_cpu(&key, &leaf->items[slot].key); 252 + btrfs_item_key_to_cpu(leaf, &key, slot); 252 253 if (isize <= key.offset) 253 254 return 0; 254 255 new_item_span = isize - key.offset; 255 - blocks = (new_item_span + root->blocksize - 1) >> 256 + blocks = (new_item_span + root->sectorsize - 1) >> 256 257 root->fs_info->sb->s_blocksize_bits; 257 258 new_item_size = blocks * BTRFS_CRC32_SIZE; 258 - if (new_item_size >= btrfs_item_size(leaf->items + slot)) 259 + if (new_item_size >= btrfs_item_size_nr(leaf, slot)) 259 260 return 0; 260 261 ret = btrfs_truncate_item(trans, root, path, new_item_size); 261 262 BUG_ON(ret);
+66 -61
fs/btrfs/file.c
··· 16 16 * Boston, MA 021110-1307, USA. 17 17 */ 18 18 19 - #include <linux/buffer_head.h> 20 19 #include <linux/fs.h> 21 20 #include <linux/pagemap.h> 22 21 #include <linux/highmem.h> ··· 87 88 { 88 89 struct btrfs_key key; 89 90 struct btrfs_path *path; 90 - char *ptr, *kaddr; 91 + struct extent_buffer *leaf; 92 + char *kaddr; 93 + unsigned long ptr; 91 94 struct btrfs_file_extent_item *ei; 92 95 u32 datasize; 93 96 int err = 0; ··· 103 102 104 103 key.objectid = inode->i_ino; 105 104 key.offset = offset; 106 - key.flags = 0; 107 105 btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); 108 106 BUG_ON(size >= PAGE_CACHE_SIZE); 109 107 datasize = btrfs_file_extent_calc_inline_size(size); ··· 113 113 err = ret; 114 114 goto fail; 115 115 } 116 - ei = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 117 - path->slots[0], struct btrfs_file_extent_item); 118 - btrfs_set_file_extent_generation(ei, trans->transid); 119 - btrfs_set_file_extent_type(ei, 120 - BTRFS_FILE_EXTENT_INLINE); 116 + leaf = path->nodes[0]; 117 + ei = btrfs_item_ptr(leaf, path->slots[0], 118 + struct btrfs_file_extent_item); 119 + btrfs_set_file_extent_generation(leaf, ei, trans->transid); 120 + btrfs_set_file_extent_type(leaf, ei, BTRFS_FILE_EXTENT_INLINE); 121 121 ptr = btrfs_file_extent_inline_start(ei); 122 122 123 123 kaddr = kmap_atomic(page, KM_USER0); 124 - btrfs_memcpy(root, path->nodes[0]->b_data, 125 - ptr, kaddr + page_offset, size); 124 + write_extent_buffer(leaf, kaddr + page_offset, ptr, size); 126 125 kunmap_atomic(kaddr, KM_USER0); 127 - btrfs_mark_buffer_dirty(path->nodes[0]); 126 + btrfs_mark_buffer_dirty(leaf); 128 127 fail: 129 128 btrfs_free_path(path); 130 129 return err; ··· 155 156 156 157 em->bdev = inode->i_sb->s_bdev; 157 158 158 - start_pos = pos & ~((u64)root->blocksize - 1); 159 - num_blocks = (write_bytes + pos - start_pos + root->blocksize - 1) >> 159 + start_pos = pos & ~((u64)root->sectorsize - 1); 160 + num_blocks = (write_bytes + pos - start_pos + root->sectorsize - 1) >> 160 161 inode->i_blkbits; 161 162 162 163 down_read(&BTRFS_I(inode)->root->snap_sem); ··· 183 184 if (inode->i_size < start_pos) { 184 185 u64 last_pos_in_file; 185 186 u64 hole_size; 186 - u64 mask = root->blocksize - 1; 187 + u64 mask = root->sectorsize - 1; 187 188 last_pos_in_file = (isize + mask) & ~mask; 188 189 hole_size = (start_pos - last_pos_in_file + mask) & ~mask; 189 190 ··· 226 227 /* step one, delete the existing extents in this range */ 227 228 /* FIXME blocksize != pagesize */ 228 229 err = btrfs_drop_extents(trans, root, inode, start_pos, 229 - (pos + write_bytes + root->blocksize -1) & 230 - ~((u64)root->blocksize - 1), &hint_block); 230 + (pos + write_bytes + root->sectorsize -1) & 231 + ~((u64)root->sectorsize - 1), &hint_block); 231 232 if (err) 232 233 goto failed; 233 234 ··· 287 288 { 288 289 int ret; 289 290 struct btrfs_key key; 290 - struct btrfs_leaf *leaf; 291 + struct extent_buffer *leaf; 291 292 int slot; 292 293 struct btrfs_file_extent_item *extent; 293 294 u64 extent_end = 0; ··· 326 327 found_extent = 0; 327 328 found_inline = 0; 328 329 extent = NULL; 329 - leaf = btrfs_buffer_leaf(path->nodes[0]); 330 + leaf = path->nodes[0]; 330 331 slot = path->slots[0]; 331 332 ret = 0; 332 - btrfs_disk_key_to_cpu(&key, &leaf->items[slot].key); 333 + btrfs_item_key_to_cpu(leaf, &key, slot); 333 334 if (key.offset >= end || key.objectid != inode->i_ino) { 334 335 goto out; 335 336 } ··· 343 344 if (btrfs_key_type(&key) == BTRFS_EXTENT_DATA_KEY) { 344 345 extent = btrfs_item_ptr(leaf, slot, 345 346 struct btrfs_file_extent_item); 346 - found_type = btrfs_file_extent_type(extent); 347 + found_type = btrfs_file_extent_type(leaf, extent); 347 348 if (found_type == BTRFS_FILE_EXTENT_REG) { 348 349 extent_end = key.offset + 349 - (btrfs_file_extent_num_blocks(extent) << 350 + (btrfs_file_extent_num_blocks(leaf, extent) << 350 351 inode->i_blkbits); 351 352 found_extent = 1; 352 353 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { 354 + struct btrfs_item *item; 355 + item = btrfs_item_nr(leaf, slot); 353 356 found_inline = 1; 354 357 extent_end = key.offset + 355 - btrfs_file_extent_inline_len(leaf->items + 356 - slot); 358 + btrfs_file_extent_inline_len(leaf, item); 357 359 } 358 360 } else { 359 361 extent_end = search_start; ··· 365 365 search_start >= extent_end) { 366 366 int nextret; 367 367 u32 nritems; 368 - nritems = btrfs_header_nritems( 369 - btrfs_buffer_header(path->nodes[0])); 368 + nritems = btrfs_header_nritems(leaf); 370 369 if (slot >= nritems - 1) { 371 370 nextret = btrfs_next_leaf(root, path); 372 371 if (nextret) ··· 379 380 380 381 /* FIXME, there's only one inline extent allowed right now */ 381 382 if (found_inline) { 382 - u64 mask = root->blocksize - 1; 383 + u64 mask = root->sectorsize - 1; 383 384 search_start = (extent_end + mask) & ~mask; 384 385 } else 385 386 search_start = extent_end; ··· 387 388 if (end < extent_end && end >= key.offset) { 388 389 if (found_extent) { 389 390 u64 disk_blocknr = 390 - btrfs_file_extent_disk_blocknr(extent); 391 + btrfs_file_extent_disk_blocknr(leaf,extent); 391 392 u64 disk_num_blocks = 392 - btrfs_file_extent_disk_num_blocks(extent); 393 - memcpy(&old, extent, sizeof(old)); 393 + btrfs_file_extent_disk_num_blocks(leaf, 394 + extent); 395 + read_extent_buffer(leaf, &old, 396 + (unsigned long)extent, 397 + sizeof(old)); 394 398 if (disk_blocknr != 0) { 395 399 ret = btrfs_inc_extent_ref(trans, root, 396 400 disk_blocknr, disk_num_blocks); ··· 408 406 u64 new_num; 409 407 u64 old_num; 410 408 keep = 1; 411 - WARN_ON(start & (root->blocksize - 1)); 409 + WARN_ON(start & (root->sectorsize - 1)); 412 410 if (found_extent) { 413 411 new_num = (start - key.offset) >> 414 412 inode->i_blkbits; 415 - old_num = btrfs_file_extent_num_blocks(extent); 413 + old_num = btrfs_file_extent_num_blocks(leaf, 414 + extent); 416 415 *hint_block = 417 - btrfs_file_extent_disk_blocknr(extent); 418 - if (btrfs_file_extent_disk_blocknr(extent)) { 416 + btrfs_file_extent_disk_blocknr(leaf, 417 + extent); 418 + if (btrfs_file_extent_disk_blocknr(leaf, 419 + extent)) { 419 420 inode->i_blocks -= 420 421 (old_num - new_num) << 3; 421 422 } 422 - btrfs_set_file_extent_num_blocks(extent, 423 + btrfs_set_file_extent_num_blocks(leaf, 424 + extent, 423 425 new_num); 424 - btrfs_mark_buffer_dirty(path->nodes[0]); 426 + btrfs_mark_buffer_dirty(leaf); 425 427 } else { 426 428 WARN_ON(1); 427 429 } ··· 437 431 u64 extent_num_blocks = 0; 438 432 if (found_extent) { 439 433 disk_blocknr = 440 - btrfs_file_extent_disk_blocknr(extent); 434 + btrfs_file_extent_disk_blocknr(leaf, 435 + extent); 441 436 disk_num_blocks = 442 - btrfs_file_extent_disk_num_blocks(extent); 437 + btrfs_file_extent_disk_num_blocks(leaf, 438 + extent); 443 439 extent_num_blocks = 444 - btrfs_file_extent_num_blocks(extent); 440 + btrfs_file_extent_num_blocks(leaf, 441 + extent); 445 442 *hint_block = 446 - btrfs_file_extent_disk_blocknr(extent); 443 + btrfs_file_extent_disk_blocknr(leaf, 444 + extent); 447 445 } 448 446 ret = btrfs_del_item(trans, root, path); 449 447 /* TODO update progress marker and return */ ··· 474 464 struct btrfs_key ins; 475 465 ins.objectid = inode->i_ino; 476 466 ins.offset = end; 477 - ins.flags = 0; 478 467 btrfs_set_key_type(&ins, BTRFS_EXTENT_DATA_KEY); 479 468 btrfs_release_path(root, path); 480 469 ret = btrfs_insert_empty_item(trans, root, path, &ins, 481 470 sizeof(*extent)); 482 471 472 + leaf = path->nodes[0]; 483 473 if (ret) { 484 - btrfs_print_leaf(root, btrfs_buffer_leaf(path->nodes[0])); 485 - printk("got %d on inserting %Lu %u %Lu start %Lu end %Lu found %Lu %Lu keep was %d\n", ret , ins.objectid, ins.flags, ins.offset, start, end, key.offset, extent_end, keep); 474 + btrfs_print_leaf(root, leaf); 475 + printk("got %d on inserting %Lu %u %Lu start %Lu end %Lu found %Lu %Lu keep was %d\n", ret , ins.objectid, ins.type, ins.offset, start, end, key.offset, extent_end, keep); 486 476 } 487 477 BUG_ON(ret); 488 - extent = btrfs_item_ptr( 489 - btrfs_buffer_leaf(path->nodes[0]), 490 - path->slots[0], 491 - struct btrfs_file_extent_item); 492 - btrfs_set_file_extent_disk_blocknr(extent, 493 - btrfs_file_extent_disk_blocknr(&old)); 494 - btrfs_set_file_extent_disk_num_blocks(extent, 495 - btrfs_file_extent_disk_num_blocks(&old)); 478 + extent = btrfs_item_ptr(leaf, path->slots[0], 479 + struct btrfs_file_extent_item); 480 + write_extent_buffer(leaf, &old, 481 + (unsigned long)extent, sizeof(old)); 496 482 497 - btrfs_set_file_extent_offset(extent, 498 - btrfs_file_extent_offset(&old) + 483 + btrfs_set_file_extent_offset(leaf, extent, 484 + le64_to_cpu(old.offset) + 499 485 ((end - key.offset) >> inode->i_blkbits)); 500 - WARN_ON(btrfs_file_extent_num_blocks(&old) < 486 + WARN_ON(le64_to_cpu(old.num_blocks) < 501 487 (extent_end - end) >> inode->i_blkbits); 502 - btrfs_set_file_extent_num_blocks(extent, 488 + btrfs_set_file_extent_num_blocks(leaf, extent, 503 489 (extent_end - end) >> inode->i_blkbits); 504 490 505 - btrfs_set_file_extent_type(extent, 491 + btrfs_set_file_extent_type(leaf, extent, 506 492 BTRFS_FILE_EXTENT_REG); 507 - btrfs_set_file_extent_generation(extent, 508 - btrfs_file_extent_generation(&old)); 509 493 btrfs_mark_buffer_dirty(path->nodes[0]); 510 - if (btrfs_file_extent_disk_blocknr(&old) != 0) { 494 + if (le64_to_cpu(old.disk_blocknr) != 0) { 511 495 inode->i_blocks += 512 - btrfs_file_extent_num_blocks(extent) << 3; 496 + btrfs_file_extent_num_blocks(leaf, 497 + extent) << 3; 513 498 } 514 499 ret = 0; 515 500 goto out; ··· 534 529 u64 num_blocks; 535 530 u64 start_pos; 536 531 537 - start_pos = pos & ~((u64)root->blocksize - 1); 538 - num_blocks = (write_bytes + pos - start_pos + root->blocksize - 1) >> 532 + start_pos = pos & ~((u64)root->sectorsize - 1); 533 + num_blocks = (write_bytes + pos - start_pos + root->sectorsize - 1) >> 539 534 inode->i_blkbits; 540 535 541 536 memset(pages, 0, num_pages * sizeof(struct page *));
+8 -14
fs/btrfs/inode-item.c
··· 20 20 #include "disk-io.h" 21 21 #include "transaction.h" 22 22 23 - int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root 24 - *root, u64 objectid, struct btrfs_inode_item 25 - *inode_item) 23 + int btrfs_insert_empty_inode(struct btrfs_trans_handle *trans, 24 + struct btrfs_root *root, 25 + struct btrfs_path *path, u64 objectid) 26 26 { 27 - struct btrfs_path *path; 28 27 struct btrfs_key key; 29 28 int ret; 30 29 key.objectid = objectid; 31 - key.flags = 0; 32 30 btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); 33 31 key.offset = 0; 34 32 35 - path = btrfs_alloc_path(); 36 - BUG_ON(!path); 37 - ret = btrfs_insert_item(trans, root, &key, inode_item, 38 - sizeof(*inode_item)); 39 - btrfs_release_path(root, path); 40 - btrfs_free_path(path); 33 + ret = btrfs_insert_empty_item(trans, root, path, &key, 34 + sizeof(struct btrfs_inode_item)); 41 35 if (ret == 0 && objectid > root->highest_inode) 42 36 root->highest_inode = objectid; 43 37 return ret; ··· 45 51 int cow = mod != 0; 46 52 int ret; 47 53 int slot; 48 - struct btrfs_leaf *leaf; 54 + struct extent_buffer *leaf; 49 55 struct btrfs_key found_key; 50 56 51 57 ret = btrfs_search_slot(trans, root, location, path, ins_len, cow); 52 58 if (ret > 0 && btrfs_key_type(location) == BTRFS_ROOT_ITEM_KEY && 53 59 location->offset == (u64)-1 && path->slots[0] != 0) { 54 60 slot = path->slots[0] - 1; 55 - leaf = btrfs_buffer_leaf(path->nodes[0]); 56 - btrfs_disk_key_to_cpu(&found_key, &leaf->items[slot].key); 61 + leaf = path->nodes[0]; 62 + btrfs_item_key_to_cpu(leaf, &found_key, slot); 57 63 if (found_key.objectid == location->objectid && 58 64 btrfs_key_type(&found_key) == btrfs_key_type(location)) { 59 65 path->slots[0]--;
+9 -8
fs/btrfs/inode-map.c
··· 24 24 { 25 25 struct btrfs_path *path; 26 26 int ret; 27 - struct btrfs_leaf *l; 27 + struct extent_buffer *l; 28 28 struct btrfs_key search_key; 29 + struct btrfs_key found_key; 29 30 int slot; 30 31 31 32 path = btrfs_alloc_path(); ··· 40 39 BUG_ON(ret == 0); 41 40 if (path->slots[0] > 0) { 42 41 slot = path->slots[0] - 1; 43 - l = btrfs_buffer_leaf(path->nodes[0]); 44 - *objectid = btrfs_disk_key_objectid(&l->items[slot].key); 42 + l = path->nodes[0]; 43 + btrfs_item_key_to_cpu(l, &found_key, slot); 44 + *objectid = found_key.objectid; 45 45 } else { 46 46 *objectid = BTRFS_FIRST_FREE_OBJECTID; 47 47 } ··· 66 64 int slot = 0; 67 65 u64 last_ino = 0; 68 66 int start_found; 69 - struct btrfs_leaf *l; 67 + struct extent_buffer *l; 70 68 struct btrfs_key search_key; 71 69 u64 search_start = dirid; 72 70 73 71 path = btrfs_alloc_path(); 74 72 BUG_ON(!path); 75 - search_key.flags = 0; 76 73 search_start = root->last_inode_alloc; 77 74 search_start = max(search_start, BTRFS_FIRST_FREE_OBJECTID); 78 75 search_key.objectid = search_start; ··· 87 86 path->slots[0]--; 88 87 89 88 while (1) { 90 - l = btrfs_buffer_leaf(path->nodes[0]); 89 + l = path->nodes[0]; 91 90 slot = path->slots[0]; 92 - if (slot >= btrfs_header_nritems(&l->header)) { 91 + if (slot >= btrfs_header_nritems(l)) { 93 92 ret = btrfs_next_leaf(root, path); 94 93 if (ret == 0) 95 94 continue; ··· 104 103 last_ino : search_start; 105 104 goto found; 106 105 } 107 - btrfs_disk_key_to_cpu(&key, &l->items[slot].key); 106 + btrfs_item_key_to_cpu(l, &key, slot); 108 107 if (key.objectid >= search_start) { 109 108 if (start_found) { 110 109 if (last_ino < search_start)
+267 -168
fs/btrfs/inode.c
··· 159 159 160 160 int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end) 161 161 { 162 - char csum[BTRFS_CRC32_SIZE]; 163 162 size_t offset = start - (page->index << PAGE_CACHE_SHIFT); 164 163 struct inode *inode = page->mapping->host; 165 - struct btrfs_root *root = BTRFS_I(inode)->root; 166 164 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 167 165 char *kaddr; 168 166 u64 private; ··· 171 173 if (ret) { 172 174 goto zeroit; 173 175 } 176 + /* 177 + struct btrfs_root *root = BTRFS_I(inode)->root; 178 + char csum[BTRFS_CRC32_SIZE]; 174 179 ret = btrfs_csum_data(root, kaddr + offset, end - start + 1, csum); 175 180 BUG_ON(ret); 176 181 if (memcmp(csum, &private, BTRFS_CRC32_SIZE)) { 177 182 goto zeroit; 178 183 } 184 + */ 179 185 kunmap_atomic(kaddr, KM_IRQ0); 180 186 return 0; 181 187 ··· 194 192 void btrfs_read_locked_inode(struct inode *inode) 195 193 { 196 194 struct btrfs_path *path; 195 + struct extent_buffer *leaf; 197 196 struct btrfs_inode_item *inode_item; 197 + struct btrfs_inode_timespec *tspec; 198 198 struct btrfs_root *root = BTRFS_I(inode)->root; 199 199 struct btrfs_key location; 200 200 u64 alloc_group_block; ··· 209 205 210 206 memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); 211 207 ret = btrfs_lookup_inode(NULL, root, path, &location, 0); 212 - if (ret) { 208 + if (ret) 213 209 goto make_bad; 214 - } 215 - inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 216 - path->slots[0], 217 - struct btrfs_inode_item); 218 210 219 - inode->i_mode = btrfs_inode_mode(inode_item); 220 - inode->i_nlink = btrfs_inode_nlink(inode_item); 221 - inode->i_uid = btrfs_inode_uid(inode_item); 222 - inode->i_gid = btrfs_inode_gid(inode_item); 223 - inode->i_size = btrfs_inode_size(inode_item); 224 - inode->i_atime.tv_sec = btrfs_timespec_sec(&inode_item->atime); 225 - inode->i_atime.tv_nsec = btrfs_timespec_nsec(&inode_item->atime); 226 - inode->i_mtime.tv_sec = btrfs_timespec_sec(&inode_item->mtime); 227 - inode->i_mtime.tv_nsec = btrfs_timespec_nsec(&inode_item->mtime); 228 - inode->i_ctime.tv_sec = btrfs_timespec_sec(&inode_item->ctime); 229 - inode->i_ctime.tv_nsec = btrfs_timespec_nsec(&inode_item->ctime); 230 - inode->i_blocks = btrfs_inode_nblocks(inode_item); 231 - inode->i_generation = btrfs_inode_generation(inode_item); 211 + leaf = path->nodes[0]; 212 + inode_item = btrfs_item_ptr(leaf, path->slots[0], 213 + struct btrfs_inode_item); 214 + 215 + inode->i_mode = btrfs_inode_mode(leaf, inode_item); 216 + inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); 217 + inode->i_uid = btrfs_inode_uid(leaf, inode_item); 218 + inode->i_gid = btrfs_inode_gid(leaf, inode_item); 219 + inode->i_size = btrfs_inode_size(leaf, inode_item); 220 + 221 + tspec = btrfs_inode_atime(inode_item); 222 + inode->i_atime.tv_sec = btrfs_timespec_sec(leaf, tspec); 223 + inode->i_atime.tv_nsec = btrfs_timespec_nsec(leaf, tspec); 224 + 225 + tspec = btrfs_inode_mtime(inode_item); 226 + inode->i_mtime.tv_sec = btrfs_timespec_sec(leaf, tspec); 227 + inode->i_mtime.tv_nsec = btrfs_timespec_nsec(leaf, tspec); 228 + 229 + tspec = btrfs_inode_ctime(inode_item); 230 + inode->i_ctime.tv_sec = btrfs_timespec_sec(leaf, tspec); 231 + inode->i_ctime.tv_nsec = btrfs_timespec_nsec(leaf, tspec); 232 + 233 + inode->i_blocks = btrfs_inode_nblocks(leaf, inode_item); 234 + inode->i_generation = btrfs_inode_generation(leaf, inode_item); 232 235 inode->i_rdev = 0; 233 - rdev = btrfs_inode_rdev(inode_item); 234 - alloc_group_block = btrfs_inode_block_group(inode_item); 236 + rdev = btrfs_inode_rdev(leaf, inode_item); 237 + 238 + alloc_group_block = btrfs_inode_block_group(leaf, inode_item); 235 239 BTRFS_I(inode)->block_group = btrfs_lookup_block_group(root->fs_info, 236 240 alloc_group_block); 237 241 ··· 279 267 make_bad_inode(inode); 280 268 } 281 269 282 - static void fill_inode_item(struct btrfs_inode_item *item, 270 + static void fill_inode_item(struct extent_buffer *leaf, 271 + struct btrfs_inode_item *item, 283 272 struct inode *inode) 284 273 { 285 - btrfs_set_inode_uid(item, inode->i_uid); 286 - btrfs_set_inode_gid(item, inode->i_gid); 287 - btrfs_set_inode_size(item, inode->i_size); 288 - btrfs_set_inode_mode(item, inode->i_mode); 289 - btrfs_set_inode_nlink(item, inode->i_nlink); 290 - btrfs_set_timespec_sec(&item->atime, inode->i_atime.tv_sec); 291 - btrfs_set_timespec_nsec(&item->atime, inode->i_atime.tv_nsec); 292 - btrfs_set_timespec_sec(&item->mtime, inode->i_mtime.tv_sec); 293 - btrfs_set_timespec_nsec(&item->mtime, inode->i_mtime.tv_nsec); 294 - btrfs_set_timespec_sec(&item->ctime, inode->i_ctime.tv_sec); 295 - btrfs_set_timespec_nsec(&item->ctime, inode->i_ctime.tv_nsec); 296 - btrfs_set_inode_nblocks(item, inode->i_blocks); 297 - btrfs_set_inode_generation(item, inode->i_generation); 298 - btrfs_set_inode_rdev(item, inode->i_rdev); 299 - btrfs_set_inode_block_group(item, 274 + btrfs_set_inode_uid(leaf, item, inode->i_uid); 275 + btrfs_set_inode_gid(leaf, item, inode->i_gid); 276 + btrfs_set_inode_size(leaf, item, inode->i_size); 277 + btrfs_set_inode_mode(leaf, item, inode->i_mode); 278 + btrfs_set_inode_nlink(leaf, item, inode->i_nlink); 279 + 280 + btrfs_set_timespec_sec(leaf, btrfs_inode_atime(item), 281 + inode->i_atime.tv_sec); 282 + btrfs_set_timespec_nsec(leaf, btrfs_inode_atime(item), 283 + inode->i_atime.tv_nsec); 284 + 285 + btrfs_set_timespec_sec(leaf, btrfs_inode_mtime(item), 286 + inode->i_mtime.tv_sec); 287 + btrfs_set_timespec_nsec(leaf, btrfs_inode_mtime(item), 288 + inode->i_mtime.tv_nsec); 289 + 290 + btrfs_set_timespec_sec(leaf, btrfs_inode_ctime(item), 291 + inode->i_ctime.tv_sec); 292 + btrfs_set_timespec_nsec(leaf, btrfs_inode_ctime(item), 293 + inode->i_ctime.tv_nsec); 294 + 295 + btrfs_set_inode_nblocks(leaf, item, inode->i_blocks); 296 + btrfs_set_inode_generation(leaf, item, inode->i_generation); 297 + btrfs_set_inode_rdev(leaf, item, inode->i_rdev); 298 + btrfs_set_inode_block_group(leaf, item, 300 299 BTRFS_I(inode)->block_group->key.objectid); 301 300 } 302 301 ··· 317 294 { 318 295 struct btrfs_inode_item *inode_item; 319 296 struct btrfs_path *path; 297 + struct extent_buffer *leaf; 320 298 int ret; 321 299 322 300 path = btrfs_alloc_path(); ··· 330 306 goto failed; 331 307 } 332 308 333 - inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 334 - path->slots[0], 309 + leaf = path->nodes[0]; 310 + inode_item = btrfs_item_ptr(leaf, path->slots[0], 335 311 struct btrfs_inode_item); 336 312 337 - fill_inode_item(inode_item, inode); 338 - btrfs_mark_buffer_dirty(path->nodes[0]); 313 + fill_inode_item(leaf, inode_item, inode); 314 + btrfs_mark_buffer_dirty(leaf); 339 315 btrfs_set_inode_last_trans(trans, inode); 340 316 ret = 0; 341 317 failed: ··· 354 330 const char *name = dentry->d_name.name; 355 331 int name_len = dentry->d_name.len; 356 332 int ret = 0; 357 - u64 objectid; 333 + struct extent_buffer *leaf; 358 334 struct btrfs_dir_item *di; 335 + struct btrfs_key key; 359 336 360 337 path = btrfs_alloc_path(); 361 338 if (!path) { ··· 374 349 ret = -ENOENT; 375 350 goto err; 376 351 } 377 - objectid = btrfs_disk_key_objectid(&di->location); 352 + leaf = path->nodes[0]; 353 + btrfs_dir_item_key_to_cpu(leaf, di, &key); 378 354 ret = btrfs_delete_one_dir_name(trans, root, path, di); 379 355 if (ret) 380 356 goto err; 381 357 btrfs_release_path(root, path); 382 358 383 359 di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, 384 - objectid, name, name_len, -1); 360 + key.objectid, name, name_len, -1); 385 361 if (IS_ERR(di)) { 386 362 ret = PTR_ERR(di); 387 363 goto err; ··· 417 391 root = BTRFS_I(dir)->root; 418 392 mutex_lock(&root->fs_info->fs_mutex); 419 393 trans = btrfs_start_transaction(root, 1); 394 + 420 395 btrfs_set_trans_block_group(trans, dir); 421 396 ret = btrfs_unlink_trans(trans, root, dir, dentry); 422 397 nr = trans->blocks_used; 398 + 423 399 btrfs_end_transaction(trans, root); 424 400 mutex_unlock(&root->fs_info->fs_mutex); 425 401 btrfs_btree_balance_dirty(root, nr); 402 + 426 403 return ret; 427 404 } 428 405 ··· 440 411 struct btrfs_trans_handle *trans; 441 412 struct btrfs_key found_key; 442 413 int found_type; 443 - struct btrfs_leaf *leaf; 414 + struct extent_buffer *leaf; 444 415 char *goodnames = ".."; 445 416 unsigned long nr; 446 417 ··· 448 419 BUG_ON(!path); 449 420 mutex_lock(&root->fs_info->fs_mutex); 450 421 trans = btrfs_start_transaction(root, 1); 422 + 451 423 btrfs_set_trans_block_group(trans, dir); 452 424 key.objectid = inode->i_ino; 453 425 key.offset = (u64)-1; 454 - key.flags = (u32)-1; 426 + key.type = (u8)-1; 455 427 while(1) { 456 428 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); 457 429 if (ret < 0) { ··· 465 435 goto out; 466 436 } 467 437 path->slots[0]--; 468 - leaf = btrfs_buffer_leaf(path->nodes[0]); 469 - btrfs_disk_key_to_cpu(&found_key, 470 - &leaf->items[path->slots[0]].key); 438 + leaf = path->nodes[0]; 439 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 471 440 found_type = btrfs_key_type(&found_key); 472 441 if (found_key.objectid != inode->i_ino) { 473 442 err = -ENOENT; ··· 542 513 int ret; 543 514 struct btrfs_path *path; 544 515 struct btrfs_key key; 545 - struct btrfs_disk_key *found_key; 516 + struct btrfs_key found_key; 546 517 u32 found_type; 547 - struct btrfs_leaf *leaf; 518 + struct extent_buffer *leaf; 548 519 struct btrfs_file_extent_item *fi; 549 520 u64 extent_start = 0; 550 521 u64 extent_num_blocks = 0; ··· 556 527 path = btrfs_alloc_path(); 557 528 path->reada = -1; 558 529 BUG_ON(!path); 530 + 559 531 /* FIXME, add redo link to tree so we don't leak on crash */ 560 532 key.objectid = inode->i_ino; 561 533 key.offset = (u64)-1; 562 - key.flags = (u32)-1; 534 + key.type = (u8)-1; 535 + 563 536 while(1) { 564 537 btrfs_init_path(path); 565 538 fi = NULL; ··· 573 542 BUG_ON(path->slots[0] == 0); 574 543 path->slots[0]--; 575 544 } 576 - leaf = btrfs_buffer_leaf(path->nodes[0]); 577 - found_key = &leaf->items[path->slots[0]].key; 578 - found_type = btrfs_disk_key_type(found_key); 545 + leaf = path->nodes[0]; 546 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 547 + found_type = btrfs_key_type(&found_key); 579 548 580 - if (btrfs_disk_key_objectid(found_key) != inode->i_ino) 549 + if (found_key.objectid != inode->i_ino) 581 550 break; 551 + 582 552 if (found_type != BTRFS_CSUM_ITEM_KEY && 583 553 found_type != BTRFS_DIR_ITEM_KEY && 584 554 found_type != BTRFS_DIR_INDEX_KEY && 585 555 found_type != BTRFS_EXTENT_DATA_KEY) 586 556 break; 587 557 588 - item_end = btrfs_disk_key_offset(found_key); 558 + item_end = found_key.offset; 589 559 if (found_type == BTRFS_EXTENT_DATA_KEY) { 590 - fi = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 591 - path->slots[0], 560 + fi = btrfs_item_ptr(leaf, path->slots[0], 592 561 struct btrfs_file_extent_item); 593 - if (btrfs_file_extent_type(fi) != 562 + if (btrfs_file_extent_type(leaf, fi) != 594 563 BTRFS_FILE_EXTENT_INLINE) { 595 - item_end += btrfs_file_extent_num_blocks(fi) << 596 - inode->i_blkbits; 564 + item_end += 565 + btrfs_file_extent_num_blocks(leaf, fi) << 566 + inode->i_blkbits; 597 567 } 598 568 } 599 569 if (found_type == BTRFS_CSUM_ITEM_KEY) { ··· 615 583 btrfs_set_key_type(&key, found_type); 616 584 continue; 617 585 } 618 - if (btrfs_disk_key_offset(found_key) >= inode->i_size) 586 + if (found_key.offset >= inode->i_size) 619 587 del_item = 1; 620 588 else 621 589 del_item = 0; ··· 623 591 624 592 /* FIXME, shrink the extent if the ref count is only 1 */ 625 593 if (found_type == BTRFS_EXTENT_DATA_KEY && 626 - btrfs_file_extent_type(fi) != 594 + btrfs_file_extent_type(leaf, fi) != 627 595 BTRFS_FILE_EXTENT_INLINE) { 628 596 u64 num_dec; 629 - extent_start = btrfs_file_extent_disk_blocknr(fi); 597 + extent_start = btrfs_file_extent_disk_blocknr(leaf, fi); 630 598 if (!del_item) { 631 599 u64 orig_num_blocks = 632 - btrfs_file_extent_num_blocks(fi); 600 + btrfs_file_extent_num_blocks(leaf, fi); 633 601 extent_num_blocks = inode->i_size - 634 - btrfs_disk_key_offset(found_key) + 635 - root->blocksize - 1; 602 + found_key.offset + root->sectorsize - 1; 636 603 extent_num_blocks >>= inode->i_blkbits; 637 - btrfs_set_file_extent_num_blocks(fi, 604 + btrfs_set_file_extent_num_blocks(leaf, fi, 638 605 extent_num_blocks); 639 606 num_dec = (orig_num_blocks - 640 607 extent_num_blocks) << 3; 641 608 if (extent_start != 0) { 642 609 inode->i_blocks -= num_dec; 643 610 } 644 - btrfs_mark_buffer_dirty(path->nodes[0]); 611 + btrfs_mark_buffer_dirty(leaf); 645 612 } else { 646 613 extent_num_blocks = 647 - btrfs_file_extent_disk_num_blocks(fi); 614 + btrfs_file_extent_disk_num_blocks(leaf, 615 + fi); 648 616 /* FIXME blocksize != 4096 */ 649 - num_dec = btrfs_file_extent_num_blocks(fi) << 3; 617 + num_dec = btrfs_file_extent_num_blocks(leaf, 618 + fi) << 3; 650 619 if (extent_start != 0) { 651 620 found_extent = 1; 652 621 inode->i_blocks -= num_dec; ··· 758 725 struct btrfs_root *root = BTRFS_I(inode)->root; 759 726 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 760 727 761 - u64 mask = root->blocksize - 1; 728 + u64 mask = root->sectorsize - 1; 762 729 u64 pos = (inode->i_size + mask) & ~mask; 763 730 u64 block_end = attr->ia_size | mask; 764 731 u64 hole_size; ··· 804 771 if (is_bad_inode(inode)) { 805 772 goto no_delete; 806 773 } 774 + 807 775 inode->i_size = 0; 808 776 mutex_lock(&root->fs_info->fs_mutex); 809 777 trans = btrfs_start_transaction(root, 1); 778 + 810 779 btrfs_set_trans_block_group(trans, inode); 811 780 ret = btrfs_truncate_in_trans(trans, root, inode); 812 781 if (ret) ··· 817 782 if (ret) 818 783 goto no_delete_lock; 819 784 nr = trans->blocks_used; 785 + 820 786 btrfs_end_transaction(trans, root); 821 787 mutex_unlock(&root->fs_info->fs_mutex); 822 788 btrfs_btree_balance_dirty(root, nr); ··· 855 819 ret = 0; 856 820 goto out; 857 821 } 858 - btrfs_disk_key_to_cpu(location, &di->location); 822 + btrfs_dir_item_key_to_cpu(path->nodes[0], di, location); 859 823 out: 860 824 btrfs_release_path(root, path); 861 825 btrfs_free_path(path); ··· 892 856 893 857 ri = &(*sub_root)->root_item; 894 858 location->objectid = btrfs_root_dirid(ri); 895 - location->flags = 0; 896 859 btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY); 897 860 location->offset = 0; 898 861 ··· 943 908 944 909 if (dentry->d_name.len > BTRFS_NAME_LEN) 945 910 return ERR_PTR(-ENAMETOOLONG); 911 + 946 912 mutex_lock(&root->fs_info->fs_mutex); 947 913 ret = btrfs_inode_by_name(dir, dentry, &location); 948 914 mutex_unlock(&root->fs_info->fs_mutex); 915 + 949 916 if (ret < 0) 950 917 return ERR_PTR(ret); 918 + 951 919 inode = NULL; 952 920 if (location.objectid) { 953 921 ret = fixup_tree_root_location(root, &location, &sub_root, ··· 990 952 struct btrfs_item *item; 991 953 struct btrfs_dir_item *di; 992 954 struct btrfs_key key; 955 + struct btrfs_key found_key; 993 956 struct btrfs_path *path; 994 957 int ret; 995 958 u32 nritems; 996 - struct btrfs_leaf *leaf; 959 + struct extent_buffer *leaf; 997 960 int slot; 998 961 int advance; 999 962 unsigned char d_type; ··· 1003 964 u32 di_total; 1004 965 u32 di_len; 1005 966 int key_type = BTRFS_DIR_INDEX_KEY; 967 + char tmp_name[32]; 968 + char *name_ptr; 969 + int name_len; 1006 970 1007 971 /* FIXME, use a real flag for deciding about the key type */ 1008 972 if (root->fs_info->tree_root == root) 1009 973 key_type = BTRFS_DIR_ITEM_KEY; 974 + 1010 975 mutex_lock(&root->fs_info->fs_mutex); 1011 976 key.objectid = inode->i_ino; 1012 - key.flags = 0; 1013 977 btrfs_set_key_type(&key, key_type); 1014 978 key.offset = filp->f_pos; 979 + 1015 980 path = btrfs_alloc_path(); 1016 981 path->reada = 2; 1017 982 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); ··· 1023 980 goto err; 1024 981 advance = 0; 1025 982 while(1) { 1026 - leaf = btrfs_buffer_leaf(path->nodes[0]); 1027 - nritems = btrfs_header_nritems(&leaf->header); 983 + leaf = path->nodes[0]; 984 + nritems = btrfs_header_nritems(leaf); 1028 985 slot = path->slots[0]; 1029 986 if (advance || slot >= nritems) { 1030 987 if (slot >= nritems -1) { 1031 988 ret = btrfs_next_leaf(root, path); 1032 989 if (ret) 1033 990 break; 1034 - leaf = btrfs_buffer_leaf(path->nodes[0]); 1035 - nritems = btrfs_header_nritems(&leaf->header); 991 + leaf = path->nodes[0]; 992 + nritems = btrfs_header_nritems(leaf); 1036 993 slot = path->slots[0]; 1037 994 } else { 1038 995 slot++; ··· 1040 997 } 1041 998 } 1042 999 advance = 1; 1043 - item = leaf->items + slot; 1044 - if (btrfs_disk_key_objectid(&item->key) != key.objectid) 1000 + item = btrfs_item_nr(leaf, slot); 1001 + btrfs_item_key_to_cpu(leaf, &found_key, slot); 1002 + 1003 + if (found_key.objectid != key.objectid) 1045 1004 break; 1046 - if (btrfs_disk_key_type(&item->key) != key_type) 1005 + if (btrfs_key_type(&found_key) != key_type) 1047 1006 break; 1048 - if (btrfs_disk_key_offset(&item->key) < filp->f_pos) 1007 + if (found_key.offset < filp->f_pos) 1049 1008 continue; 1050 - filp->f_pos = btrfs_disk_key_offset(&item->key); 1009 + 1010 + filp->f_pos = found_key.offset; 1051 1011 advance = 1; 1052 1012 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); 1053 1013 di_cur = 0; 1054 - di_total = btrfs_item_size(leaf->items + slot); 1014 + di_total = btrfs_item_size(leaf, item); 1055 1015 while(di_cur < di_total) { 1056 - d_type = btrfs_filetype_table[btrfs_dir_type(di)]; 1057 - over = filldir(dirent, (const char *)(di + 1), 1058 - btrfs_dir_name_len(di), 1059 - btrfs_disk_key_offset(&item->key), 1060 - btrfs_disk_key_objectid(&di->location), 1016 + struct btrfs_key location; 1017 + 1018 + name_len = btrfs_dir_name_len(leaf, di); 1019 + if (name_len < 32) { 1020 + name_ptr = tmp_name; 1021 + } else { 1022 + name_ptr = kmalloc(name_len, GFP_NOFS); 1023 + BUG_ON(!name_ptr); 1024 + } 1025 + read_extent_buffer(leaf, name_ptr, 1026 + (unsigned long)(di + 1), name_len); 1027 + 1028 + d_type = btrfs_filetype_table[btrfs_dir_type(leaf, di)]; 1029 + btrfs_dir_item_key_to_cpu(leaf, di, &location); 1030 + 1031 + over = filldir(dirent, name_ptr, name_len, 1032 + found_key.offset, 1033 + location.objectid, 1061 1034 d_type); 1035 + 1036 + if (name_ptr != tmp_name) 1037 + kfree(name_ptr); 1038 + 1062 1039 if (over) 1063 1040 goto nopos; 1064 - di_len = btrfs_dir_name_len(di) + sizeof(*di); 1041 + di_len = btrfs_dir_name_len(leaf, di) + sizeof(*di); 1065 1042 di_cur += di_len; 1066 1043 di = (struct btrfs_dir_item *)((char *)di + di_len); 1067 1044 } ··· 1138 1075 int mode) 1139 1076 { 1140 1077 struct inode *inode; 1141 - struct btrfs_inode_item inode_item; 1078 + struct btrfs_inode_item *inode_item; 1142 1079 struct btrfs_key *location; 1080 + struct btrfs_path *path; 1143 1081 int ret; 1144 1082 int owner; 1083 + 1084 + path = btrfs_alloc_path(); 1085 + BUG_ON(!path); 1145 1086 1146 1087 inode = new_inode(root->fs_info->sb); 1147 1088 if (!inode) ··· 1162 1095 group = btrfs_find_block_group(root, group, 0, 0, owner); 1163 1096 BTRFS_I(inode)->block_group = group; 1164 1097 1098 + ret = btrfs_insert_empty_inode(trans, root, path, objectid); 1099 + if (ret) 1100 + goto fail; 1101 + 1165 1102 inode->i_uid = current->fsuid; 1166 1103 inode->i_gid = current->fsgid; 1167 1104 inode->i_mode = mode; 1168 1105 inode->i_ino = objectid; 1169 1106 inode->i_blocks = 0; 1170 1107 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; 1171 - fill_inode_item(&inode_item, inode); 1108 + inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], 1109 + struct btrfs_inode_item); 1110 + fill_inode_item(path->nodes[0], inode_item, inode); 1111 + btrfs_mark_buffer_dirty(path->nodes[0]); 1112 + btrfs_free_path(path); 1113 + 1172 1114 location = &BTRFS_I(inode)->location; 1173 1115 location->objectid = objectid; 1174 - location->flags = 0; 1175 1116 location->offset = 0; 1176 1117 btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY); 1177 1118 1178 - ret = btrfs_insert_inode(trans, root, objectid, &inode_item); 1179 - if (ret) 1180 - return ERR_PTR(ret); 1181 1119 insert_inode_hash(inode); 1182 1120 return inode; 1121 + fail: 1122 + btrfs_free_path(path); 1123 + return ERR_PTR(ret); 1183 1124 } 1184 1125 1185 1126 static inline u8 btrfs_inode_type(struct inode *inode) ··· 1202 1127 struct btrfs_key key; 1203 1128 struct btrfs_root *root = BTRFS_I(dentry->d_parent->d_inode)->root; 1204 1129 struct inode *parent_inode; 1130 + 1205 1131 key.objectid = inode->i_ino; 1206 - key.flags = 0; 1207 1132 btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); 1208 1133 key.offset = 0; 1209 1134 ··· 1360 1285 inc_nlink(inode); 1361 1286 mutex_lock(&root->fs_info->fs_mutex); 1362 1287 trans = btrfs_start_transaction(root, 1); 1288 + 1363 1289 btrfs_set_trans_block_group(trans, dir); 1364 1290 atomic_inc(&inode->i_count); 1365 1291 err = btrfs_add_nondir(trans, dentry, inode); 1292 + 1366 1293 if (err) 1367 1294 drop_inode = 1; 1295 + 1368 1296 dir->i_sb->s_dirt = 1; 1369 1297 btrfs_update_inode_block_group(trans, dir); 1370 1298 err = btrfs_update_inode(trans, root, inode); 1299 + 1371 1300 if (err) 1372 1301 drop_inode = 1; 1373 1302 ··· 1400 1321 1401 1322 key.objectid = objectid; 1402 1323 key.offset = 0; 1403 - key.flags = 0; 1404 1324 btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); 1405 1325 1406 1326 ret = btrfs_insert_dir_item(trans, root, buf, 1, objectid, 1407 1327 &key, BTRFS_FT_DIR); 1408 1328 if (ret) 1409 1329 goto error; 1330 + 1410 1331 key.objectid = dirid; 1411 1332 ret = btrfs_insert_dir_item(trans, root, buf, 2, objectid, 1412 1333 &key, BTRFS_FT_DIR); ··· 1429 1350 mutex_lock(&root->fs_info->fs_mutex); 1430 1351 trans = btrfs_start_transaction(root, 1); 1431 1352 btrfs_set_trans_block_group(trans, dir); 1353 + 1432 1354 if (IS_ERR(trans)) { 1433 1355 err = PTR_ERR(trans); 1434 1356 goto out_unlock; ··· 1447 1367 err = PTR_ERR(inode); 1448 1368 goto out_fail; 1449 1369 } 1370 + 1450 1371 drop_on_err = 1; 1451 1372 inode->i_op = &btrfs_dir_inode_operations; 1452 1373 inode->i_fop = &btrfs_dir_file_operations; ··· 1461 1380 err = btrfs_update_inode(trans, root, inode); 1462 1381 if (err) 1463 1382 goto out_fail; 1383 + 1464 1384 err = btrfs_add_link(trans, dentry, inode); 1465 1385 if (err) 1466 1386 goto out_fail; 1387 + 1467 1388 d_instantiate(dentry, inode); 1468 1389 drop_on_err = 0; 1469 1390 dir->i_sb->s_dirt = 1; ··· 1475 1392 out_fail: 1476 1393 nr = trans->blocks_used; 1477 1394 btrfs_end_transaction(trans, root); 1395 + 1478 1396 out_unlock: 1479 1397 mutex_unlock(&root->fs_info->fs_mutex); 1480 1398 if (drop_on_err) ··· 1499 1415 struct btrfs_path *path; 1500 1416 struct btrfs_root *root = BTRFS_I(inode)->root; 1501 1417 struct btrfs_file_extent_item *item; 1502 - struct btrfs_leaf *leaf; 1503 - struct btrfs_disk_key *found_key; 1418 + struct extent_buffer *leaf; 1419 + struct btrfs_key found_key; 1504 1420 struct extent_map *em = NULL; 1505 1421 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 1506 1422 struct btrfs_trans_handle *trans = NULL; ··· 1520 1436 err = -ENOMEM; 1521 1437 goto out; 1522 1438 } 1523 - em->start = 0; 1524 - em->end = 0; 1439 + em->start = EXTENT_MAP_HOLE; 1440 + em->end = EXTENT_MAP_HOLE; 1525 1441 } 1526 1442 em->bdev = inode->i_sb->s_bdev; 1527 1443 ret = btrfs_lookup_file_extent(NULL, root, path, ··· 1537 1453 path->slots[0]--; 1538 1454 } 1539 1455 1540 - item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 1456 + leaf = path->nodes[0]; 1457 + item = btrfs_item_ptr(leaf, path->slots[0], 1541 1458 struct btrfs_file_extent_item); 1542 - leaf = btrfs_buffer_leaf(path->nodes[0]); 1543 - blocknr = btrfs_file_extent_disk_blocknr(item); 1544 - blocknr += btrfs_file_extent_offset(item); 1459 + 1460 + blocknr = btrfs_file_extent_disk_blocknr(leaf, item); 1461 + blocknr += btrfs_file_extent_offset(leaf, item); 1545 1462 1546 1463 /* are we inside the extent that was found? */ 1547 - found_key = &leaf->items[path->slots[0]].key; 1548 - found_type = btrfs_disk_key_type(found_key); 1549 - if (btrfs_disk_key_objectid(found_key) != objectid || 1464 + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); 1465 + found_type = btrfs_key_type(&found_key); 1466 + if (found_key.objectid != objectid || 1550 1467 found_type != BTRFS_EXTENT_DATA_KEY) { 1551 1468 goto not_found; 1552 1469 } 1553 1470 1554 - found_type = btrfs_file_extent_type(item); 1555 - extent_start = btrfs_disk_key_offset(&leaf->items[path->slots[0]].key); 1471 + found_type = btrfs_file_extent_type(leaf, item); 1472 + extent_start = found_key.offset; 1556 1473 if (found_type == BTRFS_FILE_EXTENT_REG) { 1557 1474 extent_end = extent_start + 1558 - (btrfs_file_extent_num_blocks(item) << inode->i_blkbits); 1475 + (btrfs_file_extent_num_blocks(leaf, item) << 1476 + inode->i_blkbits); 1559 1477 err = 0; 1560 1478 if (start < extent_start || start >= extent_end) { 1561 1479 em->start = start; ··· 1570 1484 } 1571 1485 goto not_found_em; 1572 1486 } 1573 - if (btrfs_file_extent_disk_blocknr(item) == 0) { 1487 + if (btrfs_file_extent_disk_blocknr(leaf, item) == 0) { 1574 1488 em->start = extent_start; 1575 1489 em->end = extent_end - 1; 1576 - em->block_start = 0; 1577 - em->block_end = 0; 1490 + em->block_start = EXTENT_MAP_HOLE; 1491 + em->block_end = EXTENT_MAP_HOLE; 1578 1492 goto insert; 1579 1493 } 1580 1494 em->block_start = blocknr << inode->i_blkbits; 1581 1495 em->block_end = em->block_start + 1582 - (btrfs_file_extent_num_blocks(item) << 1496 + (btrfs_file_extent_num_blocks(leaf, item) << 1583 1497 inode->i_blkbits) - 1; 1584 1498 em->start = extent_start; 1585 1499 em->end = extent_end - 1; 1586 1500 goto insert; 1587 1501 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { 1588 - char *ptr; 1502 + unsigned long ptr; 1589 1503 char *map; 1590 1504 u32 size; 1591 1505 1592 - size = btrfs_file_extent_inline_len(leaf->items + 1593 - path->slots[0]); 1594 - extent_end = extent_start | ((u64)root->blocksize - 1); 1506 + size = btrfs_file_extent_inline_len(leaf, btrfs_item_nr(leaf, 1507 + path->slots[0])); 1508 + 1509 + extent_end = extent_start | ((u64)root->sectorsize - 1); 1595 1510 if (start < extent_start || start >= extent_end) { 1596 1511 em->start = start; 1597 1512 if (start < extent_start) { ··· 1604 1517 } 1605 1518 goto not_found_em; 1606 1519 } 1520 + 1607 1521 em->block_start = EXTENT_MAP_INLINE; 1608 1522 em->block_end = EXTENT_MAP_INLINE; 1609 1523 em->start = extent_start; 1610 1524 em->end = extent_end; 1525 + 1611 1526 if (!page) { 1612 1527 goto insert; 1613 1528 } 1529 + 1614 1530 ptr = btrfs_file_extent_inline_start(item); 1615 1531 map = kmap(page); 1616 - memcpy(map + page_offset, ptr, size); 1532 + read_extent_buffer(leaf, map + page_offset, ptr, size); 1617 1533 memset(map + page_offset + size, 0, 1618 - root->blocksize - (page_offset + size)); 1534 + root->sectorsize - (page_offset + size)); 1619 1535 flush_dcache_page(page); 1620 1536 kunmap(page); 1621 1537 set_extent_uptodate(em_tree, extent_start, ··· 1632 1542 em->start = start; 1633 1543 em->end = end; 1634 1544 not_found_em: 1635 - em->block_start = 0; 1636 - em->block_end = 0; 1545 + em->block_start = EXTENT_MAP_HOLE; 1546 + em->block_end = EXTENT_MAP_HOLE; 1637 1547 insert: 1638 1548 btrfs_release_path(root, path); 1639 1549 if (em->start > start || em->end < start) { ··· 1802 1712 ret = btrfs_truncate_in_trans(trans, root, inode); 1803 1713 btrfs_update_inode(trans, root, inode); 1804 1714 nr = trans->blocks_used; 1715 + 1805 1716 ret = btrfs_end_transaction(trans, root); 1806 1717 BUG_ON(ret); 1807 1718 mutex_unlock(&root->fs_info->fs_mutex); ··· 1822 1731 struct btrfs_key key; 1823 1732 struct btrfs_root_item root_item; 1824 1733 struct btrfs_inode_item *inode_item; 1825 - struct buffer_head *subvol; 1826 - struct btrfs_leaf *leaf; 1734 + struct extent_buffer *leaf; 1827 1735 struct btrfs_root *new_root; 1828 1736 struct inode *inode; 1829 1737 struct inode *dir; ··· 1836 1746 trans = btrfs_start_transaction(root, 1); 1837 1747 BUG_ON(!trans); 1838 1748 1839 - subvol = btrfs_alloc_free_block(trans, root, 0, 0); 1840 - if (IS_ERR(subvol)) 1841 - return PTR_ERR(subvol); 1842 - leaf = btrfs_buffer_leaf(subvol); 1843 - btrfs_set_header_nritems(&leaf->header, 0); 1844 - btrfs_set_header_level(&leaf->header, 0); 1845 - btrfs_set_header_blocknr(&leaf->header, bh_blocknr(subvol)); 1846 - btrfs_set_header_generation(&leaf->header, trans->transid); 1847 - btrfs_set_header_owner(&leaf->header, root->root_key.objectid); 1848 - memcpy(leaf->header.fsid, root->fs_info->disk_super->fsid, 1849 - sizeof(leaf->header.fsid)); 1850 - btrfs_mark_buffer_dirty(subvol); 1749 + leaf = btrfs_alloc_free_block(trans, root, 0, 0); 1750 + if (IS_ERR(leaf)) 1751 + return PTR_ERR(leaf); 1752 + 1753 + btrfs_set_header_nritems(leaf, 0); 1754 + btrfs_set_header_level(leaf, 0); 1755 + btrfs_set_header_blocknr(leaf, extent_buffer_blocknr(leaf)); 1756 + btrfs_set_header_generation(leaf, trans->transid); 1757 + btrfs_set_header_owner(leaf, root->root_key.objectid); 1758 + write_extent_buffer(leaf, root->fs_info->fsid, 1759 + (unsigned long)btrfs_header_fsid(leaf), 1760 + BTRFS_FSID_SIZE); 1761 + btrfs_mark_buffer_dirty(leaf); 1851 1762 1852 1763 inode_item = &root_item.inode; 1853 1764 memset(inode_item, 0, sizeof(*inode_item)); 1854 - btrfs_set_inode_generation(inode_item, 1); 1855 - btrfs_set_inode_size(inode_item, 3); 1856 - btrfs_set_inode_nlink(inode_item, 1); 1857 - btrfs_set_inode_nblocks(inode_item, 1); 1858 - btrfs_set_inode_mode(inode_item, S_IFDIR | 0755); 1765 + inode_item->generation = cpu_to_le64(1); 1766 + inode_item->size = cpu_to_le64(3); 1767 + inode_item->nlink = cpu_to_le32(1); 1768 + inode_item->nblocks = cpu_to_le64(1); 1769 + inode_item->mode = cpu_to_le32(S_IFDIR | 0755); 1859 1770 1860 - btrfs_set_root_blocknr(&root_item, bh_blocknr(subvol)); 1771 + btrfs_set_root_blocknr(&root_item, extent_buffer_blocknr(leaf)); 1861 1772 btrfs_set_root_refs(&root_item, 1); 1862 - btrfs_set_root_blocks_used(&root_item, 0); 1773 + btrfs_set_root_used(&root_item, 0); 1774 + 1863 1775 memset(&root_item.drop_progress, 0, sizeof(root_item.drop_progress)); 1864 1776 root_item.drop_level = 0; 1865 - brelse(subvol); 1866 - subvol = NULL; 1777 + 1778 + free_extent_buffer(leaf); 1779 + leaf = NULL; 1867 1780 1868 1781 ret = btrfs_find_free_objectid(trans, root->fs_info->tree_root, 1869 1782 0, &objectid); ··· 1877 1784 1878 1785 key.objectid = objectid; 1879 1786 key.offset = 1; 1880 - key.flags = 0; 1881 1787 btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); 1882 1788 ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key, 1883 1789 &root_item); ··· 1937 1845 struct btrfs_trans_handle *trans; 1938 1846 struct btrfs_key key; 1939 1847 struct btrfs_root_item new_root_item; 1940 - struct buffer_head *tmp; 1848 + struct extent_buffer *tmp; 1941 1849 int ret; 1942 1850 int err; 1943 1851 u64 objectid; ··· 1968 1876 1969 1877 key.objectid = objectid; 1970 1878 key.offset = 1; 1971 - key.flags = 0; 1972 1879 btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); 1880 + 1973 1881 btrfs_cow_block(trans, root, root->node, NULL, 0, &tmp); 1974 - btrfs_set_root_blocknr(&new_root_item, bh_blocknr(root->node)); 1882 + btrfs_set_root_blocknr(&new_root_item, 1883 + extent_buffer_blocknr(root->node)); 1975 1884 1976 1885 ret = btrfs_insert_root(trans, root->fs_info->tree_root, &key, 1977 1886 &new_root_item); ··· 1997 1904 fail: 1998 1905 nr = trans->blocks_used; 1999 1906 err = btrfs_commit_transaction(trans, root); 1907 + 2000 1908 if (err && !ret) 2001 1909 ret = err; 1910 + 2002 1911 mutex_unlock(&root->fs_info->fs_mutex); 2003 1912 up_write(&root->snap_sem); 2004 1913 btrfs_btree_balance_dirty(root, nr); ··· 2081 1986 2082 1987 if (copy_from_user(&vol_args, arg, sizeof(vol_args))) 2083 1988 return -EFAULT; 2084 - 1989 + 2085 1990 namelen = strlen(vol_args.name); 2086 1991 if (namelen > BTRFS_VOL_NAME_MAX) 2087 1992 return -EINVAL; ··· 2259 2164 new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) { 2260 2165 return -ENOTEMPTY; 2261 2166 } 2167 + 2262 2168 mutex_lock(&root->fs_info->fs_mutex); 2263 2169 trans = btrfs_start_transaction(root, 1); 2170 + 2264 2171 btrfs_set_trans_block_group(trans, new_dir); 2265 2172 path = btrfs_alloc_path(); 2266 2173 if (!path) { ··· 2274 2177 old_dir->i_ctime = old_dir->i_mtime = ctime; 2275 2178 new_dir->i_ctime = new_dir->i_mtime = ctime; 2276 2179 old_inode->i_ctime = ctime; 2180 + 2277 2181 if (S_ISDIR(old_inode->i_mode) && old_dir != new_dir) { 2278 2182 struct btrfs_key *location = &BTRFS_I(new_dir)->location; 2279 - u64 old_parent_oid; 2183 + struct btrfs_key old_parent_key; 2280 2184 di = btrfs_lookup_dir_item(trans, root, path, old_inode->i_ino, 2281 2185 "..", 2, -1); 2282 2186 if (IS_ERR(di)) { ··· 2288 2190 ret = -ENOENT; 2289 2191 goto out_fail; 2290 2192 } 2291 - old_parent_oid = btrfs_disk_key_objectid(&di->location); 2193 + btrfs_dir_item_key_to_cpu(path->nodes[0], di, &old_parent_key); 2292 2194 ret = btrfs_del_item(trans, root, path); 2293 2195 if (ret) { 2294 2196 goto out_fail; ··· 2297 2199 2298 2200 di = btrfs_lookup_dir_index_item(trans, root, path, 2299 2201 old_inode->i_ino, 2300 - old_parent_oid, 2202 + old_parent_key.objectid, 2301 2203 "..", 2, -1); 2302 2204 if (IS_ERR(di)) { 2303 2205 ret = PTR_ERR(di); ··· 2355 2257 u64 objectid; 2356 2258 int name_len; 2357 2259 int datasize; 2358 - char *ptr; 2260 + unsigned long ptr; 2359 2261 struct btrfs_file_extent_item *ei; 2262 + struct extent_buffer *leaf; 2360 2263 unsigned long nr; 2361 2264 2362 2265 name_len = strlen(symname) + 1; ··· 2401 2302 BUG_ON(!path); 2402 2303 key.objectid = inode->i_ino; 2403 2304 key.offset = 0; 2404 - key.flags = 0; 2405 2305 btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); 2406 2306 datasize = btrfs_file_extent_calc_inline_size(name_len); 2407 2307 err = btrfs_insert_empty_item(trans, root, path, &key, ··· 2409 2311 drop_inode = 1; 2410 2312 goto out_unlock; 2411 2313 } 2412 - ei = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 2413 - path->slots[0], struct btrfs_file_extent_item); 2414 - btrfs_set_file_extent_generation(ei, trans->transid); 2415 - btrfs_set_file_extent_type(ei, 2314 + leaf = path->nodes[0]; 2315 + ei = btrfs_item_ptr(leaf, path->slots[0], 2316 + struct btrfs_file_extent_item); 2317 + btrfs_set_file_extent_generation(leaf, ei, trans->transid); 2318 + btrfs_set_file_extent_type(leaf, ei, 2416 2319 BTRFS_FILE_EXTENT_INLINE); 2417 2320 ptr = btrfs_file_extent_inline_start(ei); 2418 - btrfs_memcpy(root, path->nodes[0]->b_data, 2419 - ptr, symname, name_len); 2420 - btrfs_mark_buffer_dirty(path->nodes[0]); 2321 + write_extent_buffer(leaf, symname, ptr, name_len); 2322 + btrfs_mark_buffer_dirty(leaf); 2421 2323 btrfs_free_path(path); 2324 + 2422 2325 inode->i_op = &btrfs_symlink_inode_operations; 2423 2326 inode->i_mapping->a_ops = &btrfs_symlink_aops; 2424 2327 inode->i_size = name_len - 1;
+45 -51
fs/btrfs/print-tree.c
··· 20 20 #include "disk-io.h" 21 21 #include "print-tree.h" 22 22 23 - void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l) 23 + void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) 24 24 { 25 25 int i; 26 - u32 nr = btrfs_header_nritems(&l->header); 26 + u32 nr = btrfs_header_nritems(l); 27 27 struct btrfs_item *item; 28 28 struct btrfs_extent_item *ei; 29 29 struct btrfs_root_item *ri; ··· 31 31 struct btrfs_inode_item *ii; 32 32 struct btrfs_block_group_item *bi; 33 33 struct btrfs_file_extent_item *fi; 34 + struct btrfs_key key; 35 + struct btrfs_key found_key; 34 36 u32 type; 35 37 36 38 printk("leaf %llu total ptrs %d free space %d\n", 37 - (unsigned long long)btrfs_header_blocknr(&l->header), nr, 39 + (unsigned long long)btrfs_header_blocknr(l), nr, 38 40 btrfs_leaf_free_space(root, l)); 39 41 for (i = 0 ; i < nr ; i++) { 40 - item = l->items + i; 41 - type = btrfs_disk_key_type(&item->key); 42 + item = btrfs_item_nr(l, i); 43 + btrfs_item_key_to_cpu(l, &key, i); 44 + type = btrfs_key_type(&key); 42 45 printk("\titem %d key (%llu %x %llu) itemoff %d itemsize %d\n", 43 46 i, 44 - (unsigned long long)btrfs_disk_key_objectid(&item->key), 45 - btrfs_disk_key_flags(&item->key), 46 - (unsigned long long)btrfs_disk_key_offset(&item->key), 47 - btrfs_item_offset(item), 48 - btrfs_item_size(item)); 47 + (unsigned long long)key.objectid, type, 48 + (unsigned long long)key.offset, 49 + btrfs_item_offset(l, item), btrfs_item_size(l, item)); 49 50 switch (type) { 50 51 case BTRFS_INODE_ITEM_KEY: 51 52 ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); 52 53 printk("\t\tinode generation %llu size %llu mode %o\n", 53 - (unsigned long long)btrfs_inode_generation(ii), 54 - (unsigned long long)btrfs_inode_size(ii), 55 - btrfs_inode_mode(ii)); 54 + (unsigned long long)btrfs_inode_generation(l, ii), 55 + (unsigned long long)btrfs_inode_size(l, ii), 56 + btrfs_inode_mode(l, ii)); 56 57 break; 57 58 case BTRFS_DIR_ITEM_KEY: 58 59 di = btrfs_item_ptr(l, i, struct btrfs_dir_item); 60 + btrfs_dir_item_key_to_cpu(l, di, &found_key); 59 61 printk("\t\tdir oid %llu flags %u type %u\n", 60 - (unsigned long long)btrfs_disk_key_objectid( 61 - &di->location), 62 - btrfs_dir_flags(di), 63 - btrfs_dir_type(di)); 64 - printk("\t\tname %.*s\n", 65 - btrfs_dir_name_len(di),(char *)(di + 1)); 62 + (unsigned long long)found_key.objectid, 63 + btrfs_dir_flags(l, di), 64 + btrfs_dir_type(l, di)); 66 65 break; 67 66 case BTRFS_ROOT_ITEM_KEY: 68 67 ri = btrfs_item_ptr(l, i, struct btrfs_root_item); 69 68 printk("\t\troot data blocknr %llu refs %u\n", 70 - (unsigned long long)btrfs_root_blocknr(ri), 71 - btrfs_root_refs(ri)); 69 + (unsigned long long)btrfs_disk_root_blocknr(l, ri), 70 + btrfs_disk_root_refs(l, ri)); 72 71 break; 73 72 case BTRFS_EXTENT_ITEM_KEY: 74 73 ei = btrfs_item_ptr(l, i, struct btrfs_extent_item); 75 74 printk("\t\textent data refs %u\n", 76 - btrfs_extent_refs(ei)); 75 + btrfs_extent_refs(l, ei)); 77 76 break; 78 77 79 78 case BTRFS_EXTENT_DATA_KEY: 80 79 fi = btrfs_item_ptr(l, i, 81 80 struct btrfs_file_extent_item); 82 - if (btrfs_file_extent_type(fi) == 81 + if (btrfs_file_extent_type(l, fi) == 83 82 BTRFS_FILE_EXTENT_INLINE) { 84 83 printk("\t\tinline extent data size %u\n", 85 - btrfs_file_extent_inline_len(l->items + i)); 84 + btrfs_file_extent_inline_len(l, item)); 86 85 break; 87 86 } 88 87 printk("\t\textent data disk block %llu nr %llu\n", 89 - (unsigned long long)btrfs_file_extent_disk_blocknr(fi), 90 - (unsigned long long)btrfs_file_extent_disk_num_blocks(fi)); 88 + (unsigned long long)btrfs_file_extent_disk_blocknr(l, fi), 89 + (unsigned long long)btrfs_file_extent_disk_num_blocks(l, fi)); 91 90 printk("\t\textent data offset %llu nr %llu\n", 92 - (unsigned long long)btrfs_file_extent_offset(fi), 93 - (unsigned long long)btrfs_file_extent_num_blocks(fi)); 91 + (unsigned long long)btrfs_file_extent_offset(l, fi), 92 + (unsigned long long)btrfs_file_extent_num_blocks(l, fi)); 94 93 break; 95 94 case BTRFS_BLOCK_GROUP_ITEM_KEY: 96 95 bi = btrfs_item_ptr(l, i, 97 96 struct btrfs_block_group_item); 98 97 printk("\t\tblock group used %llu\n", 99 - (unsigned long long)btrfs_block_group_used(bi)); 100 - break; 101 - case BTRFS_STRING_ITEM_KEY: 102 - printk("\t\titem data %.*s\n", btrfs_item_size(item), 103 - btrfs_leaf_data(l) + btrfs_item_offset(item)); 98 + (unsigned long long)btrfs_disk_block_group_used(l, bi)); 104 99 break; 105 100 }; 106 101 } 107 102 } 108 103 109 - void btrfs_print_tree(struct btrfs_root *root, struct buffer_head *t) 104 + void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *c) 110 105 { 111 106 int i; 112 107 u32 nr; 113 - struct btrfs_node *c; 108 + struct btrfs_key key; 114 109 115 - if (!t) 110 + if (!c) 116 111 return; 117 - c = btrfs_buffer_node(t); 118 - nr = btrfs_header_nritems(&c->header); 112 + nr = btrfs_header_nritems(c); 119 113 if (btrfs_is_leaf(c)) { 120 - btrfs_print_leaf(root, (struct btrfs_leaf *)c); 114 + btrfs_print_leaf(root, c); 121 115 return; 122 116 } 123 117 printk("node %llu level %d total ptrs %d free spc %u\n", 124 - (unsigned long long)btrfs_header_blocknr(&c->header), 125 - btrfs_header_level(&c->header), nr, 118 + (unsigned long long)btrfs_header_blocknr(c), 119 + btrfs_header_level(c), nr, 126 120 (u32)BTRFS_NODEPTRS_PER_BLOCK(root) - nr); 127 121 for (i = 0; i < nr; i++) { 122 + btrfs_node_key_to_cpu(c, &key, i); 128 123 printk("\tkey %d (%llu %u %llu) block %llu\n", 129 124 i, 130 - (unsigned long long)c->ptrs[i].key.objectid, 131 - c->ptrs[i].key.flags, 132 - (unsigned long long)c->ptrs[i].key.offset, 125 + (unsigned long long)key.objectid, 126 + key.type, 127 + (unsigned long long)key.offset, 133 128 (unsigned long long)btrfs_node_blockptr(c, i)); 134 129 } 135 130 for (i = 0; i < nr; i++) { 136 - struct buffer_head *next_buf = read_tree_block(root, 131 + struct extent_buffer *next = read_tree_block(root, 137 132 btrfs_node_blockptr(c, i)); 138 - struct btrfs_node *next = btrfs_buffer_node(next_buf); 139 133 if (btrfs_is_leaf(next) && 140 - btrfs_header_level(&c->header) != 1) 134 + btrfs_header_level(c) != 1) 141 135 BUG(); 142 - if (btrfs_header_level(&next->header) != 143 - btrfs_header_level(&c->header) - 1) 136 + if (btrfs_header_level(next) != 137 + btrfs_header_level(c) - 1) 144 138 BUG(); 145 - btrfs_print_tree(root, next_buf); 146 - btrfs_block_release(root, next_buf); 139 + btrfs_print_tree(root, next); 140 + free_extent_buffer(next); 147 141 } 148 142 } 149 143
+2 -2
fs/btrfs/print-tree.h
··· 18 18 19 19 #ifndef __PRINT_TREE_ 20 20 #define __PRINT_TREE_ 21 - void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l); 22 - void btrfs_print_tree(struct btrfs_root *root, struct buffer_head *t); 21 + void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l); 22 + void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *t); 23 23 #endif
+27 -24
fs/btrfs/root-tree.c
··· 26 26 { 27 27 struct btrfs_path *path; 28 28 struct btrfs_key search_key; 29 - struct btrfs_leaf *l; 29 + struct btrfs_key found_key; 30 + struct extent_buffer *l; 30 31 int ret; 31 32 int slot; 32 33 33 34 search_key.objectid = objectid; 34 - search_key.flags = (u32)-1; 35 + search_key.type = (u8)-1; 35 36 search_key.offset = (u64)-1; 36 37 37 38 path = btrfs_alloc_path(); ··· 40 39 ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); 41 40 if (ret < 0) 42 41 goto out; 42 + 43 43 BUG_ON(ret == 0); 44 - l = btrfs_buffer_leaf(path->nodes[0]); 44 + l = path->nodes[0]; 45 45 BUG_ON(path->slots[0] == 0); 46 46 slot = path->slots[0] - 1; 47 - if (btrfs_disk_key_objectid(&l->items[slot].key) != objectid) { 47 + btrfs_item_key_to_cpu(l, &found_key, slot); 48 + if (found_key.objectid != objectid) { 48 49 ret = 1; 49 50 goto out; 50 51 } 51 - memcpy(item, btrfs_item_ptr(l, slot, struct btrfs_root_item), 52 - sizeof(*item)); 53 - btrfs_disk_key_to_cpu(key, &l->items[slot].key); 52 + read_extent_buffer(l, item, btrfs_item_ptr_offset(l, slot), 53 + sizeof(*item)); 54 + memcpy(key, &found_key, sizeof(found_key)); 54 55 ret = 0; 55 56 out: 56 57 btrfs_release_path(root, path); ··· 65 62 *item) 66 63 { 67 64 struct btrfs_path *path; 68 - struct btrfs_leaf *l; 65 + struct extent_buffer *l; 69 66 int ret; 70 67 int slot; 71 - struct btrfs_root_item *update_item; 68 + unsigned long ptr; 72 69 73 70 path = btrfs_alloc_path(); 74 71 BUG_ON(!path); ··· 76 73 if (ret < 0) 77 74 goto out; 78 75 BUG_ON(ret != 0); 79 - l = btrfs_buffer_leaf(path->nodes[0]); 76 + l = path->nodes[0]; 80 77 slot = path->slots[0]; 81 - update_item = btrfs_item_ptr(l, slot, struct btrfs_root_item); 82 - btrfs_memcpy(root, l, update_item, item, sizeof(*item)); 78 + ptr = btrfs_item_ptr_offset(l, slot); 79 + write_extent_buffer(l, item, ptr, sizeof(*item)); 83 80 btrfs_mark_buffer_dirty(path->nodes[0]); 84 81 out: 85 82 btrfs_release_path(root, path); ··· 106 103 struct btrfs_path *path; 107 104 int ret; 108 105 u32 nritems; 109 - struct btrfs_leaf *leaf; 106 + struct extent_buffer *leaf; 110 107 int slot; 111 108 112 109 key.objectid = objectid; 113 - key.flags = 0; 114 110 btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); 115 111 key.offset = 0; 116 112 path = btrfs_alloc_path(); ··· 119 117 if (ret < 0) 120 118 goto err; 121 119 while(1) { 122 - leaf = btrfs_buffer_leaf(path->nodes[0]); 123 - nritems = btrfs_header_nritems(&leaf->header); 120 + leaf = path->nodes[0]; 121 + nritems = btrfs_header_nritems(leaf); 124 122 slot = path->slots[0]; 125 123 if (slot >= nritems) { 126 124 ret = btrfs_next_leaf(root, path); 127 125 if (ret) 128 126 break; 129 - leaf = btrfs_buffer_leaf(path->nodes[0]); 130 - nritems = btrfs_header_nritems(&leaf->header); 127 + leaf = path->nodes[0]; 128 + nritems = btrfs_header_nritems(leaf); 131 129 slot = path->slots[0]; 132 130 } 133 - item = leaf->items + slot; 134 - btrfs_disk_key_to_cpu(&key, &item->key); 131 + item = btrfs_item_nr(leaf, slot); 132 + btrfs_item_key_to_cpu(leaf, &key, slot); 135 133 if (btrfs_key_type(&key) != BTRFS_ROOT_ITEM_KEY) 136 134 goto next; 137 135 ··· 142 140 break; 143 141 144 142 ri = btrfs_item_ptr(leaf, slot, struct btrfs_root_item); 145 - if (btrfs_root_refs(ri) != 0) 143 + if (btrfs_disk_root_refs(leaf, ri) != 0) 146 144 goto next; 147 145 148 146 dead_root = btrfs_read_fs_root_no_radix(root->fs_info, &key); ··· 172 170 int ret; 173 171 u32 refs; 174 172 struct btrfs_root_item *ri; 173 + struct extent_buffer *leaf; 175 174 176 175 path = btrfs_alloc_path(); 177 176 BUG_ON(!path); ··· 180 177 if (ret < 0) 181 178 goto out; 182 179 BUG_ON(ret != 0); 183 - ri = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), 184 - path->slots[0], struct btrfs_root_item); 180 + leaf = path->nodes[0]; 181 + ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); 185 182 186 - refs = btrfs_root_refs(ri); 183 + refs = btrfs_disk_root_refs(leaf, ri); 187 184 BUG_ON(refs != 0); 188 185 ret = btrfs_del_item(trans, root, path); 189 186 out:
+4 -3
fs/btrfs/super.c
··· 41 41 #include "ioctl.h" 42 42 #include "print-tree.h" 43 43 44 - #define BTRFS_SUPER_MAGIC 0x9123682E 44 + #define BTRFS_SUPER_MAGIC 0x9123683E 45 45 46 46 static struct super_operations btrfs_super_ops; 47 47 ··· 115 115 return -EIO; 116 116 } 117 117 sb->s_fs_info = tree_root; 118 - disk_super = tree_root->fs_info->disk_super; 118 + disk_super = &tree_root->fs_info->super_copy; 119 119 inode = btrfs_iget_locked(sb, btrfs_super_root_dir(disk_super), 120 120 tree_root); 121 121 bi = BTRFS_I(inode); 122 122 bi->location.objectid = inode->i_ino; 123 123 bi->location.offset = 0; 124 - bi->location.flags = 0; 125 124 bi->root = tree_root; 126 125 127 126 btrfs_set_key_type(&bi->location, BTRFS_INODE_ITEM_KEY); ··· 280 281 error_bdev: 281 282 close_bdev_excl(bdev); 282 283 error: 284 + printk("get_sb failed\n"); 283 285 return error; 284 286 } 285 287 /* end copy & paste */ ··· 295 295 ret = btrfs_get_sb_bdev(fs_type, flags, dev_name, data, 296 296 btrfs_fill_super, mnt, 297 297 subvol_name ? subvol_name : "default"); 298 + printk("btrfs_get_sb returns %d\n", ret); 298 299 return ret; 299 300 } 300 301
+5 -5
fs/btrfs/sysfs.c
··· 31 31 static ssize_t root_blocks_used_show(struct btrfs_root *root, char *buf) 32 32 { 33 33 return snprintf(buf, PAGE_SIZE, "%llu\n", 34 - (unsigned long long)btrfs_root_blocks_used(&root->root_item)); 34 + (unsigned long long)btrfs_root_used(&root->root_item)); 35 35 } 36 36 37 37 static ssize_t root_block_limit_show(struct btrfs_root *root, char *buf) 38 38 { 39 39 return snprintf(buf, PAGE_SIZE, "%llu\n", 40 - (unsigned long long)btrfs_root_block_limit(&root->root_item)); 40 + (unsigned long long)btrfs_root_limit(&root->root_item)); 41 41 } 42 42 43 43 static ssize_t super_blocks_used_show(struct btrfs_fs_info *fs, char *buf) 44 44 { 45 45 return snprintf(buf, PAGE_SIZE, "%llu\n", 46 - (unsigned long long)btrfs_super_blocks_used(fs->disk_super)); 46 + (unsigned long long)btrfs_super_blocks_used(&fs->super_copy)); 47 47 } 48 48 49 49 static ssize_t super_total_blocks_show(struct btrfs_fs_info *fs, char *buf) 50 50 { 51 51 return snprintf(buf, PAGE_SIZE, "%llu\n", 52 - (unsigned long long)btrfs_super_total_blocks(fs->disk_super)); 52 + (unsigned long long)btrfs_super_total_blocks(&fs->super_copy)); 53 53 } 54 54 55 55 static ssize_t super_blocksize_show(struct btrfs_fs_info *fs, char *buf) 56 56 { 57 57 return snprintf(buf, PAGE_SIZE, "%llu\n", 58 - (unsigned long long)btrfs_super_blocksize(fs->disk_super)); 58 + (unsigned long long)btrfs_super_sectorsize(&fs->super_copy)); 59 59 } 60 60 61 61 /* this is for root attrs (subvols/snapshots) */
+34 -27
fs/btrfs/transaction.c
··· 19 19 #include <linux/fs.h> 20 20 #include <linux/sched.h> 21 21 #include <linux/writeback.h> 22 + #include <linux/pagemap.h> 22 23 #include "ctree.h" 23 24 #include "disk-io.h" 24 25 #include "transaction.h" ··· 67 66 cur_trans->commit_done = 0; 68 67 cur_trans->start_time = get_seconds(); 69 68 list_add_tail(&cur_trans->list, &root->fs_info->trans_list); 70 - init_bit_radix(&cur_trans->dirty_pages); 69 + extent_map_tree_init(&cur_trans->dirty_pages, 70 + root->fs_info->btree_inode->i_mapping, 71 + GFP_NOFS); 71 72 } else { 72 73 cur_trans->num_writers++; 73 74 cur_trans->num_joined++; ··· 91 88 (unsigned long)root->root_key.objectid, 92 89 BTRFS_ROOT_DEFRAG_TAG); 93 90 root->commit_root = root->node; 94 - get_bh(root->node); 91 + extent_buffer_get(root->node); 95 92 } else { 96 93 WARN_ON(1); 97 94 } ··· 147 144 int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans, 148 145 struct btrfs_root *root) 149 146 { 150 - unsigned long gang[16]; 151 147 int ret; 152 - int i; 153 148 int err; 154 149 int werr = 0; 150 + struct extent_map_tree *dirty_pages; 155 151 struct page *page; 156 - struct radix_tree_root *dirty_pages; 157 152 struct inode *btree_inode = root->fs_info->btree_inode; 153 + u64 start; 154 + u64 end; 155 + unsigned long index; 158 156 159 157 if (!trans || !trans->transaction) { 160 158 return filemap_write_and_wait(btree_inode->i_mapping); 161 159 } 162 160 dirty_pages = &trans->transaction->dirty_pages; 163 161 while(1) { 164 - ret = find_first_radix_bit(dirty_pages, gang, 165 - 0, ARRAY_SIZE(gang)); 166 - if (!ret) 162 + ret = find_first_extent_bit(dirty_pages, 0, &start, &end, 163 + EXTENT_DIRTY); 164 + if (ret) 167 165 break; 168 - for (i = 0; i < ret; i++) { 169 - /* FIXME EIO */ 170 - clear_radix_bit(dirty_pages, gang[i]); 171 - page = find_lock_page(btree_inode->i_mapping, 172 - gang[i]); 166 + clear_extent_dirty(dirty_pages, start, end, GFP_NOFS); 167 + while(start <= end) { 168 + index = start >> PAGE_CACHE_SHIFT; 169 + start = (index + 1) << PAGE_CACHE_SHIFT; 170 + page = find_lock_page(btree_inode->i_mapping, index); 173 171 if (!page) 174 172 continue; 175 173 if (PageWriteback(page)) { ··· 206 202 btrfs_write_dirty_block_groups(trans, extent_root); 207 203 while(1) { 208 204 old_extent_block = btrfs_root_blocknr(&extent_root->root_item); 209 - if (old_extent_block == bh_blocknr(extent_root->node)) 205 + if (old_extent_block == 206 + extent_buffer_blocknr(extent_root->node)) 210 207 break; 211 208 btrfs_set_root_blocknr(&extent_root->root_item, 212 - bh_blocknr(extent_root->node)); 209 + extent_buffer_blocknr(extent_root->node)); 213 210 ret = btrfs_update_root(trans, tree_root, 214 211 &extent_root->root_key, 215 212 &extent_root->root_item); ··· 284 279 (unsigned long)root->root_key.objectid, 285 280 BTRFS_ROOT_TRANS_TAG); 286 281 if (root->commit_root == root->node) { 287 - WARN_ON(bh_blocknr(root->node) != 282 + WARN_ON(extent_buffer_blocknr(root->node) != 288 283 btrfs_root_blocknr(&root->root_item)); 289 - brelse(root->commit_root); 284 + free_extent_buffer(root->commit_root); 290 285 root->commit_root = NULL; 291 286 292 287 /* make sure to update the root on disk ··· 315 310 316 311 root->root_key.offset = root->fs_info->generation; 317 312 btrfs_set_root_blocknr(&root->root_item, 318 - bh_blocknr(root->node)); 313 + extent_buffer_blocknr(root->node)); 319 314 err = btrfs_insert_root(trans, root->fs_info->tree_root, 320 315 &root->root_key, 321 316 &root->root_item); ··· 394 389 for (i = 0; i < ret; i++) { 395 390 root = gang[i]; 396 391 last = root->root_key.objectid + 1; 397 - btrfs_defrag_root(root, 1); 392 + // btrfs_defrag_root(root, 1); 398 393 } 399 394 } 400 - btrfs_defrag_root(info->extent_root, 1); 395 + // btrfs_defrag_root(info->extent_root, 1); 401 396 return err; 402 397 } 403 398 ··· 419 414 dirty = list_entry(list->next, struct dirty_root, list); 420 415 list_del_init(&dirty->list); 421 416 422 - num_blocks = btrfs_root_blocks_used(&dirty->root->root_item); 417 + num_blocks = btrfs_root_used(&dirty->root->root_item); 423 418 root = dirty->latest_root; 424 419 425 420 while(1) { ··· 446 441 } 447 442 BUG_ON(ret); 448 443 449 - num_blocks -= btrfs_root_blocks_used(&dirty->root->root_item); 450 - blocks_used = btrfs_root_blocks_used(&root->root_item); 444 + num_blocks -= btrfs_root_used(&dirty->root->root_item); 445 + blocks_used = btrfs_root_used(&root->root_item); 451 446 if (num_blocks) { 452 447 record_root_in_trans(root); 453 - btrfs_set_root_blocks_used(&root->root_item, 448 + btrfs_set_root_used(&root->root_item, 454 449 blocks_used - num_blocks); 455 450 } 456 451 ret = btrfs_del_root(trans, tree_root, &dirty->root->root_key); ··· 558 553 btrfs_set_super_generation(&root->fs_info->super_copy, 559 554 cur_trans->transid); 560 555 btrfs_set_super_root(&root->fs_info->super_copy, 561 - bh_blocknr(root->fs_info->tree_root->node)); 562 - memcpy(root->fs_info->disk_super, &root->fs_info->super_copy, 563 - sizeof(root->fs_info->super_copy)); 556 + extent_buffer_blocknr(root->fs_info->tree_root->node)); 557 + 558 + write_extent_buffer(root->fs_info->sb_buffer, 559 + &root->fs_info->super_copy, 0, 560 + sizeof(root->fs_info->super_copy)); 564 561 565 562 btrfs_copy_pinned(root, &pinned_copy); 566 563
+3 -2
fs/btrfs/transaction.h
··· 28 28 int use_count; 29 29 int commit_done; 30 30 struct list_head list; 31 - struct radix_tree_root dirty_pages; 31 + struct extent_map_tree dirty_pages; 32 32 unsigned long start_time; 33 33 wait_queue_head_t writer_wait; 34 34 wait_queue_head_t commit_wait; ··· 83 83 int btrfs_defrag_dirty_roots(struct btrfs_fs_info *info); 84 84 int btrfs_defrag_root(struct btrfs_root *root, int cacheonly); 85 85 int btrfs_clean_old_snapshots(struct btrfs_root *root); 86 - 86 + int btrfs_commit_transaction(struct btrfs_trans_handle *trans, 87 + struct btrfs_root *root); 87 88 #endif
+32 -26
fs/btrfs/tree-defrag.c
··· 23 23 #include "transaction.h" 24 24 25 25 static void reada_defrag(struct btrfs_root *root, 26 - struct btrfs_node *node) 26 + struct extent_buffer *node) 27 27 { 28 28 int i; 29 29 u32 nritems; 30 30 u64 blocknr; 31 31 int ret; 32 32 33 - nritems = btrfs_header_nritems(&node->header); 33 + nritems = btrfs_header_nritems(node); 34 34 for (i = 0; i < nritems; i++) { 35 35 blocknr = btrfs_node_blockptr(node, i); 36 36 ret = readahead_tree_block(root, blocknr); ··· 44 44 struct btrfs_path *path, int *level, 45 45 int cache_only, u64 *last_ret) 46 46 { 47 - struct buffer_head *next; 48 - struct buffer_head *cur; 47 + struct extent_buffer *next; 48 + struct extent_buffer *cur; 49 49 u64 blocknr; 50 50 int ret = 0; 51 51 int is_extent = 0; ··· 62 62 cur = path->nodes[*level]; 63 63 64 64 if (!cache_only && *level > 1 && path->slots[*level] == 0) 65 - reada_defrag(root, btrfs_buffer_node(cur)); 65 + reada_defrag(root, cur); 66 66 67 - if (btrfs_header_level(btrfs_buffer_header(cur)) != *level) 67 + if (btrfs_header_level(cur) != *level) 68 68 WARN_ON(1); 69 69 70 70 if (path->slots[*level] >= 71 - btrfs_header_nritems(btrfs_buffer_header(cur))) 71 + btrfs_header_nritems(cur)) 72 72 break; 73 73 74 74 if (*level == 1) { ··· 80 80 81 81 break; 82 82 } 83 - blocknr = btrfs_node_blockptr(btrfs_buffer_node(cur), 84 - path->slots[*level]); 83 + blocknr = btrfs_node_blockptr(cur, path->slots[*level]); 85 84 86 85 if (cache_only) { 87 86 next = btrfs_find_tree_block(root, blocknr); 88 - if (!next || !buffer_uptodate(next) || 89 - buffer_locked(next) || !buffer_defrag(next)) { 90 - brelse(next); 87 + /* FIXME, test for defrag */ 88 + if (!next || !btrfs_buffer_uptodate(next)) { 89 + free_extent_buffer(next); 91 90 path->slots[*level]++; 92 91 continue; 93 92 } ··· 105 106 106 107 WARN_ON(*level <= 0); 107 108 if (path->nodes[*level-1]) 108 - btrfs_block_release(root, path->nodes[*level-1]); 109 + free_extent_buffer(path->nodes[*level-1]); 109 110 path->nodes[*level-1] = next; 110 - *level = btrfs_header_level(btrfs_buffer_header(next)); 111 + *level = btrfs_header_level(next); 111 112 path->slots[*level] = 0; 112 113 } 113 114 WARN_ON(*level < 0); 114 115 WARN_ON(*level >= BTRFS_MAX_LEVEL); 116 + #if 0 115 117 clear_buffer_defrag(path->nodes[*level]); 116 118 clear_buffer_defrag_done(path->nodes[*level]); 117 - btrfs_block_release(root, path->nodes[*level]); 119 + #endif 120 + free_extent_buffer(path->nodes[*level]); 118 121 path->nodes[*level] = NULL; 119 122 *level += 1; 120 123 WARN_ON(ret); ··· 130 129 { 131 130 int i; 132 131 int slot; 133 - struct btrfs_node *node; 132 + struct extent_buffer *node; 134 133 135 134 for(i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) { 136 135 slot = path->slots[i]; 137 - if (slot < btrfs_header_nritems( 138 - btrfs_buffer_header(path->nodes[i])) - 1) { 136 + if (slot < btrfs_header_nritems(path->nodes[i]) - 1) { 139 137 path->slots[i]++; 140 138 *level = i; 141 - node = btrfs_buffer_node(path->nodes[i]); 139 + node = path->nodes[i]; 142 140 WARN_ON(i == 0); 143 - btrfs_disk_key_to_cpu(&root->defrag_progress, 144 - &node->ptrs[path->slots[i]].key); 141 + btrfs_node_key_to_cpu(node, &root->defrag_progress, 142 + path->slots[i]); 145 143 root->defrag_level = i; 146 144 return 0; 147 145 } else { 146 + /* 148 147 clear_buffer_defrag(path->nodes[*level]); 149 148 clear_buffer_defrag_done(path->nodes[*level]); 150 - btrfs_block_release(root, path->nodes[*level]); 149 + */ 150 + free_extent_buffer(path->nodes[*level]); 151 151 path->nodes[*level] = NULL; 152 152 *level = i + 1; 153 153 } ··· 160 158 struct btrfs_root *root, int cache_only) 161 159 { 162 160 struct btrfs_path *path = NULL; 163 - struct buffer_head *tmp; 161 + struct extent_buffer *tmp; 164 162 int ret = 0; 165 163 int wret; 166 164 int level; ··· 174 172 175 173 if (root->ref_cows == 0 && !is_extent) 176 174 goto out; 175 + 177 176 path = btrfs_alloc_path(); 178 177 if (!path) 179 178 return -ENOMEM; 180 179 181 - level = btrfs_header_level(btrfs_buffer_header(root->node)); 180 + level = btrfs_header_level(root->node); 182 181 orig_level = level; 183 182 if (level == 0) { 184 183 goto out; 185 184 } 186 185 if (root->defrag_progress.objectid == 0) { 187 - get_bh(root->node); 186 + extent_buffer_get(root->node); 188 187 ret = btrfs_cow_block(trans, root, root->node, NULL, 0, &tmp); 189 188 BUG_ON(ret); 190 189 ret = btrfs_realloc_node(trans, root, root->node, cache_only, ··· 203 200 204 201 if (is_extent) 205 202 btrfs_extent_post_op(trans, root); 203 + 206 204 if (wret < 0) { 207 205 ret = wret; 208 206 goto out; 209 207 } 208 + 210 209 while(level > 0 && !path->nodes[level]) 211 210 level--; 211 + 212 212 if (!path->nodes[level]) { 213 213 ret = 0; 214 214 goto out; ··· 236 230 } 237 231 for (i = 0; i <= orig_level; i++) { 238 232 if (path->nodes[i]) { 239 - btrfs_block_release(root, path->nodes[i]); 233 + free_extent_buffer(path->nodes[i]); 240 234 path->nodes[i] = 0; 241 235 } 242 236 }