aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/ctree.c24
-rw-r--r--fs/btrfs/ctree.h25
-rw-r--r--fs/btrfs/extent-tree.c185
-rw-r--r--fs/btrfs/file.c6
-rw-r--r--fs/btrfs/inode.c6
-rw-r--r--fs/btrfs/ioctl.c2
-rw-r--r--fs/btrfs/print-tree.c3
-rw-r--r--fs/btrfs/tree-log.c8
8 files changed, 115 insertions, 144 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 2eab4643dcbc..9caeb377de63 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -254,8 +254,7 @@ int noinline __btrfs_cow_block(struct btrfs_trans_handle *trans,
254 254
255 ret = btrfs_alloc_reserved_extent(trans, root, parent_start, 255 ret = btrfs_alloc_reserved_extent(trans, root, parent_start,
256 root->root_key.objectid, 256 root->root_key.objectid,
257 trans->transid, level, 0, 257 trans->transid, level, &ins);
258 &ins);
259 BUG_ON(ret); 258 BUG_ON(ret);
260 cow = btrfs_init_new_buffer(trans, root, prealloc_dest, 259 cow = btrfs_init_new_buffer(trans, root, prealloc_dest,
261 buf->len); 260 buf->len);
@@ -333,7 +332,7 @@ int noinline __btrfs_cow_block(struct btrfs_trans_handle *trans,
333 buf->len, buf->start, 332 buf->len, buf->start,
334 root->root_key.objectid, 333 root->root_key.objectid,
335 btrfs_header_generation(buf), 334 btrfs_header_generation(buf),
336 0, 0, 1); 335 level, 1);
337 } 336 }
338 free_extent_buffer(buf); 337 free_extent_buffer(buf);
339 add_root_to_dirty_list(root); 338 add_root_to_dirty_list(root);
@@ -347,7 +346,7 @@ int noinline __btrfs_cow_block(struct btrfs_trans_handle *trans,
347 WARN_ON(btrfs_header_generation(parent) != trans->transid); 346 WARN_ON(btrfs_header_generation(parent) != trans->transid);
348 btrfs_free_extent(trans, root, buf->start, buf->len, 347 btrfs_free_extent(trans, root, buf->start, buf->len,
349 parent_start, btrfs_header_owner(parent), 348 parent_start, btrfs_header_owner(parent),
350 btrfs_header_generation(parent), 0, 0, 1); 349 btrfs_header_generation(parent), level, 1);
351 } 350 }
352 if (unlock_orig) 351 if (unlock_orig)
353 btrfs_tree_unlock(buf); 352 btrfs_tree_unlock(buf);
@@ -927,7 +926,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
927 ret = btrfs_update_extent_ref(trans, root, child->start, 926 ret = btrfs_update_extent_ref(trans, root, child->start,
928 mid->start, child->start, 927 mid->start, child->start,
929 root->root_key.objectid, 928 root->root_key.objectid,
930 trans->transid, level - 1, 0); 929 trans->transid, level - 1);
931 BUG_ON(ret); 930 BUG_ON(ret);
932 931
933 add_root_to_dirty_list(root); 932 add_root_to_dirty_list(root);
@@ -940,7 +939,8 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
940 free_extent_buffer(mid); 939 free_extent_buffer(mid);
941 ret = btrfs_free_extent(trans, root, mid->start, mid->len, 940 ret = btrfs_free_extent(trans, root, mid->start, mid->len,
942 mid->start, root->root_key.objectid, 941 mid->start, root->root_key.objectid,
943 btrfs_header_generation(mid), 0, 0, 1); 942 btrfs_header_generation(mid),
943 level, 1);
944 /* once for the root ptr */ 944 /* once for the root ptr */
945 free_extent_buffer(mid); 945 free_extent_buffer(mid);
946 return ret; 946 return ret;
@@ -1006,7 +1006,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
1006 wret = btrfs_free_extent(trans, root, bytenr, 1006 wret = btrfs_free_extent(trans, root, bytenr,
1007 blocksize, parent->start, 1007 blocksize, parent->start,
1008 btrfs_header_owner(parent), 1008 btrfs_header_owner(parent),
1009 generation, 0, 0, 1); 1009 generation, level, 1);
1010 if (wret) 1010 if (wret)
1011 ret = wret; 1011 ret = wret;
1012 } else { 1012 } else {
@@ -1055,7 +1055,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
1055 wret = btrfs_free_extent(trans, root, bytenr, blocksize, 1055 wret = btrfs_free_extent(trans, root, bytenr, blocksize,
1056 parent->start, 1056 parent->start,
1057 btrfs_header_owner(parent), 1057 btrfs_header_owner(parent),
1058 root_gen, 0, 0, 1); 1058 root_gen, level, 1);
1059 if (wret) 1059 if (wret)
1060 ret = wret; 1060 ret = wret;
1061 } else { 1061 } else {
@@ -1691,13 +1691,13 @@ next_level:
1691 blocksize, parent->start, 1691 blocksize, parent->start,
1692 btrfs_header_owner(parent), 1692 btrfs_header_owner(parent),
1693 btrfs_header_generation(parent), 1693 btrfs_header_generation(parent),
1694 level - 1, 0); 1694 level - 1);
1695 BUG_ON(ret); 1695 BUG_ON(ret);
1696 ret = btrfs_free_extent(trans, root, bytenr, 1696 ret = btrfs_free_extent(trans, root, bytenr,
1697 blocksize, parent->start, 1697 blocksize, parent->start,
1698 btrfs_header_owner(parent), 1698 btrfs_header_owner(parent),
1699 btrfs_header_generation(parent), 1699 btrfs_header_generation(parent),
1700 level - 1, 0, 1); 1700 level - 1, 1);
1701 BUG_ON(ret); 1701 BUG_ON(ret);
1702 1702
1703 if (generation == trans->transid) { 1703 if (generation == trans->transid) {
@@ -1973,7 +1973,7 @@ static int noinline insert_new_root(struct btrfs_trans_handle *trans,
1973 ret = btrfs_update_extent_ref(trans, root, lower->start, 1973 ret = btrfs_update_extent_ref(trans, root, lower->start,
1974 lower->start, c->start, 1974 lower->start, c->start,
1975 root->root_key.objectid, 1975 root->root_key.objectid,
1976 trans->transid, level - 1, 0); 1976 trans->transid, level - 1);
1977 BUG_ON(ret); 1977 BUG_ON(ret);
1978 1978
1979 /* the super has an extra ref to root->node */ 1979 /* the super has an extra ref to root->node */
@@ -3213,7 +3213,7 @@ noinline int btrfs_del_leaf(struct btrfs_trans_handle *trans,
3213 btrfs_level_size(root, 0), 3213 btrfs_level_size(root, 0),
3214 path->nodes[1]->start, 3214 path->nodes[1]->start,
3215 btrfs_header_owner(path->nodes[1]), 3215 btrfs_header_owner(path->nodes[1]),
3216 root_gen, 0, 0, 1); 3216 root_gen, 0, 1);
3217 return ret; 3217 return ret;
3218} 3218}
3219/* 3219/*
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 50fbcc9ec45f..a37fd783407c 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -374,7 +374,6 @@ struct btrfs_extent_ref {
374 __le64 root; 374 __le64 root;
375 __le64 generation; 375 __le64 generation;
376 __le64 objectid; 376 __le64 objectid;
377 __le64 offset;
378 __le32 num_refs; 377 __le32 num_refs;
379} __attribute__ ((__packed__)); 378} __attribute__ ((__packed__));
380 379
@@ -1082,7 +1081,6 @@ static inline u8 *btrfs_dev_extent_chunk_tree_uuid(struct btrfs_dev_extent *dev)
1082BTRFS_SETGET_FUNCS(ref_root, struct btrfs_extent_ref, root, 64); 1081BTRFS_SETGET_FUNCS(ref_root, struct btrfs_extent_ref, root, 64);
1083BTRFS_SETGET_FUNCS(ref_generation, struct btrfs_extent_ref, generation, 64); 1082BTRFS_SETGET_FUNCS(ref_generation, struct btrfs_extent_ref, generation, 64);
1084BTRFS_SETGET_FUNCS(ref_objectid, struct btrfs_extent_ref, objectid, 64); 1083BTRFS_SETGET_FUNCS(ref_objectid, struct btrfs_extent_ref, objectid, 64);
1085BTRFS_SETGET_FUNCS(ref_offset, struct btrfs_extent_ref, offset, 64);
1086BTRFS_SETGET_FUNCS(ref_num_refs, struct btrfs_extent_ref, num_refs, 32); 1084BTRFS_SETGET_FUNCS(ref_num_refs, struct btrfs_extent_ref, num_refs, 32);
1087 1085
1088BTRFS_SETGET_STACK_FUNCS(stack_ref_root, struct btrfs_extent_ref, root, 64); 1086BTRFS_SETGET_STACK_FUNCS(stack_ref_root, struct btrfs_extent_ref, root, 64);
@@ -1090,8 +1088,6 @@ BTRFS_SETGET_STACK_FUNCS(stack_ref_generation, struct btrfs_extent_ref,
1090 generation, 64); 1088 generation, 64);
1091BTRFS_SETGET_STACK_FUNCS(stack_ref_objectid, struct btrfs_extent_ref, 1089BTRFS_SETGET_STACK_FUNCS(stack_ref_objectid, struct btrfs_extent_ref,
1092 objectid, 64); 1090 objectid, 64);
1093BTRFS_SETGET_STACK_FUNCS(stack_ref_offset, struct btrfs_extent_ref,
1094 offset, 64);
1095BTRFS_SETGET_STACK_FUNCS(stack_ref_num_refs, struct btrfs_extent_ref, 1091BTRFS_SETGET_STACK_FUNCS(stack_ref_num_refs, struct btrfs_extent_ref,
1096 num_refs, 32); 1092 num_refs, 32);
1097 1093
@@ -1522,29 +1518,20 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
1522struct extent_buffer *btrfs_init_new_buffer(struct btrfs_trans_handle *trans, 1518struct extent_buffer *btrfs_init_new_buffer(struct btrfs_trans_handle *trans,
1523 struct btrfs_root *root, 1519 struct btrfs_root *root,
1524 u64 bytenr, u32 blocksize); 1520 u64 bytenr, u32 blocksize);
1525int btrfs_insert_extent_backref(struct btrfs_trans_handle *trans,
1526 struct btrfs_root *root,
1527 struct btrfs_path *path,
1528 u64 bytenr, u64 parent,
1529 u64 root_objectid, u64 ref_generation,
1530 u64 owner, u64 owner_offset);
1531int btrfs_alloc_extent(struct btrfs_trans_handle *trans, 1521int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
1532 struct btrfs_root *root, 1522 struct btrfs_root *root,
1533 u64 num_bytes, u64 parent, u64 min_bytes, 1523 u64 num_bytes, u64 parent, u64 min_bytes,
1534 u64 root_objectid, u64 ref_generation, 1524 u64 root_objectid, u64 ref_generation,
1535 u64 owner, u64 owner_offset, 1525 u64 owner, u64 empty_size, u64 hint_byte,
1536 u64 empty_size, u64 hint_byte,
1537 u64 search_end, struct btrfs_key *ins, u64 data); 1526 u64 search_end, struct btrfs_key *ins, u64 data);
1538int btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans, 1527int btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans,
1539 struct btrfs_root *root, u64 parent, 1528 struct btrfs_root *root, u64 parent,
1540 u64 root_objectid, u64 ref_generation, 1529 u64 root_objectid, u64 ref_generation,
1541 u64 owner, u64 owner_offset, 1530 u64 owner, struct btrfs_key *ins);
1542 struct btrfs_key *ins);
1543int btrfs_alloc_logged_extent(struct btrfs_trans_handle *trans, 1531int btrfs_alloc_logged_extent(struct btrfs_trans_handle *trans,
1544 struct btrfs_root *root, u64 parent, 1532 struct btrfs_root *root, u64 parent,
1545 u64 root_objectid, u64 ref_generation, 1533 u64 root_objectid, u64 ref_generation,
1546 u64 owner, u64 owner_offset, 1534 u64 owner, struct btrfs_key *ins);
1547 struct btrfs_key *ins);
1548int btrfs_reserve_extent(struct btrfs_trans_handle *trans, 1535int btrfs_reserve_extent(struct btrfs_trans_handle *trans,
1549 struct btrfs_root *root, 1536 struct btrfs_root *root,
1550 u64 num_bytes, u64 min_alloc_size, 1537 u64 num_bytes, u64 min_alloc_size,
@@ -1563,7 +1550,7 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans,
1563 struct btrfs_root *root, 1550 struct btrfs_root *root,
1564 u64 bytenr, u64 num_bytes, u64 parent, 1551 u64 bytenr, u64 num_bytes, u64 parent,
1565 u64 root_objectid, u64 ref_generation, 1552 u64 root_objectid, u64 ref_generation,
1566 u64 owner_objectid, u64 owner_offset, int pin); 1553 u64 owner_objectid, int pin);
1567int btrfs_free_reserved_extent(struct btrfs_root *root, u64 start, u64 len); 1554int btrfs_free_reserved_extent(struct btrfs_root *root, u64 start, u64 len);
1568int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, 1555int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans,
1569 struct btrfs_root *root, 1556 struct btrfs_root *root,
@@ -1572,12 +1559,12 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
1572 struct btrfs_root *root, 1559 struct btrfs_root *root,
1573 u64 bytenr, u64 num_bytes, u64 parent, 1560 u64 bytenr, u64 num_bytes, u64 parent,
1574 u64 root_objectid, u64 ref_generation, 1561 u64 root_objectid, u64 ref_generation,
1575 u64 owner, u64 owner_offset); 1562 u64 owner_objectid);
1576int btrfs_update_extent_ref(struct btrfs_trans_handle *trans, 1563int btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
1577 struct btrfs_root *root, u64 bytenr, 1564 struct btrfs_root *root, u64 bytenr,
1578 u64 orig_parent, u64 parent, 1565 u64 orig_parent, u64 parent,
1579 u64 root_objectid, u64 ref_generation, 1566 u64 root_objectid, u64 ref_generation,
1580 u64 owner, u64 owner_offset); 1567 u64 owner_objectid);
1581int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans, 1568int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
1582 struct btrfs_root *root); 1569 struct btrfs_root *root);
1583int btrfs_free_block_groups(struct btrfs_fs_info *info); 1570int btrfs_free_block_groups(struct btrfs_fs_info *info);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 69db54e09fb9..ab36769c356c 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -525,31 +525,28 @@ int btrfs_lookup_extent(struct btrfs_root *root, u64 start, u64 len)
525 * - Objectid of the subvolume root 525 * - Objectid of the subvolume root
526 * - Generation number of the tree holding the reference 526 * - Generation number of the tree holding the reference
527 * - objectid of the file holding the reference 527 * - objectid of the file holding the reference
528 * - offset in the file corresponding to the key holding the reference
529 * - number of references holding by parent node (alway 1 for tree blocks) 528 * - number of references holding by parent node (alway 1 for tree blocks)
530 * 529 *
531 * Btree leaf may hold multiple references to a file extent. In most cases, 530 * Btree leaf may hold multiple references to a file extent. In most cases,
532 * these references are from same file and the corresponding offsets inside 531 * these references are from same file and the corresponding offsets inside
533 * the file are close together. So inode objectid and offset in file are 532 * the file are close together.
534 * just hints, they provide hints about where in the btree the references
535 * can be found and when we can stop searching.
536 * 533 *
537 * When a file extent is allocated the fields are filled in: 534 * When a file extent is allocated the fields are filled in:
538 * (root_key.objectid, trans->transid, inode objectid, offset in file, 1) 535 * (root_key.objectid, trans->transid, inode objectid, 1)
539 * 536 *
540 * When a leaf is cow'd new references are added for every file extent found 537 * When a leaf is cow'd new references are added for every file extent found
541 * in the leaf. It looks similar to the create case, but trans->transid will 538 * in the leaf. It looks similar to the create case, but trans->transid will
542 * be different when the block is cow'd. 539 * be different when the block is cow'd.
543 * 540 *
544 * (root_key.objectid, trans->transid, inode objectid, offset in file, 541 * (root_key.objectid, trans->transid, inode objectid,
545 * number of references in the leaf) 542 * number of references in the leaf)
546 * 543 *
547 * Because inode objectid and offset in file are just hints, they are not 544 * When a file extent is removed either during snapshot deletion or
548 * used when backrefs are deleted. When a file extent is removed either 545 * file truncation, we find the corresponding back reference and check
549 * during snapshot deletion or file truncation, we find the corresponding 546 * the following fields:
550 * back back reference and check the following fields.
551 * 547 *
552 * (btrfs_header_owner(leaf), btrfs_header_generation(leaf)) 548 * (btrfs_header_owner(leaf), btrfs_header_generation(leaf),
549 * inode objectid)
553 * 550 *
554 * Btree extents can be referenced by: 551 * Btree extents can be referenced by:
555 * 552 *
@@ -558,21 +555,21 @@ int btrfs_lookup_extent(struct btrfs_root *root, u64 start, u64 len)
558 * 555 *
559 * When a tree block is created, back references are inserted: 556 * When a tree block is created, back references are inserted:
560 * 557 *
561 * (root->root_key.objectid, trans->transid, level, 0, 1) 558 * (root->root_key.objectid, trans->transid, level, 1)
562 * 559 *
563 * When a tree block is cow'd, new back references are added for all the 560 * When a tree block is cow'd, new back references are added for all the
564 * blocks it points to. If the tree block isn't in reference counted root, 561 * blocks it points to. If the tree block isn't in reference counted root,
565 * the old back references are removed. These new back references are of 562 * the old back references are removed. These new back references are of
566 * the form (trans->transid will have increased since creation): 563 * the form (trans->transid will have increased since creation):
567 * 564 *
568 * (root->root_key.objectid, trans->transid, level, 0, 1) 565 * (root->root_key.objectid, trans->transid, level, 1)
569 * 566 *
570 * When a backref is in deleting, the following fields are checked: 567 * When a backref is in deleting, the following fields are checked:
571 * 568 *
572 * if backref was for a tree root: 569 * if backref was for a tree root:
573 * (btrfs_header_owner(itself), btrfs_header_generation(itself)) 570 * (btrfs_header_owner(itself), btrfs_header_generation(itself), level)
574 * else 571 * else
575 * (btrfs_header_owner(parent), btrfs_header_generation(parent)) 572 * (btrfs_header_owner(parent), btrfs_header_generation(parent), level)
576 * 573 *
577 * Back Reference Key composing: 574 * Back Reference Key composing:
578 * 575 *
@@ -584,13 +581,15 @@ int btrfs_lookup_extent(struct btrfs_root *root, u64 start, u64 len)
584 581
585static int noinline lookup_extent_backref(struct btrfs_trans_handle *trans, 582static int noinline lookup_extent_backref(struct btrfs_trans_handle *trans,
586 struct btrfs_root *root, 583 struct btrfs_root *root,
587 struct btrfs_path *path, u64 bytenr, 584 struct btrfs_path *path,
588 u64 parent, u64 ref_root, 585 u64 bytenr, u64 parent,
589 u64 ref_generation, int del) 586 u64 ref_root, u64 ref_generation,
587 u64 owner_objectid, int del)
590{ 588{
591 struct btrfs_key key; 589 struct btrfs_key key;
592 struct btrfs_extent_ref *ref; 590 struct btrfs_extent_ref *ref;
593 struct extent_buffer *leaf; 591 struct extent_buffer *leaf;
592 u64 ref_objectid;
594 int ret; 593 int ret;
595 594
596 key.objectid = bytenr; 595 key.objectid = bytenr;
@@ -607,8 +606,11 @@ static int noinline lookup_extent_backref(struct btrfs_trans_handle *trans,
607 606
608 leaf = path->nodes[0]; 607 leaf = path->nodes[0];
609 ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_ref); 608 ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_ref);
609 ref_objectid = btrfs_ref_objectid(leaf, ref);
610 if (btrfs_ref_root(leaf, ref) != ref_root || 610 if (btrfs_ref_root(leaf, ref) != ref_root ||
611 btrfs_ref_generation(leaf, ref) != ref_generation) { 611 btrfs_ref_generation(leaf, ref) != ref_generation ||
612 (ref_objectid != owner_objectid &&
613 ref_objectid != BTRFS_MULTIPLE_OBJECTIDS)) {
612 ret = -EIO; 614 ret = -EIO;
613 WARN_ON(1); 615 WARN_ON(1);
614 goto out; 616 goto out;
@@ -623,7 +625,7 @@ static int noinline insert_extent_backref(struct btrfs_trans_handle *trans,
623 struct btrfs_path *path, 625 struct btrfs_path *path,
624 u64 bytenr, u64 parent, 626 u64 bytenr, u64 parent,
625 u64 ref_root, u64 ref_generation, 627 u64 ref_root, u64 ref_generation,
626 u64 owner_objectid, u64 owner_offset) 628 u64 owner_objectid)
627{ 629{
628 struct btrfs_key key; 630 struct btrfs_key key;
629 struct extent_buffer *leaf; 631 struct extent_buffer *leaf;
@@ -643,7 +645,6 @@ static int noinline insert_extent_backref(struct btrfs_trans_handle *trans,
643 btrfs_set_ref_root(leaf, ref, ref_root); 645 btrfs_set_ref_root(leaf, ref, ref_root);
644 btrfs_set_ref_generation(leaf, ref, ref_generation); 646 btrfs_set_ref_generation(leaf, ref, ref_generation);
645 btrfs_set_ref_objectid(leaf, ref, owner_objectid); 647 btrfs_set_ref_objectid(leaf, ref, owner_objectid);
646 btrfs_set_ref_offset(leaf, ref, owner_offset);
647 btrfs_set_ref_num_refs(leaf, ref, 1); 648 btrfs_set_ref_num_refs(leaf, ref, 1);
648 } else if (ret == -EEXIST) { 649 } else if (ret == -EEXIST) {
649 u64 existing_owner; 650 u64 existing_owner;
@@ -663,14 +664,10 @@ static int noinline insert_extent_backref(struct btrfs_trans_handle *trans,
663 btrfs_set_ref_num_refs(leaf, ref, num_refs + 1); 664 btrfs_set_ref_num_refs(leaf, ref, num_refs + 1);
664 665
665 existing_owner = btrfs_ref_objectid(leaf, ref); 666 existing_owner = btrfs_ref_objectid(leaf, ref);
666 if (existing_owner == owner_objectid && 667 if (existing_owner != owner_objectid &&
667 btrfs_ref_offset(leaf, ref) > owner_offset) { 668 existing_owner != BTRFS_MULTIPLE_OBJECTIDS) {
668 btrfs_set_ref_offset(leaf, ref, owner_offset);
669 } else if (existing_owner != owner_objectid &&
670 existing_owner != BTRFS_MULTIPLE_OBJECTIDS) {
671 btrfs_set_ref_objectid(leaf, ref, 669 btrfs_set_ref_objectid(leaf, ref,
672 BTRFS_MULTIPLE_OBJECTIDS); 670 BTRFS_MULTIPLE_OBJECTIDS);
673 btrfs_set_ref_offset(leaf, ref, 0);
674 } 671 }
675 ret = 0; 672 ret = 0;
676 } else { 673 } else {
@@ -711,7 +708,7 @@ static int __btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
711 u64 orig_parent, u64 parent, 708 u64 orig_parent, u64 parent,
712 u64 orig_root, u64 ref_root, 709 u64 orig_root, u64 ref_root,
713 u64 orig_generation, u64 ref_generation, 710 u64 orig_generation, u64 ref_generation,
714 u64 owner_objectid, u64 owner_offset) 711 u64 owner_objectid)
715{ 712{
716 int ret; 713 int ret;
717 struct btrfs_root *extent_root = root->fs_info->extent_root; 714 struct btrfs_root *extent_root = root->fs_info->extent_root;
@@ -762,7 +759,7 @@ static int __btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
762 return -ENOMEM; 759 return -ENOMEM;
763 ret = lookup_extent_backref(trans, extent_root, path, 760 ret = lookup_extent_backref(trans, extent_root, path,
764 bytenr, orig_parent, orig_root, 761 bytenr, orig_parent, orig_root,
765 orig_generation, 1); 762 orig_generation, owner_objectid, 1);
766 if (ret) 763 if (ret)
767 goto out; 764 goto out;
768 ret = remove_extent_backref(trans, extent_root, path); 765 ret = remove_extent_backref(trans, extent_root, path);
@@ -770,7 +767,7 @@ static int __btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
770 goto out; 767 goto out;
771 ret = insert_extent_backref(trans, extent_root, path, bytenr, 768 ret = insert_extent_backref(trans, extent_root, path, bytenr,
772 parent, ref_root, ref_generation, 769 parent, ref_root, ref_generation,
773 owner_objectid, owner_offset); 770 owner_objectid);
774 BUG_ON(ret); 771 BUG_ON(ret);
775 finish_current_insert(trans, extent_root); 772 finish_current_insert(trans, extent_root);
776 del_pending_extents(trans, extent_root); 773 del_pending_extents(trans, extent_root);
@@ -783,7 +780,7 @@ int btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
783 struct btrfs_root *root, u64 bytenr, 780 struct btrfs_root *root, u64 bytenr,
784 u64 orig_parent, u64 parent, 781 u64 orig_parent, u64 parent,
785 u64 ref_root, u64 ref_generation, 782 u64 ref_root, u64 ref_generation,
786 u64 owner_objectid, u64 owner_offset) 783 u64 owner_objectid)
787{ 784{
788 int ret; 785 int ret;
789 if (ref_root == BTRFS_TREE_LOG_OBJECTID && 786 if (ref_root == BTRFS_TREE_LOG_OBJECTID &&
@@ -793,7 +790,7 @@ int btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
793 ret = __btrfs_update_extent_ref(trans, root, bytenr, orig_parent, 790 ret = __btrfs_update_extent_ref(trans, root, bytenr, orig_parent,
794 parent, ref_root, ref_root, 791 parent, ref_root, ref_root,
795 ref_generation, ref_generation, 792 ref_generation, ref_generation,
796 owner_objectid, owner_offset); 793 owner_objectid);
797 maybe_unlock_mutex(root); 794 maybe_unlock_mutex(root);
798 return ret; 795 return ret;
799} 796}
@@ -803,7 +800,7 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
803 u64 orig_parent, u64 parent, 800 u64 orig_parent, u64 parent,
804 u64 orig_root, u64 ref_root, 801 u64 orig_root, u64 ref_root,
805 u64 orig_generation, u64 ref_generation, 802 u64 orig_generation, u64 ref_generation,
806 u64 owner_objectid, u64 owner_offset) 803 u64 owner_objectid)
807{ 804{
808 struct btrfs_path *path; 805 struct btrfs_path *path;
809 int ret; 806 int ret;
@@ -845,7 +842,7 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
845 ret = insert_extent_backref(trans, root->fs_info->extent_root, 842 ret = insert_extent_backref(trans, root->fs_info->extent_root,
846 path, bytenr, parent, 843 path, bytenr, parent,
847 ref_root, ref_generation, 844 ref_root, ref_generation,
848 owner_objectid, owner_offset); 845 owner_objectid);
849 BUG_ON(ret); 846 BUG_ON(ret);
850 finish_current_insert(trans, root->fs_info->extent_root); 847 finish_current_insert(trans, root->fs_info->extent_root);
851 del_pending_extents(trans, root->fs_info->extent_root); 848 del_pending_extents(trans, root->fs_info->extent_root);
@@ -858,7 +855,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
858 struct btrfs_root *root, 855 struct btrfs_root *root,
859 u64 bytenr, u64 num_bytes, u64 parent, 856 u64 bytenr, u64 num_bytes, u64 parent,
860 u64 ref_root, u64 ref_generation, 857 u64 ref_root, u64 ref_generation,
861 u64 owner_objectid, u64 owner_offset) 858 u64 owner_objectid)
862{ 859{
863 int ret; 860 int ret;
864 if (ref_root == BTRFS_TREE_LOG_OBJECTID && 861 if (ref_root == BTRFS_TREE_LOG_OBJECTID &&
@@ -867,7 +864,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
867 maybe_lock_mutex(root); 864 maybe_lock_mutex(root);
868 ret = __btrfs_inc_extent_ref(trans, root, bytenr, 0, parent, 865 ret = __btrfs_inc_extent_ref(trans, root, bytenr, 0, parent,
869 0, ref_root, 0, ref_generation, 866 0, ref_root, 0, ref_generation,
870 owner_objectid, owner_offset); 867 owner_objectid);
871 maybe_unlock_mutex(root); 868 maybe_unlock_mutex(root);
872 return ret; 869 return ret;
873} 870}
@@ -1179,7 +1176,7 @@ int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1179 int ret = 0; 1176 int ret = 0;
1180 int faili = 0; 1177 int faili = 0;
1181 int (*process_func)(struct btrfs_trans_handle *, struct btrfs_root *, 1178 int (*process_func)(struct btrfs_trans_handle *, struct btrfs_root *,
1182 u64, u64, u64, u64, u64, u64, u64, u64, u64); 1179 u64, u64, u64, u64, u64, u64, u64, u64);
1183 1180
1184 ref_root = btrfs_header_owner(buf); 1181 ref_root = btrfs_header_owner(buf);
1185 ref_generation = btrfs_header_generation(buf); 1182 ref_generation = btrfs_header_generation(buf);
@@ -1223,7 +1220,7 @@ int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1223 orig_buf->start, buf->start, 1220 orig_buf->start, buf->start,
1224 orig_root, ref_root, 1221 orig_root, ref_root,
1225 orig_generation, ref_generation, 1222 orig_generation, ref_generation,
1226 key.objectid, key.offset); 1223 key.objectid);
1227 maybe_unlock_mutex(root); 1224 maybe_unlock_mutex(root);
1228 1225
1229 if (ret) { 1226 if (ret) {
@@ -1238,7 +1235,7 @@ int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1238 orig_buf->start, buf->start, 1235 orig_buf->start, buf->start,
1239 orig_root, ref_root, 1236 orig_root, ref_root,
1240 orig_generation, ref_generation, 1237 orig_generation, ref_generation,
1241 level - 1, 0); 1238 level - 1);
1242 maybe_unlock_mutex(root); 1239 maybe_unlock_mutex(root);
1243 if (ret) { 1240 if (ret) {
1244 faili = i; 1241 faili = i;
@@ -1314,7 +1311,7 @@ int btrfs_update_ref(struct btrfs_trans_handle *trans,
1314 orig_buf->start, buf->start, 1311 orig_buf->start, buf->start,
1315 orig_root, ref_root, 1312 orig_root, ref_root,
1316 orig_generation, ref_generation, 1313 orig_generation, ref_generation,
1317 key.objectid, key.offset); 1314 key.objectid);
1318 maybe_unlock_mutex(root); 1315 maybe_unlock_mutex(root);
1319 if (ret) 1316 if (ret)
1320 goto fail; 1317 goto fail;
@@ -1325,7 +1322,7 @@ int btrfs_update_ref(struct btrfs_trans_handle *trans,
1325 orig_buf->start, buf->start, 1322 orig_buf->start, buf->start,
1326 orig_root, ref_root, 1323 orig_root, ref_root,
1327 orig_generation, ref_generation, 1324 orig_generation, ref_generation,
1328 level - 1, 0); 1325 level - 1);
1329 maybe_unlock_mutex(root); 1326 maybe_unlock_mutex(root);
1330 if (ret) 1327 if (ret)
1331 goto fail; 1328 goto fail;
@@ -1781,13 +1778,14 @@ static int finish_current_insert(struct btrfs_trans_handle *trans,
1781 start, extent_op->parent, 1778 start, extent_op->parent,
1782 extent_root->root_key.objectid, 1779 extent_root->root_key.objectid,
1783 extent_op->generation, 1780 extent_op->generation,
1784 extent_op->level, 0); 1781 extent_op->level);
1785 BUG_ON(err); 1782 BUG_ON(err);
1786 } else if (extent_op->type == PENDING_BACKREF_UPDATE) { 1783 } else if (extent_op->type == PENDING_BACKREF_UPDATE) {
1787 err = lookup_extent_backref(trans, extent_root, path, 1784 err = lookup_extent_backref(trans, extent_root, path,
1788 start, extent_op->orig_parent, 1785 start, extent_op->orig_parent,
1789 extent_root->root_key.objectid, 1786 extent_root->root_key.objectid,
1790 extent_op->orig_generation, 0); 1787 extent_op->orig_generation,
1788 extent_op->level, 0);
1791 BUG_ON(err); 1789 BUG_ON(err);
1792 1790
1793 clear_extent_bits(&info->extent_ins, start, end, 1791 clear_extent_bits(&info->extent_ins, start, end,
@@ -1870,8 +1868,7 @@ static int __free_extent(struct btrfs_trans_handle *trans,
1870 struct btrfs_root *root, 1868 struct btrfs_root *root,
1871 u64 bytenr, u64 num_bytes, u64 parent, 1869 u64 bytenr, u64 num_bytes, u64 parent,
1872 u64 root_objectid, u64 ref_generation, 1870 u64 root_objectid, u64 ref_generation,
1873 u64 owner_objectid, u64 owner_offset, 1871 u64 owner_objectid, int pin, int mark_free)
1874 int pin, int mark_free)
1875{ 1872{
1876 struct btrfs_path *path; 1873 struct btrfs_path *path;
1877 struct btrfs_key key; 1874 struct btrfs_key key;
@@ -1894,8 +1891,9 @@ static int __free_extent(struct btrfs_trans_handle *trans,
1894 return -ENOMEM; 1891 return -ENOMEM;
1895 1892
1896 path->reada = 1; 1893 path->reada = 1;
1897 ret = lookup_extent_backref(trans, extent_root, path, bytenr, parent, 1894 ret = lookup_extent_backref(trans, extent_root, path,
1898 root_objectid, ref_generation, 1); 1895 bytenr, parent, root_objectid,
1896 ref_generation, owner_objectid, 1);
1899 if (ret == 0) { 1897 if (ret == 0) {
1900 struct btrfs_key found_key; 1898 struct btrfs_key found_key;
1901 extent_slot = path->slots[0]; 1899 extent_slot = path->slots[0];
@@ -1926,9 +1924,8 @@ static int __free_extent(struct btrfs_trans_handle *trans,
1926 btrfs_print_leaf(extent_root, path->nodes[0]); 1924 btrfs_print_leaf(extent_root, path->nodes[0]);
1927 WARN_ON(1); 1925 WARN_ON(1);
1928 printk("Unable to find ref byte nr %Lu root %Lu " 1926 printk("Unable to find ref byte nr %Lu root %Lu "
1929 " gen %Lu owner %Lu offset %Lu\n", bytenr, 1927 "gen %Lu owner %Lu\n", bytenr,
1930 root_objectid, ref_generation, owner_objectid, 1928 root_objectid, ref_generation, owner_objectid);
1931 owner_offset);
1932 } 1929 }
1933 1930
1934 leaf = path->nodes[0]; 1931 leaf = path->nodes[0];
@@ -2068,7 +2065,7 @@ free_extent:
2068 extent_op->orig_parent, 2065 extent_op->orig_parent,
2069 extent_root->root_key.objectid, 2066 extent_root->root_key.objectid,
2070 extent_op->orig_generation, 2067 extent_op->orig_generation,
2071 extent_op->level, 0, 0, mark_free); 2068 extent_op->level, 0, mark_free);
2072 kfree(extent_op); 2069 kfree(extent_op);
2073 } else { 2070 } else {
2074 kfree(extent_op); 2071 kfree(extent_op);
@@ -2107,7 +2104,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
2107 struct btrfs_root *root, 2104 struct btrfs_root *root,
2108 u64 bytenr, u64 num_bytes, u64 parent, 2105 u64 bytenr, u64 num_bytes, u64 parent,
2109 u64 root_objectid, u64 ref_generation, 2106 u64 root_objectid, u64 ref_generation,
2110 u64 owner_objectid, u64 owner_offset, int pin) 2107 u64 owner_objectid, int pin)
2111{ 2108{
2112 struct btrfs_root *extent_root = root->fs_info->extent_root; 2109 struct btrfs_root *extent_root = root->fs_info->extent_root;
2113 int pending_ret; 2110 int pending_ret;
@@ -2156,8 +2153,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
2156 pin = 1; 2153 pin = 1;
2157 2154
2158 ret = __free_extent(trans, root, bytenr, num_bytes, parent, 2155 ret = __free_extent(trans, root, bytenr, num_bytes, parent,
2159 root_objectid, ref_generation, owner_objectid, 2156 root_objectid, ref_generation,
2160 owner_offset, pin, pin == 0); 2157 owner_objectid, pin, pin == 0);
2161 2158
2162 finish_current_insert(trans, root->fs_info->extent_root); 2159 finish_current_insert(trans, root->fs_info->extent_root);
2163 pending_ret = del_pending_extents(trans, root->fs_info->extent_root); 2160 pending_ret = del_pending_extents(trans, root->fs_info->extent_root);
@@ -2168,14 +2165,14 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans,
2168 struct btrfs_root *root, 2165 struct btrfs_root *root,
2169 u64 bytenr, u64 num_bytes, u64 parent, 2166 u64 bytenr, u64 num_bytes, u64 parent,
2170 u64 root_objectid, u64 ref_generation, 2167 u64 root_objectid, u64 ref_generation,
2171 u64 owner_objectid, u64 owner_offset, int pin) 2168 u64 owner_objectid, int pin)
2172{ 2169{
2173 int ret; 2170 int ret;
2174 2171
2175 maybe_lock_mutex(root); 2172 maybe_lock_mutex(root);
2176 ret = __btrfs_free_extent(trans, root, bytenr, num_bytes, parent, 2173 ret = __btrfs_free_extent(trans, root, bytenr, num_bytes, parent,
2177 root_objectid, ref_generation, 2174 root_objectid, ref_generation,
2178 owner_objectid, owner_offset, pin); 2175 owner_objectid, pin);
2179 maybe_unlock_mutex(root); 2176 maybe_unlock_mutex(root);
2180 return ret; 2177 return ret;
2181} 2178}
@@ -2522,8 +2519,7 @@ int btrfs_reserve_extent(struct btrfs_trans_handle *trans,
2522static int __btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans, 2519static int __btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans,
2523 struct btrfs_root *root, u64 parent, 2520 struct btrfs_root *root, u64 parent,
2524 u64 root_objectid, u64 ref_generation, 2521 u64 root_objectid, u64 ref_generation,
2525 u64 owner, u64 owner_offset, 2522 u64 owner, struct btrfs_key *ins)
2526 struct btrfs_key *ins)
2527{ 2523{
2528 int ret; 2524 int ret;
2529 int pending_ret; 2525 int pending_ret;
@@ -2597,7 +2593,6 @@ static int __btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans,
2597 btrfs_set_ref_root(path->nodes[0], ref, root_objectid); 2593 btrfs_set_ref_root(path->nodes[0], ref, root_objectid);
2598 btrfs_set_ref_generation(path->nodes[0], ref, ref_generation); 2594 btrfs_set_ref_generation(path->nodes[0], ref, ref_generation);
2599 btrfs_set_ref_objectid(path->nodes[0], ref, owner); 2595 btrfs_set_ref_objectid(path->nodes[0], ref, owner);
2600 btrfs_set_ref_offset(path->nodes[0], ref, owner_offset);
2601 btrfs_set_ref_num_refs(path->nodes[0], ref, 1); 2596 btrfs_set_ref_num_refs(path->nodes[0], ref, 1);
2602 2597
2603 btrfs_mark_buffer_dirty(path->nodes[0]); 2598 btrfs_mark_buffer_dirty(path->nodes[0]);
@@ -2629,17 +2624,15 @@ out:
2629int btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans, 2624int btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans,
2630 struct btrfs_root *root, u64 parent, 2625 struct btrfs_root *root, u64 parent,
2631 u64 root_objectid, u64 ref_generation, 2626 u64 root_objectid, u64 ref_generation,
2632 u64 owner, u64 owner_offset, 2627 u64 owner, struct btrfs_key *ins)
2633 struct btrfs_key *ins)
2634{ 2628{
2635 int ret; 2629 int ret;
2636 2630
2637 if (root_objectid == BTRFS_TREE_LOG_OBJECTID) 2631 if (root_objectid == BTRFS_TREE_LOG_OBJECTID)
2638 return 0; 2632 return 0;
2639 maybe_lock_mutex(root); 2633 maybe_lock_mutex(root);
2640 ret = __btrfs_alloc_reserved_extent(trans, root, parent, 2634 ret = __btrfs_alloc_reserved_extent(trans, root, parent, root_objectid,
2641 root_objectid, ref_generation, 2635 ref_generation, owner, ins);
2642 owner, owner_offset, ins);
2643 update_reserved_extents(root, ins->objectid, ins->offset, 0); 2636 update_reserved_extents(root, ins->objectid, ins->offset, 0);
2644 maybe_unlock_mutex(root); 2637 maybe_unlock_mutex(root);
2645 return ret; 2638 return ret;
@@ -2653,8 +2646,7 @@ int btrfs_alloc_reserved_extent(struct btrfs_trans_handle *trans,
2653int btrfs_alloc_logged_extent(struct btrfs_trans_handle *trans, 2646int btrfs_alloc_logged_extent(struct btrfs_trans_handle *trans,
2654 struct btrfs_root *root, u64 parent, 2647 struct btrfs_root *root, u64 parent,
2655 u64 root_objectid, u64 ref_generation, 2648 u64 root_objectid, u64 ref_generation,
2656 u64 owner, u64 owner_offset, 2649 u64 owner, struct btrfs_key *ins)
2657 struct btrfs_key *ins)
2658{ 2650{
2659 int ret; 2651 int ret;
2660 struct btrfs_block_group_cache *block_group; 2652 struct btrfs_block_group_cache *block_group;
@@ -2665,9 +2657,8 @@ int btrfs_alloc_logged_extent(struct btrfs_trans_handle *trans,
2665 2657
2666 ret = btrfs_remove_free_space(block_group, ins->objectid, ins->offset); 2658 ret = btrfs_remove_free_space(block_group, ins->objectid, ins->offset);
2667 BUG_ON(ret); 2659 BUG_ON(ret);
2668 ret = __btrfs_alloc_reserved_extent(trans, root, parent, 2660 ret = __btrfs_alloc_reserved_extent(trans, root, parent, root_objectid,
2669 root_objectid, ref_generation, 2661 ref_generation, owner, ins);
2670 owner, owner_offset, ins);
2671 maybe_unlock_mutex(root); 2662 maybe_unlock_mutex(root);
2672 return ret; 2663 return ret;
2673} 2664}
@@ -2683,8 +2674,7 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
2683 struct btrfs_root *root, 2674 struct btrfs_root *root,
2684 u64 num_bytes, u64 parent, u64 min_alloc_size, 2675 u64 num_bytes, u64 parent, u64 min_alloc_size,
2685 u64 root_objectid, u64 ref_generation, 2676 u64 root_objectid, u64 ref_generation,
2686 u64 owner_objectid, u64 owner_offset, 2677 u64 owner_objectid, u64 empty_size, u64 hint_byte,
2687 u64 empty_size, u64 hint_byte,
2688 u64 search_end, struct btrfs_key *ins, u64 data) 2678 u64 search_end, struct btrfs_key *ins, u64 data)
2689{ 2679{
2690 int ret; 2680 int ret;
@@ -2698,7 +2688,7 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
2698 if (root_objectid != BTRFS_TREE_LOG_OBJECTID) { 2688 if (root_objectid != BTRFS_TREE_LOG_OBJECTID) {
2699 ret = __btrfs_alloc_reserved_extent(trans, root, parent, 2689 ret = __btrfs_alloc_reserved_extent(trans, root, parent,
2700 root_objectid, ref_generation, 2690 root_objectid, ref_generation,
2701 owner_objectid, owner_offset, ins); 2691 owner_objectid, ins);
2702 BUG_ON(ret); 2692 BUG_ON(ret);
2703 2693
2704 } else { 2694 } else {
@@ -2750,7 +2740,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
2750 struct extent_buffer *buf; 2740 struct extent_buffer *buf;
2751 2741
2752 ret = btrfs_alloc_extent(trans, root, blocksize, parent, blocksize, 2742 ret = btrfs_alloc_extent(trans, root, blocksize, parent, blocksize,
2753 root_objectid, ref_generation, level, 0, 2743 root_objectid, ref_generation, level,
2754 empty_size, hint, (u64)-1, &ins, 0); 2744 empty_size, hint, (u64)-1, &ins, 0);
2755 if (ret) { 2745 if (ret) {
2756 BUG_ON(ret > 0); 2746 BUG_ON(ret > 0);
@@ -2800,7 +2790,7 @@ int btrfs_drop_leaf_ref(struct btrfs_trans_handle *trans,
2800 ret = __btrfs_free_extent(trans, root, disk_bytenr, 2790 ret = __btrfs_free_extent(trans, root, disk_bytenr,
2801 btrfs_file_extent_disk_num_bytes(leaf, fi), 2791 btrfs_file_extent_disk_num_bytes(leaf, fi),
2802 leaf->start, leaf_owner, leaf_generation, 2792 leaf->start, leaf_owner, leaf_generation,
2803 key.objectid, key.offset, 0); 2793 key.objectid, 0);
2804 mutex_unlock(&root->fs_info->alloc_mutex); 2794 mutex_unlock(&root->fs_info->alloc_mutex);
2805 BUG_ON(ret); 2795 BUG_ON(ret);
2806 2796
@@ -2824,7 +2814,7 @@ static int noinline cache_drop_leaf_ref(struct btrfs_trans_handle *trans,
2824 ret = __btrfs_free_extent(trans, root, info->bytenr, 2814 ret = __btrfs_free_extent(trans, root, info->bytenr,
2825 info->num_bytes, ref->bytenr, 2815 info->num_bytes, ref->bytenr,
2826 ref->owner, ref->generation, 2816 ref->owner, ref->generation,
2827 info->objectid, info->offset, 0); 2817 info->objectid, 0);
2828 mutex_unlock(&root->fs_info->alloc_mutex); 2818 mutex_unlock(&root->fs_info->alloc_mutex);
2829 2819
2830 atomic_inc(&root->fs_info->throttle_gen); 2820 atomic_inc(&root->fs_info->throttle_gen);
@@ -2940,7 +2930,8 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans,
2940 mutex_lock(&root->fs_info->alloc_mutex); 2930 mutex_lock(&root->fs_info->alloc_mutex);
2941 ret = __btrfs_free_extent(trans, root, bytenr, 2931 ret = __btrfs_free_extent(trans, root, bytenr,
2942 blocksize, parent->start, 2932 blocksize, parent->start,
2943 root_owner, root_gen, 0, 0, 1); 2933 root_owner, root_gen,
2934 *level - 1, 1);
2944 BUG_ON(ret); 2935 BUG_ON(ret);
2945 mutex_unlock(&root->fs_info->alloc_mutex); 2936 mutex_unlock(&root->fs_info->alloc_mutex);
2946 2937
@@ -2970,9 +2961,10 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans,
2970 *level = 0; 2961 *level = 0;
2971 break; 2962 break;
2972 } 2963 }
2973 if (printk_ratelimit()) 2964 if (printk_ratelimit()) {
2974 printk("leaf ref miss for bytenr %llu\n", 2965 printk("leaf ref miss for bytenr %llu\n",
2975 (unsigned long long)bytenr); 2966 (unsigned long long)bytenr);
2967 }
2976 } 2968 }
2977 next = btrfs_find_tree_block(root, bytenr, blocksize); 2969 next = btrfs_find_tree_block(root, bytenr, blocksize);
2978 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) { 2970 if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
@@ -3020,7 +3012,7 @@ out:
3020 mutex_lock(&root->fs_info->alloc_mutex); 3012 mutex_lock(&root->fs_info->alloc_mutex);
3021 ret = __btrfs_free_extent(trans, root, bytenr, blocksize, 3013 ret = __btrfs_free_extent(trans, root, bytenr, blocksize,
3022 parent->start, root_owner, root_gen, 3014 parent->start, root_owner, root_gen,
3023 0, 0, 1); 3015 *level, 1);
3024 mutex_unlock(&root->fs_info->alloc_mutex); 3016 mutex_unlock(&root->fs_info->alloc_mutex);
3025 free_extent_buffer(path->nodes[*level]); 3017 free_extent_buffer(path->nodes[*level]);
3026 path->nodes[*level] = NULL; 3018 path->nodes[*level] = NULL;
@@ -3073,8 +3065,8 @@ static int noinline walk_up_tree(struct btrfs_trans_handle *trans,
3073 ret = btrfs_free_extent(trans, root, 3065 ret = btrfs_free_extent(trans, root,
3074 path->nodes[*level]->start, 3066 path->nodes[*level]->start,
3075 path->nodes[*level]->len, 3067 path->nodes[*level]->len,
3076 parent->start, 3068 parent->start, root_owner,
3077 root_owner, root_gen, 0, 0, 1); 3069 root_gen, *level, 1);
3078 BUG_ON(ret); 3070 BUG_ON(ret);
3079 free_extent_buffer(path->nodes[*level]); 3071 free_extent_buffer(path->nodes[*level]);
3080 path->nodes[*level] = NULL; 3072 path->nodes[*level] = NULL;
@@ -3308,7 +3300,6 @@ struct btrfs_ref_path {
3308 u64 root_objectid; 3300 u64 root_objectid;
3309 u64 root_generation; 3301 u64 root_generation;
3310 u64 owner_objectid; 3302 u64 owner_objectid;
3311 u64 owner_offset;
3312 u32 num_refs; 3303 u32 num_refs;
3313 int lowest_level; 3304 int lowest_level;
3314 int current_level; 3305 int current_level;
@@ -3480,7 +3471,6 @@ found:
3480 3471
3481 if (ref_path->lowest_level == level) { 3472 if (ref_path->lowest_level == level) {
3482 ref_path->owner_objectid = ref_objectid; 3473 ref_path->owner_objectid = ref_objectid;
3483 ref_path->owner_offset = btrfs_ref_offset(leaf, ref);
3484 ref_path->num_refs = btrfs_ref_num_refs(leaf, ref); 3474 ref_path->num_refs = btrfs_ref_num_refs(leaf, ref);
3485 } 3475 }
3486 3476
@@ -3686,16 +3676,20 @@ static int noinline replace_one_extent(struct btrfs_trans_handle *trans,
3686 u64 ext_offset; 3676 u64 ext_offset;
3687 u64 first_pos; 3677 u64 first_pos;
3688 u32 nritems; 3678 u32 nritems;
3679 int nr_scaned = 0;
3689 int extent_locked = 0; 3680 int extent_locked = 0;
3690 int ret; 3681 int ret;
3691 3682
3692 first_pos = ref_path->owner_offset; 3683 memcpy(&key, leaf_key, sizeof(key));
3684 first_pos = INT_LIMIT(loff_t) - extent_key->offset;
3693 if (ref_path->owner_objectid != BTRFS_MULTIPLE_OBJECTIDS) { 3685 if (ref_path->owner_objectid != BTRFS_MULTIPLE_OBJECTIDS) {
3694 key.objectid = ref_path->owner_objectid; 3686 if (key.objectid < ref_path->owner_objectid ||
3695 key.offset = ref_path->owner_offset; 3687 (key.objectid == ref_path->owner_objectid &&
3696 key.type = BTRFS_EXTENT_DATA_KEY; 3688 key.type < BTRFS_EXTENT_DATA_KEY)) {
3697 } else { 3689 key.objectid = ref_path->owner_objectid;
3698 memcpy(&key, leaf_key, sizeof(key)); 3690 key.type = BTRFS_EXTENT_DATA_KEY;
3691 key.offset = 0;
3692 }
3699 } 3693 }
3700 3694
3701 while (1) { 3695 while (1) {
@@ -3718,8 +3712,7 @@ next:
3718 } 3712 }
3719 3713
3720 if (path->slots[0] >= nritems) { 3714 if (path->slots[0] >= nritems) {
3721 if (ref_path->owner_objectid == 3715 if (++nr_scaned > 2)
3722 BTRFS_MULTIPLE_OBJECTIDS)
3723 break; 3716 break;
3724 3717
3725 BUG_ON(extent_locked); 3718 BUG_ON(extent_locked);
@@ -3858,7 +3851,7 @@ next:
3858 leaf->start, 3851 leaf->start,
3859 root->root_key.objectid, 3852 root->root_key.objectid,
3860 trans->transid, 3853 trans->transid,
3861 key.objectid, key.offset); 3854 key.objectid);
3862 BUG_ON(ret); 3855 BUG_ON(ret);
3863 3856
3864 ret = btrfs_free_extent(trans, root, 3857 ret = btrfs_free_extent(trans, root,
@@ -3867,7 +3860,7 @@ next:
3867 leaf->start, 3860 leaf->start,
3868 btrfs_header_owner(leaf), 3861 btrfs_header_owner(leaf),
3869 btrfs_header_generation(leaf), 3862 btrfs_header_generation(leaf),
3870 key.objectid, key.offset, 0); 3863 key.objectid, 0);
3871 BUG_ON(ret); 3864 BUG_ON(ret);
3872 3865
3873 btrfs_release_path(root, path); 3866 btrfs_release_path(root, path);
@@ -3925,8 +3918,7 @@ next:
3925 new_extents[i].disk_num_bytes, 3918 new_extents[i].disk_num_bytes,
3926 leaf->start, 3919 leaf->start,
3927 root->root_key.objectid, 3920 root->root_key.objectid,
3928 trans->transid, 3921 trans->transid, key.objectid);
3929 key.objectid, key.offset);
3930 BUG_ON(ret); 3922 BUG_ON(ret);
3931 btrfs_release_path(root, path); 3923 btrfs_release_path(root, path);
3932 3924
@@ -4182,14 +4174,13 @@ static int noinline replace_extents_in_leaf(struct btrfs_trans_handle *trans,
4182 new_extent->disk_num_bytes, 4174 new_extent->disk_num_bytes,
4183 leaf->start, 4175 leaf->start,
4184 root->root_key.objectid, 4176 root->root_key.objectid,
4185 trans->transid, 4177 trans->transid, key.objectid);
4186 key.objectid, key.offset);
4187 BUG_ON(ret); 4178 BUG_ON(ret);
4188 ret = btrfs_free_extent(trans, root, 4179 ret = btrfs_free_extent(trans, root,
4189 bytenr, num_bytes, leaf->start, 4180 bytenr, num_bytes, leaf->start,
4190 btrfs_header_owner(leaf), 4181 btrfs_header_owner(leaf),
4191 btrfs_header_generation(leaf), 4182 btrfs_header_generation(leaf),
4192 key.objectid, key.offset, 0); 4183 key.objectid, 0);
4193 BUG_ON(ret); 4184 BUG_ON(ret);
4194 cond_resched(); 4185 cond_resched();
4195 } 4186 }
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 18dfdf5f91d1..69abbe19add2 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -788,8 +788,7 @@ next_slot:
788 le64_to_cpu(old.disk_num_bytes), 788 le64_to_cpu(old.disk_num_bytes),
789 leaf->start, 789 leaf->start,
790 root->root_key.objectid, 790 root->root_key.objectid,
791 trans->transid, 791 trans->transid, ins.objectid);
792 ins.objectid, ins.offset);
793 BUG_ON(ret); 792 BUG_ON(ret);
794 } 793 }
795 btrfs_release_path(root, path); 794 btrfs_release_path(root, path);
@@ -808,8 +807,7 @@ next_slot:
808 disk_bytenr, 807 disk_bytenr,
809 le64_to_cpu(old.disk_num_bytes), 808 le64_to_cpu(old.disk_num_bytes),
810 leaf_start, root_owner, 809 leaf_start, root_owner,
811 root_gen, key.objectid, 810 root_gen, key.objectid, 0);
812 key.offset, 0);
813 BUG_ON(ret); 811 BUG_ON(ret);
814 *hint_byte = disk_bytenr; 812 *hint_byte = disk_bytenr;
815 } 813 }
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index f9df89c5fdfc..3ab147dc3c05 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -647,8 +647,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
647 ins.type = BTRFS_EXTENT_ITEM_KEY; 647 ins.type = BTRFS_EXTENT_ITEM_KEY;
648 ret = btrfs_alloc_reserved_extent(trans, root, leaf->start, 648 ret = btrfs_alloc_reserved_extent(trans, root, leaf->start,
649 root->root_key.objectid, 649 root->root_key.objectid,
650 trans->transid, inode->i_ino, 650 trans->transid, inode->i_ino, &ins);
651 ordered_extent->file_offset, &ins);
652 BUG_ON(ret); 651 BUG_ON(ret);
653 btrfs_release_path(root, path); 652 btrfs_release_path(root, path);
654 653
@@ -1734,8 +1733,7 @@ delete:
1734 ret = btrfs_free_extent(trans, root, extent_start, 1733 ret = btrfs_free_extent(trans, root, extent_start,
1735 extent_num_bytes, 1734 extent_num_bytes,
1736 leaf->start, root_owner, 1735 leaf->start, root_owner,
1737 root_gen, inode->i_ino, 1736 root_gen, inode->i_ino, 0);
1738 found_key.offset, 0);
1739 BUG_ON(ret); 1737 BUG_ON(ret);
1740 } 1738 }
1741next: 1739next:
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index ab7a0f61ded8..50c8a066d1f0 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -658,7 +658,7 @@ long btrfs_ioctl_clone(struct file *file, unsigned long src_fd)
658 ds, dl, leaf->start, 658 ds, dl, leaf->start,
659 root->root_key.objectid, 659 root->root_key.objectid,
660 trans->transid, 660 trans->transid,
661 inode->i_ino, key.offset); 661 inode->i_ino);
662 BUG_ON(ret); 662 BUG_ON(ret);
663 } 663 }
664 } 664 }
diff --git a/fs/btrfs/print-tree.c b/fs/btrfs/print-tree.c
index 3577badfa5bc..bd9ab3e9a7f2 100644
--- a/fs/btrfs/print-tree.c
+++ b/fs/btrfs/print-tree.c
@@ -102,11 +102,10 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
102 case BTRFS_EXTENT_REF_KEY: 102 case BTRFS_EXTENT_REF_KEY:
103 ref = btrfs_item_ptr(l, i, struct btrfs_extent_ref); 103 ref = btrfs_item_ptr(l, i, struct btrfs_extent_ref);
104 printk("\t\textent back ref root %llu gen %llu " 104 printk("\t\textent back ref root %llu gen %llu "
105 "owner %llu offset %llu num_refs %lu\n", 105 "owner %llu num_refs %lu\n",
106 (unsigned long long)btrfs_ref_root(l, ref), 106 (unsigned long long)btrfs_ref_root(l, ref),
107 (unsigned long long)btrfs_ref_generation(l, ref), 107 (unsigned long long)btrfs_ref_generation(l, ref),
108 (unsigned long long)btrfs_ref_objectid(l, ref), 108 (unsigned long long)btrfs_ref_objectid(l, ref),
109 (unsigned long long)btrfs_ref_offset(l, ref),
110 (unsigned long)btrfs_ref_num_refs(l, ref)); 109 (unsigned long)btrfs_ref_num_refs(l, ref));
111 break; 110 break;
112 111
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 8df719a73d82..cf618cc8b34a 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -460,8 +460,7 @@ insert:
460 ins.objectid, ins.offset, 460 ins.objectid, ins.offset,
461 path->nodes[0]->start, 461 path->nodes[0]->start,
462 root->root_key.objectid, 462 root->root_key.objectid,
463 trans->transid, 463 trans->transid, key->objectid);
464 key->objectid, key->offset);
465 } else { 464 } else {
466 /* 465 /*
467 * insert the extent pointer in the extent 466 * insert the extent pointer in the extent
@@ -471,7 +470,7 @@ insert:
471 path->nodes[0]->start, 470 path->nodes[0]->start,
472 root->root_key.objectid, 471 root->root_key.objectid,
473 trans->transid, key->objectid, 472 trans->transid, key->objectid,
474 key->offset, &ins); 473 &ins);
475 BUG_ON(ret); 474 BUG_ON(ret);
476 } 475 }
477 } 476 }
@@ -2534,8 +2533,7 @@ static noinline int copy_items(struct btrfs_trans_handle *trans,
2534 dst_path->nodes[0]->start, 2533 dst_path->nodes[0]->start,
2535 BTRFS_TREE_LOG_OBJECTID, 2534 BTRFS_TREE_LOG_OBJECTID,
2536 trans->transid, 2535 trans->transid,
2537 ins_keys[i].objectid, 2536 ins_keys[i].objectid);
2538 ins_keys[i].offset);
2539 BUG_ON(ret); 2537 BUG_ON(ret);
2540 } 2538 }
2541 } 2539 }