aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-05-11 15:26:06 -0400
committerJosef Bacik <josef@redhat.com>2011-05-23 13:03:12 -0400
commitd82a6f1d7e8b61ed5996334d0db66651bb43641d (patch)
tree5738ec75f7679bdc1b97aecbc5cad3464cc65541
parent7e2355ba1a11649f0b212a29fdb9f47476f1248e (diff)
Btrfs: kill BTRFS_I(inode)->block_group
Originally this was going to be used as a way to give hints to the allocator, but frankly we can get much better hints elsewhere and it's not even used at all for anything usefull. In addition to be completely useless, when we initialize an inode we try and find a freeish block group to set as the inodes block group, and with a completely full 40gb fs this takes _forever_, so I imagine with say 1tb fs this is just unbearable. So just axe the thing altoghether, we don't need it and it saves us 8 bytes in the inode and saves us 500 microseconds per inode lookup in my testcase. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
-rw-r--r--fs/btrfs/btrfs_inode.h3
-rw-r--r--fs/btrfs/ctree.h3
-rw-r--r--fs/btrfs/extent-tree.c10
-rw-r--r--fs/btrfs/inode.c87
-rw-r--r--fs/btrfs/ioctl.c3
-rw-r--r--fs/btrfs/transaction.c1
-rw-r--r--fs/btrfs/transaction.h14
-rw-r--r--fs/btrfs/xattr.c2
8 files changed, 13 insertions, 110 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index 57c3bb2884ce..4bc852d3b83d 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -120,9 +120,6 @@ struct btrfs_inode {
120 */ 120 */
121 u64 index_cnt; 121 u64 index_cnt;
122 122
123 /* the start of block group preferred for allocations. */
124 u64 block_group;
125
126 /* the fsync log has some corner cases that mean we have to check 123 /* the fsync log has some corner cases that mean we have to check
127 * directories to see if any unlinks have been done before 124 * directories to see if any unlinks have been done before
128 * the directory was logged. See tree-log.c for all the 125 * the directory was logged. See tree-log.c for all the
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index f31aed7fedd9..0f8c489bcc02 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -2512,8 +2512,7 @@ int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
2512int btrfs_writepages(struct address_space *mapping, 2512int btrfs_writepages(struct address_space *mapping,
2513 struct writeback_control *wbc); 2513 struct writeback_control *wbc);
2514int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, 2514int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
2515 struct btrfs_root *new_root, 2515 struct btrfs_root *new_root, u64 new_dirid);
2516 u64 new_dirid, u64 alloc_hint);
2517int btrfs_merge_bio_hook(struct page *page, unsigned long offset, 2516int btrfs_merge_bio_hook(struct page *page, unsigned long offset,
2518 size_t size, struct bio *bio, unsigned long bio_flags); 2517 size_t size, struct bio *bio, unsigned long bio_flags);
2519 2518
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index a2ca561c70f0..9f0a4e3bd8a9 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5319,6 +5319,7 @@ checks:
5319 btrfs_add_free_space(block_group, offset, 5319 btrfs_add_free_space(block_group, offset,
5320 search_start - offset); 5320 search_start - offset);
5321 BUG_ON(offset > search_start); 5321 BUG_ON(offset > search_start);
5322 btrfs_put_block_group(block_group);
5322 break; 5323 break;
5323loop: 5324loop:
5324 failed_cluster_refill = false; 5325 failed_cluster_refill = false;
@@ -5411,14 +5412,7 @@ loop:
5411 ret = -ENOSPC; 5412 ret = -ENOSPC;
5412 } else if (!ins->objectid) { 5413 } else if (!ins->objectid) {
5413 ret = -ENOSPC; 5414 ret = -ENOSPC;
5414 } 5415 } else if (ins->objectid) {
5415
5416 /* we found what we needed */
5417 if (ins->objectid) {
5418 if (!(data & BTRFS_BLOCK_GROUP_DATA))
5419 trans->block_group = block_group->key.objectid;
5420
5421 btrfs_put_block_group(block_group);
5422 ret = 0; 5416 ret = 0;
5423 } 5417 }
5424 5418
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index bc12ba23db5f..dd5938a7de21 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -136,7 +136,6 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans,
136 return -ENOMEM; 136 return -ENOMEM;
137 137
138 path->leave_spinning = 1; 138 path->leave_spinning = 1;
139 btrfs_set_trans_block_group(trans, inode);
140 139
141 key.objectid = inode->i_ino; 140 key.objectid = inode->i_ino;
142 key.offset = start; 141 key.offset = start;
@@ -422,7 +421,6 @@ again:
422 if (start == 0) { 421 if (start == 0) {
423 trans = btrfs_join_transaction(root); 422 trans = btrfs_join_transaction(root);
424 BUG_ON(IS_ERR(trans)); 423 BUG_ON(IS_ERR(trans));
425 btrfs_set_trans_block_group(trans, inode);
426 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 424 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
427 425
428 /* lets try to make an inline extent */ 426 /* lets try to make an inline extent */
@@ -781,7 +779,6 @@ static noinline int cow_file_range(struct inode *inode,
781 BUG_ON(root == root->fs_info->tree_root); 779 BUG_ON(root == root->fs_info->tree_root);
782 trans = btrfs_join_transaction(root); 780 trans = btrfs_join_transaction(root);
783 BUG_ON(IS_ERR(trans)); 781 BUG_ON(IS_ERR(trans));
784 btrfs_set_trans_block_group(trans, inode);
785 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 782 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
786 783
787 num_bytes = (end - start + blocksize) & ~(blocksize - 1); 784 num_bytes = (end - start + blocksize) & ~(blocksize - 1);
@@ -1502,8 +1499,6 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans,
1502{ 1499{
1503 struct btrfs_ordered_sum *sum; 1500 struct btrfs_ordered_sum *sum;
1504 1501
1505 btrfs_set_trans_block_group(trans, inode);
1506
1507 list_for_each_entry(sum, list, list) { 1502 list_for_each_entry(sum, list, list) {
1508 btrfs_csum_file_blocks(trans, 1503 btrfs_csum_file_blocks(trans,
1509 BTRFS_I(inode)->root->fs_info->csum_root, sum); 1504 BTRFS_I(inode)->root->fs_info->csum_root, sum);
@@ -1722,7 +1717,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1722 else 1717 else
1723 trans = btrfs_join_transaction(root); 1718 trans = btrfs_join_transaction(root);
1724 BUG_ON(IS_ERR(trans)); 1719 BUG_ON(IS_ERR(trans));
1725 btrfs_set_trans_block_group(trans, inode);
1726 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1720 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1727 ret = btrfs_update_inode(trans, root, inode); 1721 ret = btrfs_update_inode(trans, root, inode);
1728 BUG_ON(ret); 1722 BUG_ON(ret);
@@ -1739,7 +1733,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1739 else 1733 else
1740 trans = btrfs_join_transaction(root); 1734 trans = btrfs_join_transaction(root);
1741 BUG_ON(IS_ERR(trans)); 1735 BUG_ON(IS_ERR(trans));
1742 btrfs_set_trans_block_group(trans, inode);
1743 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1736 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1744 1737
1745 if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) 1738 if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags))
@@ -2495,7 +2488,6 @@ static void btrfs_read_locked_inode(struct inode *inode)
2495 struct btrfs_root *root = BTRFS_I(inode)->root; 2488 struct btrfs_root *root = BTRFS_I(inode)->root;
2496 struct btrfs_key location; 2489 struct btrfs_key location;
2497 int maybe_acls; 2490 int maybe_acls;
2498 u64 alloc_group_block;
2499 u32 rdev; 2491 u32 rdev;
2500 int ret; 2492 int ret;
2501 2493
@@ -2539,8 +2531,6 @@ static void btrfs_read_locked_inode(struct inode *inode)
2539 BTRFS_I(inode)->index_cnt = (u64)-1; 2531 BTRFS_I(inode)->index_cnt = (u64)-1;
2540 BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); 2532 BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item);
2541 2533
2542 alloc_group_block = btrfs_inode_block_group(leaf, inode_item);
2543
2544 /* 2534 /*
2545 * try to precache a NULL acl entry for files that don't have 2535 * try to precache a NULL acl entry for files that don't have
2546 * any xattrs or acls 2536 * any xattrs or acls
@@ -2549,8 +2539,6 @@ static void btrfs_read_locked_inode(struct inode *inode)
2549 if (!maybe_acls) 2539 if (!maybe_acls)
2550 cache_no_acl(inode); 2540 cache_no_acl(inode);
2551 2541
2552 BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0,
2553 alloc_group_block, 0);
2554 btrfs_free_path(path); 2542 btrfs_free_path(path);
2555 inode_item = NULL; 2543 inode_item = NULL;
2556 2544
@@ -2630,7 +2618,7 @@ static void fill_inode_item(struct btrfs_trans_handle *trans,
2630 btrfs_set_inode_transid(leaf, item, trans->transid); 2618 btrfs_set_inode_transid(leaf, item, trans->transid);
2631 btrfs_set_inode_rdev(leaf, item, inode->i_rdev); 2619 btrfs_set_inode_rdev(leaf, item, inode->i_rdev);
2632 btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); 2620 btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags);
2633 btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); 2621 btrfs_set_inode_block_group(leaf, item, 0);
2634 2622
2635 if (leaf->map_token) { 2623 if (leaf->map_token) {
2636 unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); 2624 unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
@@ -2971,8 +2959,6 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry)
2971 if (IS_ERR(trans)) 2959 if (IS_ERR(trans))
2972 return PTR_ERR(trans); 2960 return PTR_ERR(trans);
2973 2961
2974 btrfs_set_trans_block_group(trans, dir);
2975
2976 btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); 2962 btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0);
2977 2963
2978 ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, 2964 ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode,
@@ -3068,8 +3054,6 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
3068 if (IS_ERR(trans)) 3054 if (IS_ERR(trans))
3069 return PTR_ERR(trans); 3055 return PTR_ERR(trans);
3070 3056
3071 btrfs_set_trans_block_group(trans, dir);
3072
3073 if (unlikely(inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { 3057 if (unlikely(inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
3074 err = btrfs_unlink_subvol(trans, root, dir, 3058 err = btrfs_unlink_subvol(trans, root, dir,
3075 BTRFS_I(inode)->location.objectid, 3059 BTRFS_I(inode)->location.objectid,
@@ -3649,7 +3633,6 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3649 err = PTR_ERR(trans); 3633 err = PTR_ERR(trans);
3650 break; 3634 break;
3651 } 3635 }
3652 btrfs_set_trans_block_group(trans, inode);
3653 3636
3654 err = btrfs_drop_extents(trans, inode, cur_offset, 3637 err = btrfs_drop_extents(trans, inode, cur_offset,
3655 cur_offset + hole_size, 3638 cur_offset + hole_size,
@@ -3785,7 +3768,6 @@ void btrfs_evict_inode(struct inode *inode)
3785 while (1) { 3768 while (1) {
3786 trans = btrfs_start_transaction(root, 0); 3769 trans = btrfs_start_transaction(root, 0);
3787 BUG_ON(IS_ERR(trans)); 3770 BUG_ON(IS_ERR(trans));
3788 btrfs_set_trans_block_group(trans, inode);
3789 trans->block_rsv = root->orphan_block_rsv; 3771 trans->block_rsv = root->orphan_block_rsv;
3790 3772
3791 ret = btrfs_block_rsv_check(trans, root, 3773 ret = btrfs_block_rsv_check(trans, root,
@@ -4383,7 +4365,6 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc)
4383 trans = btrfs_join_transaction(root); 4365 trans = btrfs_join_transaction(root);
4384 if (IS_ERR(trans)) 4366 if (IS_ERR(trans))
4385 return PTR_ERR(trans); 4367 return PTR_ERR(trans);
4386 btrfs_set_trans_block_group(trans, inode);
4387 if (nolock) 4368 if (nolock)
4388 ret = btrfs_end_transaction_nolock(trans, root); 4369 ret = btrfs_end_transaction_nolock(trans, root);
4389 else 4370 else
@@ -4409,7 +4390,6 @@ void btrfs_dirty_inode(struct inode *inode)
4409 4390
4410 trans = btrfs_join_transaction(root); 4391 trans = btrfs_join_transaction(root);
4411 BUG_ON(IS_ERR(trans)); 4392 BUG_ON(IS_ERR(trans));
4412 btrfs_set_trans_block_group(trans, inode);
4413 4393
4414 ret = btrfs_update_inode(trans, root, inode); 4394 ret = btrfs_update_inode(trans, root, inode);
4415 if (ret && ret == -ENOSPC) { 4395 if (ret && ret == -ENOSPC) {
@@ -4424,7 +4404,6 @@ void btrfs_dirty_inode(struct inode *inode)
4424 } 4404 }
4425 return; 4405 return;
4426 } 4406 }
4427 btrfs_set_trans_block_group(trans, inode);
4428 4407
4429 ret = btrfs_update_inode(trans, root, inode); 4408 ret = btrfs_update_inode(trans, root, inode);
4430 if (ret) { 4409 if (ret) {
@@ -4519,8 +4498,8 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
4519 struct btrfs_root *root, 4498 struct btrfs_root *root,
4520 struct inode *dir, 4499 struct inode *dir,
4521 const char *name, int name_len, 4500 const char *name, int name_len,
4522 u64 ref_objectid, u64 objectid, 4501 u64 ref_objectid, u64 objectid, int mode,
4523 u64 alloc_hint, int mode, u64 *index) 4502 u64 *index)
4524{ 4503{
4525 struct inode *inode; 4504 struct inode *inode;
4526 struct btrfs_inode_item *inode_item; 4505 struct btrfs_inode_item *inode_item;
@@ -4567,8 +4546,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
4567 owner = 0; 4546 owner = 0;
4568 else 4547 else
4569 owner = 1; 4548 owner = 1;
4570 BTRFS_I(inode)->block_group =
4571 btrfs_find_block_group(root, 0, alloc_hint, owner);
4572 4549
4573 key[0].objectid = objectid; 4550 key[0].objectid = objectid;
4574 btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); 4551 btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY);
@@ -4729,11 +4706,9 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
4729 if (IS_ERR(trans)) 4706 if (IS_ERR(trans))
4730 return PTR_ERR(trans); 4707 return PTR_ERR(trans);
4731 4708
4732 btrfs_set_trans_block_group(trans, dir);
4733
4734 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4709 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
4735 dentry->d_name.len, dir->i_ino, objectid, 4710 dentry->d_name.len, dir->i_ino, objectid,
4736 BTRFS_I(dir)->block_group, mode, &index); 4711 mode, &index);
4737 if (IS_ERR(inode)) { 4712 if (IS_ERR(inode)) {
4738 err = PTR_ERR(inode); 4713 err = PTR_ERR(inode);
4739 goto out_unlock; 4714 goto out_unlock;
@@ -4745,7 +4720,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
4745 goto out_unlock; 4720 goto out_unlock;
4746 } 4721 }
4747 4722
4748 btrfs_set_trans_block_group(trans, inode);
4749 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4723 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
4750 if (err) 4724 if (err)
4751 drop_inode = 1; 4725 drop_inode = 1;
@@ -4754,8 +4728,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
4754 init_special_inode(inode, inode->i_mode, rdev); 4728 init_special_inode(inode, inode->i_mode, rdev);
4755 btrfs_update_inode(trans, root, inode); 4729 btrfs_update_inode(trans, root, inode);
4756 } 4730 }
4757 btrfs_update_inode_block_group(trans, inode);
4758 btrfs_update_inode_block_group(trans, dir);
4759out_unlock: 4731out_unlock:
4760 nr = trans->blocks_used; 4732 nr = trans->blocks_used;
4761 btrfs_end_transaction_throttle(trans, root); 4733 btrfs_end_transaction_throttle(trans, root);
@@ -4791,11 +4763,9 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
4791 if (IS_ERR(trans)) 4763 if (IS_ERR(trans))
4792 return PTR_ERR(trans); 4764 return PTR_ERR(trans);
4793 4765
4794 btrfs_set_trans_block_group(trans, dir);
4795
4796 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4766 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
4797 dentry->d_name.len, dir->i_ino, objectid, 4767 dentry->d_name.len, dir->i_ino, objectid,
4798 BTRFS_I(dir)->block_group, mode, &index); 4768 mode, &index);
4799 if (IS_ERR(inode)) { 4769 if (IS_ERR(inode)) {
4800 err = PTR_ERR(inode); 4770 err = PTR_ERR(inode);
4801 goto out_unlock; 4771 goto out_unlock;
@@ -4807,7 +4777,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
4807 goto out_unlock; 4777 goto out_unlock;
4808 } 4778 }
4809 4779
4810 btrfs_set_trans_block_group(trans, inode);
4811 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4780 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
4812 if (err) 4781 if (err)
4813 drop_inode = 1; 4782 drop_inode = 1;
@@ -4818,8 +4787,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
4818 inode->i_op = &btrfs_file_inode_operations; 4787 inode->i_op = &btrfs_file_inode_operations;
4819 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 4788 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
4820 } 4789 }
4821 btrfs_update_inode_block_group(trans, inode);
4822 btrfs_update_inode_block_group(trans, dir);
4823out_unlock: 4790out_unlock:
4824 nr = trans->blocks_used; 4791 nr = trans->blocks_used;
4825 btrfs_end_transaction_throttle(trans, root); 4792 btrfs_end_transaction_throttle(trans, root);
@@ -4866,8 +4833,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
4866 4833
4867 btrfs_inc_nlink(inode); 4834 btrfs_inc_nlink(inode);
4868 inode->i_ctime = CURRENT_TIME; 4835 inode->i_ctime = CURRENT_TIME;
4869
4870 btrfs_set_trans_block_group(trans, dir);
4871 ihold(inode); 4836 ihold(inode);
4872 4837
4873 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); 4838 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index);
@@ -4876,7 +4841,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
4876 drop_inode = 1; 4841 drop_inode = 1;
4877 } else { 4842 } else {
4878 struct dentry *parent = dget_parent(dentry); 4843 struct dentry *parent = dget_parent(dentry);
4879 btrfs_update_inode_block_group(trans, dir);
4880 err = btrfs_update_inode(trans, root, inode); 4844 err = btrfs_update_inode(trans, root, inode);
4881 BUG_ON(err); 4845 BUG_ON(err);
4882 btrfs_log_new_name(trans, inode, NULL, parent); 4846 btrfs_log_new_name(trans, inode, NULL, parent);
@@ -4917,12 +4881,10 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
4917 trans = btrfs_start_transaction(root, 5); 4881 trans = btrfs_start_transaction(root, 5);
4918 if (IS_ERR(trans)) 4882 if (IS_ERR(trans))
4919 return PTR_ERR(trans); 4883 return PTR_ERR(trans);
4920 btrfs_set_trans_block_group(trans, dir);
4921 4884
4922 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4885 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
4923 dentry->d_name.len, dir->i_ino, objectid, 4886 dentry->d_name.len, dir->i_ino, objectid,
4924 BTRFS_I(dir)->block_group, S_IFDIR | mode, 4887 S_IFDIR | mode, &index);
4925 &index);
4926 if (IS_ERR(inode)) { 4888 if (IS_ERR(inode)) {
4927 err = PTR_ERR(inode); 4889 err = PTR_ERR(inode);
4928 goto out_fail; 4890 goto out_fail;
@@ -4936,7 +4898,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
4936 4898
4937 inode->i_op = &btrfs_dir_inode_operations; 4899 inode->i_op = &btrfs_dir_inode_operations;
4938 inode->i_fop = &btrfs_dir_file_operations; 4900 inode->i_fop = &btrfs_dir_file_operations;
4939 btrfs_set_trans_block_group(trans, inode);
4940 4901
4941 btrfs_i_size_write(inode, 0); 4902 btrfs_i_size_write(inode, 0);
4942 err = btrfs_update_inode(trans, root, inode); 4903 err = btrfs_update_inode(trans, root, inode);
@@ -4950,8 +4911,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
4950 4911
4951 d_instantiate(dentry, inode); 4912 d_instantiate(dentry, inode);
4952 drop_on_err = 0; 4913 drop_on_err = 0;
4953 btrfs_update_inode_block_group(trans, inode);
4954 btrfs_update_inode_block_group(trans, dir);
4955 4914
4956out_fail: 4915out_fail:
4957 nr = trans->blocks_used; 4916 nr = trans->blocks_used;
@@ -6652,8 +6611,6 @@ static int btrfs_truncate(struct inode *inode)
6652 goto out; 6611 goto out;
6653 } 6612 }
6654 6613
6655 btrfs_set_trans_block_group(trans, inode);
6656
6657 /* 6614 /*
6658 * Reserve space for the truncate process. Truncate should be adding 6615 * Reserve space for the truncate process. Truncate should be adding
6659 * space, but if there are snapshots it may end up using space. 6616 * space, but if there are snapshots it may end up using space.
@@ -6680,7 +6637,6 @@ static int btrfs_truncate(struct inode *inode)
6680 err = PTR_ERR(trans); 6637 err = PTR_ERR(trans);
6681 goto out; 6638 goto out;
6682 } 6639 }
6683 btrfs_set_trans_block_group(trans, inode);
6684 trans->block_rsv = rsv; 6640 trans->block_rsv = rsv;
6685 6641
6686 /* 6642 /*
@@ -6715,7 +6671,6 @@ static int btrfs_truncate(struct inode *inode)
6715 rsv); 6671 rsv);
6716 BUG_ON(ret); 6672 BUG_ON(ret);
6717 6673
6718 btrfs_set_trans_block_group(trans, inode);
6719 trans->block_rsv = rsv; 6674 trans->block_rsv = rsv;
6720 } 6675 }
6721 6676
@@ -6775,15 +6730,14 @@ out:
6775 * create a new subvolume directory/inode (helper for the ioctl). 6730 * create a new subvolume directory/inode (helper for the ioctl).
6776 */ 6731 */
6777int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, 6732int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
6778 struct btrfs_root *new_root, 6733 struct btrfs_root *new_root, u64 new_dirid)
6779 u64 new_dirid, u64 alloc_hint)
6780{ 6734{
6781 struct inode *inode; 6735 struct inode *inode;
6782 int err; 6736 int err;
6783 u64 index = 0; 6737 u64 index = 0;
6784 6738
6785 inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, 6739 inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid,
6786 new_dirid, alloc_hint, S_IFDIR | 0700, &index); 6740 new_dirid, S_IFDIR | 0700, &index);
6787 if (IS_ERR(inode)) 6741 if (IS_ERR(inode))
6788 return PTR_ERR(inode); 6742 return PTR_ERR(inode);
6789 inode->i_op = &btrfs_dir_inode_operations; 6743 inode->i_op = &btrfs_dir_inode_operations;
@@ -6893,21 +6847,6 @@ void btrfs_destroy_inode(struct inode *inode)
6893 spin_unlock(&root->fs_info->ordered_extent_lock); 6847 spin_unlock(&root->fs_info->ordered_extent_lock);
6894 } 6848 }
6895 6849
6896 if (root == root->fs_info->tree_root) {
6897 struct btrfs_block_group_cache *block_group;
6898
6899 block_group = btrfs_lookup_block_group(root->fs_info,
6900 BTRFS_I(inode)->block_group);
6901 if (block_group && block_group->inode == inode) {
6902 spin_lock(&block_group->lock);
6903 block_group->inode = NULL;
6904 spin_unlock(&block_group->lock);
6905 btrfs_put_block_group(block_group);
6906 } else if (block_group) {
6907 btrfs_put_block_group(block_group);
6908 }
6909 }
6910
6911 spin_lock(&root->orphan_lock); 6850 spin_lock(&root->orphan_lock);
6912 if (!list_empty(&BTRFS_I(inode)->i_orphan)) { 6851 if (!list_empty(&BTRFS_I(inode)->i_orphan)) {
6913 printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n", 6852 printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n",
@@ -7091,8 +7030,6 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
7091 goto out_notrans; 7030 goto out_notrans;
7092 } 7031 }
7093 7032
7094 btrfs_set_trans_block_group(trans, new_dir);
7095
7096 if (dest != root) 7033 if (dest != root)
7097 btrfs_record_root_in_trans(trans, dest); 7034 btrfs_record_root_in_trans(trans, dest);
7098 7035
@@ -7331,12 +7268,9 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
7331 if (IS_ERR(trans)) 7268 if (IS_ERR(trans))
7332 return PTR_ERR(trans); 7269 return PTR_ERR(trans);
7333 7270
7334 btrfs_set_trans_block_group(trans, dir);
7335
7336 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 7271 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name,
7337 dentry->d_name.len, dir->i_ino, objectid, 7272 dentry->d_name.len, dir->i_ino, objectid,
7338 BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, 7273 S_IFLNK|S_IRWXUGO, &index);
7339 &index);
7340 if (IS_ERR(inode)) { 7274 if (IS_ERR(inode)) {
7341 err = PTR_ERR(inode); 7275 err = PTR_ERR(inode);
7342 goto out_unlock; 7276 goto out_unlock;
@@ -7348,7 +7282,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
7348 goto out_unlock; 7282 goto out_unlock;
7349 } 7283 }
7350 7284
7351 btrfs_set_trans_block_group(trans, inode);
7352 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 7285 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
7353 if (err) 7286 if (err)
7354 drop_inode = 1; 7287 drop_inode = 1;
@@ -7359,8 +7292,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
7359 inode->i_op = &btrfs_file_inode_operations; 7292 inode->i_op = &btrfs_file_inode_operations;
7360 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 7293 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
7361 } 7294 }
7362 btrfs_update_inode_block_group(trans, inode);
7363 btrfs_update_inode_block_group(trans, dir);
7364 if (drop_inode) 7295 if (drop_inode)
7365 goto out_unlock; 7296 goto out_unlock;
7366 7297
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index a578620e06a8..8e90ccf4b76a 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -413,8 +413,7 @@ static noinline int create_subvol(struct btrfs_root *root,
413 413
414 btrfs_record_root_in_trans(trans, new_root); 414 btrfs_record_root_in_trans(trans, new_root);
415 415
416 ret = btrfs_create_subvol_root(trans, new_root, new_dirid, 416 ret = btrfs_create_subvol_root(trans, new_root, new_dirid);
417 BTRFS_I(dir)->block_group);
418 /* 417 /*
419 * insert the directory item 418 * insert the directory item
420 */ 419 */
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 43816f8b23e7..f4ea695325b2 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -241,7 +241,6 @@ again:
241 h->transid = cur_trans->transid; 241 h->transid = cur_trans->transid;
242 h->transaction = cur_trans; 242 h->transaction = cur_trans;
243 h->blocks_used = 0; 243 h->blocks_used = 0;
244 h->block_group = 0;
245 h->bytes_reserved = 0; 244 h->bytes_reserved = 0;
246 h->delayed_ref_updates = 0; 245 h->delayed_ref_updates = 0;
247 h->use_count = 1; 246 h->use_count = 1;
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h
index 11c6efcd4ed2..da7289e06a82 100644
--- a/fs/btrfs/transaction.h
+++ b/fs/btrfs/transaction.h
@@ -47,7 +47,6 @@ struct btrfs_transaction {
47 47
48struct btrfs_trans_handle { 48struct btrfs_trans_handle {
49 u64 transid; 49 u64 transid;
50 u64 block_group;
51 u64 bytes_reserved; 50 u64 bytes_reserved;
52 unsigned long use_count; 51 unsigned long use_count;
53 unsigned long blocks_reserved; 52 unsigned long blocks_reserved;
@@ -70,19 +69,6 @@ struct btrfs_pending_snapshot {
70 struct list_head list; 69 struct list_head list;
71}; 70};
72 71
73static inline void btrfs_set_trans_block_group(struct btrfs_trans_handle *trans,
74 struct inode *inode)
75{
76 trans->block_group = BTRFS_I(inode)->block_group;
77}
78
79static inline void btrfs_update_inode_block_group(
80 struct btrfs_trans_handle *trans,
81 struct inode *inode)
82{
83 BTRFS_I(inode)->block_group = trans->block_group;
84}
85
86static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans, 72static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans,
87 struct inode *inode) 73 struct inode *inode)
88{ 74{
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index cfd660550ded..72ab0295ca74 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -158,8 +158,6 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans,
158 if (IS_ERR(trans)) 158 if (IS_ERR(trans))
159 return PTR_ERR(trans); 159 return PTR_ERR(trans);
160 160
161 btrfs_set_trans_block_group(trans, inode);
162
163 ret = do_setxattr(trans, inode, name, value, size, flags); 161 ret = do_setxattr(trans, inode, name, value, size, flags);
164 if (ret) 162 if (ret)
165 goto out; 163 goto out;