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

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>

+13 -110
-3
fs/btrfs/btrfs_inode.h
··· 120 120 */ 121 121 u64 index_cnt; 122 122 123 - /* the start of block group preferred for allocations. */ 124 - u64 block_group; 125 - 126 123 /* the fsync log has some corner cases that mean we have to check 127 124 * directories to see if any unlinks have been done before 128 125 * the directory was logged. See tree-log.c for all the
+1 -2
fs/btrfs/ctree.h
··· 2512 2512 int btrfs_writepages(struct address_space *mapping, 2513 2513 struct writeback_control *wbc); 2514 2514 int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, 2515 - struct btrfs_root *new_root, 2516 - u64 new_dirid, u64 alloc_hint); 2515 + struct btrfs_root *new_root, u64 new_dirid); 2517 2516 int btrfs_merge_bio_hook(struct page *page, unsigned long offset, 2518 2517 size_t size, struct bio *bio, unsigned long bio_flags); 2519 2518
+2 -8
fs/btrfs/extent-tree.c
··· 5319 5319 btrfs_add_free_space(block_group, offset, 5320 5320 search_start - offset); 5321 5321 BUG_ON(offset > search_start); 5322 + btrfs_put_block_group(block_group); 5322 5323 break; 5323 5324 loop: 5324 5325 failed_cluster_refill = false; ··· 5412 5411 ret = -ENOSPC; 5413 5412 } else if (!ins->objectid) { 5414 5413 ret = -ENOSPC; 5415 - } 5416 - 5417 - /* we found what we needed */ 5418 - if (ins->objectid) { 5419 - if (!(data & BTRFS_BLOCK_GROUP_DATA)) 5420 - trans->block_group = block_group->key.objectid; 5421 - 5422 - btrfs_put_block_group(block_group); 5414 + } else if (ins->objectid) { 5423 5415 ret = 0; 5424 5416 } 5425 5417
+9 -78
fs/btrfs/inode.c
··· 136 136 return -ENOMEM; 137 137 138 138 path->leave_spinning = 1; 139 - btrfs_set_trans_block_group(trans, inode); 140 139 141 140 key.objectid = inode->i_ino; 142 141 key.offset = start; ··· 421 422 if (start == 0) { 422 423 trans = btrfs_join_transaction(root); 423 424 BUG_ON(IS_ERR(trans)); 424 - btrfs_set_trans_block_group(trans, inode); 425 425 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 426 426 427 427 /* lets try to make an inline extent */ ··· 779 781 BUG_ON(root == root->fs_info->tree_root); 780 782 trans = btrfs_join_transaction(root); 781 783 BUG_ON(IS_ERR(trans)); 782 - btrfs_set_trans_block_group(trans, inode); 783 784 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 784 785 785 786 num_bytes = (end - start + blocksize) & ~(blocksize - 1); ··· 1499 1502 { 1500 1503 struct btrfs_ordered_sum *sum; 1501 1504 1502 - btrfs_set_trans_block_group(trans, inode); 1503 - 1504 1505 list_for_each_entry(sum, list, list) { 1505 1506 btrfs_csum_file_blocks(trans, 1506 1507 BTRFS_I(inode)->root->fs_info->csum_root, sum); ··· 1717 1722 else 1718 1723 trans = btrfs_join_transaction(root); 1719 1724 BUG_ON(IS_ERR(trans)); 1720 - btrfs_set_trans_block_group(trans, inode); 1721 1725 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1722 1726 ret = btrfs_update_inode(trans, root, inode); 1723 1727 BUG_ON(ret); ··· 1733 1739 else 1734 1740 trans = btrfs_join_transaction(root); 1735 1741 BUG_ON(IS_ERR(trans)); 1736 - btrfs_set_trans_block_group(trans, inode); 1737 1742 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1738 1743 1739 1744 if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) ··· 2488 2495 struct btrfs_root *root = BTRFS_I(inode)->root; 2489 2496 struct btrfs_key location; 2490 2497 int maybe_acls; 2491 - u64 alloc_group_block; 2492 2498 u32 rdev; 2493 2499 int ret; 2494 2500 ··· 2531 2539 BTRFS_I(inode)->index_cnt = (u64)-1; 2532 2540 BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); 2533 2541 2534 - alloc_group_block = btrfs_inode_block_group(leaf, inode_item); 2535 - 2536 2542 /* 2537 2543 * try to precache a NULL acl entry for files that don't have 2538 2544 * any xattrs or acls ··· 2539 2549 if (!maybe_acls) 2540 2550 cache_no_acl(inode); 2541 2551 2542 - BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, 2543 - alloc_group_block, 0); 2544 2552 btrfs_free_path(path); 2545 2553 inode_item = NULL; 2546 2554 ··· 2618 2630 btrfs_set_inode_transid(leaf, item, trans->transid); 2619 2631 btrfs_set_inode_rdev(leaf, item, inode->i_rdev); 2620 2632 btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); 2621 - btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); 2633 + btrfs_set_inode_block_group(leaf, item, 0); 2622 2634 2623 2635 if (leaf->map_token) { 2624 2636 unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); ··· 2959 2971 if (IS_ERR(trans)) 2960 2972 return PTR_ERR(trans); 2961 2973 2962 - btrfs_set_trans_block_group(trans, dir); 2963 - 2964 2974 btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); 2965 2975 2966 2976 ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, ··· 3053 3067 trans = __unlink_start_trans(dir, dentry); 3054 3068 if (IS_ERR(trans)) 3055 3069 return PTR_ERR(trans); 3056 - 3057 - btrfs_set_trans_block_group(trans, dir); 3058 3070 3059 3071 if (unlikely(inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { 3060 3072 err = btrfs_unlink_subvol(trans, root, dir, ··· 3633 3649 err = PTR_ERR(trans); 3634 3650 break; 3635 3651 } 3636 - btrfs_set_trans_block_group(trans, inode); 3637 3652 3638 3653 err = btrfs_drop_extents(trans, inode, cur_offset, 3639 3654 cur_offset + hole_size, ··· 3768 3785 while (1) { 3769 3786 trans = btrfs_start_transaction(root, 0); 3770 3787 BUG_ON(IS_ERR(trans)); 3771 - btrfs_set_trans_block_group(trans, inode); 3772 3788 trans->block_rsv = root->orphan_block_rsv; 3773 3789 3774 3790 ret = btrfs_block_rsv_check(trans, root, ··· 4365 4383 trans = btrfs_join_transaction(root); 4366 4384 if (IS_ERR(trans)) 4367 4385 return PTR_ERR(trans); 4368 - btrfs_set_trans_block_group(trans, inode); 4369 4386 if (nolock) 4370 4387 ret = btrfs_end_transaction_nolock(trans, root); 4371 4388 else ··· 4390 4409 4391 4410 trans = btrfs_join_transaction(root); 4392 4411 BUG_ON(IS_ERR(trans)); 4393 - btrfs_set_trans_block_group(trans, inode); 4394 4412 4395 4413 ret = btrfs_update_inode(trans, root, inode); 4396 4414 if (ret && ret == -ENOSPC) { ··· 4404 4424 } 4405 4425 return; 4406 4426 } 4407 - btrfs_set_trans_block_group(trans, inode); 4408 4427 4409 4428 ret = btrfs_update_inode(trans, root, inode); 4410 4429 if (ret) { ··· 4498 4519 struct btrfs_root *root, 4499 4520 struct inode *dir, 4500 4521 const char *name, int name_len, 4501 - u64 ref_objectid, u64 objectid, 4502 - u64 alloc_hint, int mode, u64 *index) 4522 + u64 ref_objectid, u64 objectid, int mode, 4523 + u64 *index) 4503 4524 { 4504 4525 struct inode *inode; 4505 4526 struct btrfs_inode_item *inode_item; ··· 4546 4567 owner = 0; 4547 4568 else 4548 4569 owner = 1; 4549 - BTRFS_I(inode)->block_group = 4550 - btrfs_find_block_group(root, 0, alloc_hint, owner); 4551 4570 4552 4571 key[0].objectid = objectid; 4553 4572 btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); ··· 4706 4729 if (IS_ERR(trans)) 4707 4730 return PTR_ERR(trans); 4708 4731 4709 - btrfs_set_trans_block_group(trans, dir); 4710 - 4711 4732 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4712 4733 dentry->d_name.len, dir->i_ino, objectid, 4713 - BTRFS_I(dir)->block_group, mode, &index); 4734 + mode, &index); 4714 4735 if (IS_ERR(inode)) { 4715 4736 err = PTR_ERR(inode); 4716 4737 goto out_unlock; ··· 4720 4745 goto out_unlock; 4721 4746 } 4722 4747 4723 - btrfs_set_trans_block_group(trans, inode); 4724 4748 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4725 4749 if (err) 4726 4750 drop_inode = 1; ··· 4728 4754 init_special_inode(inode, inode->i_mode, rdev); 4729 4755 btrfs_update_inode(trans, root, inode); 4730 4756 } 4731 - btrfs_update_inode_block_group(trans, inode); 4732 - btrfs_update_inode_block_group(trans, dir); 4733 4757 out_unlock: 4734 4758 nr = trans->blocks_used; 4735 4759 btrfs_end_transaction_throttle(trans, root); ··· 4763 4791 if (IS_ERR(trans)) 4764 4792 return PTR_ERR(trans); 4765 4793 4766 - btrfs_set_trans_block_group(trans, dir); 4767 - 4768 4794 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4769 4795 dentry->d_name.len, dir->i_ino, objectid, 4770 - BTRFS_I(dir)->block_group, mode, &index); 4796 + mode, &index); 4771 4797 if (IS_ERR(inode)) { 4772 4798 err = PTR_ERR(inode); 4773 4799 goto out_unlock; ··· 4777 4807 goto out_unlock; 4778 4808 } 4779 4809 4780 - btrfs_set_trans_block_group(trans, inode); 4781 4810 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4782 4811 if (err) 4783 4812 drop_inode = 1; ··· 4787 4818 inode->i_op = &btrfs_file_inode_operations; 4788 4819 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 4789 4820 } 4790 - btrfs_update_inode_block_group(trans, inode); 4791 - btrfs_update_inode_block_group(trans, dir); 4792 4821 out_unlock: 4793 4822 nr = trans->blocks_used; 4794 4823 btrfs_end_transaction_throttle(trans, root); ··· 4833 4866 4834 4867 btrfs_inc_nlink(inode); 4835 4868 inode->i_ctime = CURRENT_TIME; 4836 - 4837 - btrfs_set_trans_block_group(trans, dir); 4838 4869 ihold(inode); 4839 4870 4840 4871 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); ··· 4841 4876 drop_inode = 1; 4842 4877 } else { 4843 4878 struct dentry *parent = dget_parent(dentry); 4844 - btrfs_update_inode_block_group(trans, dir); 4845 4879 err = btrfs_update_inode(trans, root, inode); 4846 4880 BUG_ON(err); 4847 4881 btrfs_log_new_name(trans, inode, NULL, parent); ··· 4881 4917 trans = btrfs_start_transaction(root, 5); 4882 4918 if (IS_ERR(trans)) 4883 4919 return PTR_ERR(trans); 4884 - btrfs_set_trans_block_group(trans, dir); 4885 4920 4886 4921 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 4887 4922 dentry->d_name.len, dir->i_ino, objectid, 4888 - BTRFS_I(dir)->block_group, S_IFDIR | mode, 4889 - &index); 4923 + S_IFDIR | mode, &index); 4890 4924 if (IS_ERR(inode)) { 4891 4925 err = PTR_ERR(inode); 4892 4926 goto out_fail; ··· 4898 4936 4899 4937 inode->i_op = &btrfs_dir_inode_operations; 4900 4938 inode->i_fop = &btrfs_dir_file_operations; 4901 - btrfs_set_trans_block_group(trans, inode); 4902 4939 4903 4940 btrfs_i_size_write(inode, 0); 4904 4941 err = btrfs_update_inode(trans, root, inode); ··· 4911 4950 4912 4951 d_instantiate(dentry, inode); 4913 4952 drop_on_err = 0; 4914 - btrfs_update_inode_block_group(trans, inode); 4915 - btrfs_update_inode_block_group(trans, dir); 4916 4953 4917 4954 out_fail: 4918 4955 nr = trans->blocks_used; ··· 6611 6652 goto out; 6612 6653 } 6613 6654 6614 - btrfs_set_trans_block_group(trans, inode); 6615 - 6616 6655 /* 6617 6656 * Reserve space for the truncate process. Truncate should be adding 6618 6657 * space, but if there are snapshots it may end up using space. ··· 6637 6680 err = PTR_ERR(trans); 6638 6681 goto out; 6639 6682 } 6640 - btrfs_set_trans_block_group(trans, inode); 6641 6683 trans->block_rsv = rsv; 6642 6684 6643 6685 /* ··· 6671 6715 rsv); 6672 6716 BUG_ON(ret); 6673 6717 6674 - btrfs_set_trans_block_group(trans, inode); 6675 6718 trans->block_rsv = rsv; 6676 6719 } 6677 6720 ··· 6730 6775 * create a new subvolume directory/inode (helper for the ioctl). 6731 6776 */ 6732 6777 int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, 6733 - struct btrfs_root *new_root, 6734 - u64 new_dirid, u64 alloc_hint) 6778 + struct btrfs_root *new_root, u64 new_dirid) 6735 6779 { 6736 6780 struct inode *inode; 6737 6781 int err; 6738 6782 u64 index = 0; 6739 6783 6740 6784 inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, 6741 - new_dirid, alloc_hint, S_IFDIR | 0700, &index); 6785 + new_dirid, S_IFDIR | 0700, &index); 6742 6786 if (IS_ERR(inode)) 6743 6787 return PTR_ERR(inode); 6744 6788 inode->i_op = &btrfs_dir_inode_operations; ··· 6845 6891 spin_lock(&root->fs_info->ordered_extent_lock); 6846 6892 list_del_init(&BTRFS_I(inode)->ordered_operations); 6847 6893 spin_unlock(&root->fs_info->ordered_extent_lock); 6848 - } 6849 - 6850 - if (root == root->fs_info->tree_root) { 6851 - struct btrfs_block_group_cache *block_group; 6852 - 6853 - block_group = btrfs_lookup_block_group(root->fs_info, 6854 - BTRFS_I(inode)->block_group); 6855 - if (block_group && block_group->inode == inode) { 6856 - spin_lock(&block_group->lock); 6857 - block_group->inode = NULL; 6858 - spin_unlock(&block_group->lock); 6859 - btrfs_put_block_group(block_group); 6860 - } else if (block_group) { 6861 - btrfs_put_block_group(block_group); 6862 - } 6863 6894 } 6864 6895 6865 6896 spin_lock(&root->orphan_lock); ··· 7029 7090 ret = PTR_ERR(trans); 7030 7091 goto out_notrans; 7031 7092 } 7032 - 7033 - btrfs_set_trans_block_group(trans, new_dir); 7034 7093 7035 7094 if (dest != root) 7036 7095 btrfs_record_root_in_trans(trans, dest); ··· 7268 7331 if (IS_ERR(trans)) 7269 7332 return PTR_ERR(trans); 7270 7333 7271 - btrfs_set_trans_block_group(trans, dir); 7272 - 7273 7334 inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, 7274 7335 dentry->d_name.len, dir->i_ino, objectid, 7275 - BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, 7276 - &index); 7336 + S_IFLNK|S_IRWXUGO, &index); 7277 7337 if (IS_ERR(inode)) { 7278 7338 err = PTR_ERR(inode); 7279 7339 goto out_unlock; ··· 7282 7348 goto out_unlock; 7283 7349 } 7284 7350 7285 - btrfs_set_trans_block_group(trans, inode); 7286 7351 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 7287 7352 if (err) 7288 7353 drop_inode = 1; ··· 7292 7359 inode->i_op = &btrfs_file_inode_operations; 7293 7360 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 7294 7361 } 7295 - btrfs_update_inode_block_group(trans, inode); 7296 - btrfs_update_inode_block_group(trans, dir); 7297 7362 if (drop_inode) 7298 7363 goto out_unlock; 7299 7364
+1 -2
fs/btrfs/ioctl.c
··· 413 413 414 414 btrfs_record_root_in_trans(trans, new_root); 415 415 416 - ret = btrfs_create_subvol_root(trans, new_root, new_dirid, 417 - BTRFS_I(dir)->block_group); 416 + ret = btrfs_create_subvol_root(trans, new_root, new_dirid); 418 417 /* 419 418 * insert the directory item 420 419 */
-1
fs/btrfs/transaction.c
··· 241 241 h->transid = cur_trans->transid; 242 242 h->transaction = cur_trans; 243 243 h->blocks_used = 0; 244 - h->block_group = 0; 245 244 h->bytes_reserved = 0; 246 245 h->delayed_ref_updates = 0; 247 246 h->use_count = 1;
-14
fs/btrfs/transaction.h
··· 47 47 48 48 struct btrfs_trans_handle { 49 49 u64 transid; 50 - u64 block_group; 51 50 u64 bytes_reserved; 52 51 unsigned long use_count; 53 52 unsigned long blocks_reserved; ··· 68 69 bool readonly; 69 70 struct list_head list; 70 71 }; 71 - 72 - static inline void btrfs_set_trans_block_group(struct btrfs_trans_handle *trans, 73 - struct inode *inode) 74 - { 75 - trans->block_group = BTRFS_I(inode)->block_group; 76 - } 77 - 78 - static inline void btrfs_update_inode_block_group( 79 - struct btrfs_trans_handle *trans, 80 - struct inode *inode) 81 - { 82 - BTRFS_I(inode)->block_group = trans->block_group; 83 - } 84 72 85 73 static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans, 86 74 struct inode *inode)
-2
fs/btrfs/xattr.c
··· 158 158 if (IS_ERR(trans)) 159 159 return PTR_ERR(trans); 160 160 161 - btrfs_set_trans_block_group(trans, inode); 162 - 163 161 ret = do_setxattr(trans, inode, name, value, size, flags); 164 162 if (ret) 165 163 goto out;