diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 261 |
1 files changed, 137 insertions, 124 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 39a9d5750efd..ebf95f7a44d6 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -138,7 +138,6 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
138 | return -ENOMEM; | 138 | return -ENOMEM; |
139 | 139 | ||
140 | path->leave_spinning = 1; | 140 | path->leave_spinning = 1; |
141 | btrfs_set_trans_block_group(trans, inode); | ||
142 | 141 | ||
143 | key.objectid = btrfs_ino(inode); | 142 | key.objectid = btrfs_ino(inode); |
144 | key.offset = start; | 143 | key.offset = start; |
@@ -426,9 +425,8 @@ again: | |||
426 | } | 425 | } |
427 | } | 426 | } |
428 | if (start == 0) { | 427 | if (start == 0) { |
429 | trans = btrfs_join_transaction(root, 1); | 428 | trans = btrfs_join_transaction(root); |
430 | BUG_ON(IS_ERR(trans)); | 429 | BUG_ON(IS_ERR(trans)); |
431 | btrfs_set_trans_block_group(trans, inode); | ||
432 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 430 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
433 | 431 | ||
434 | /* lets try to make an inline extent */ | 432 | /* lets try to make an inline extent */ |
@@ -623,8 +621,9 @@ retry: | |||
623 | async_extent->start + async_extent->ram_size - 1, | 621 | async_extent->start + async_extent->ram_size - 1, |
624 | GFP_NOFS); | 622 | GFP_NOFS); |
625 | 623 | ||
626 | trans = btrfs_join_transaction(root, 1); | 624 | trans = btrfs_join_transaction(root); |
627 | BUG_ON(IS_ERR(trans)); | 625 | BUG_ON(IS_ERR(trans)); |
626 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
628 | ret = btrfs_reserve_extent(trans, root, | 627 | ret = btrfs_reserve_extent(trans, root, |
629 | async_extent->compressed_size, | 628 | async_extent->compressed_size, |
630 | async_extent->compressed_size, | 629 | async_extent->compressed_size, |
@@ -793,9 +792,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
793 | int ret = 0; | 792 | int ret = 0; |
794 | 793 | ||
795 | BUG_ON(is_free_space_inode(root, inode)); | 794 | BUG_ON(is_free_space_inode(root, inode)); |
796 | trans = btrfs_join_transaction(root, 1); | 795 | trans = btrfs_join_transaction(root); |
797 | BUG_ON(IS_ERR(trans)); | 796 | BUG_ON(IS_ERR(trans)); |
798 | btrfs_set_trans_block_group(trans, inode); | ||
799 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 797 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
800 | 798 | ||
801 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 799 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
@@ -1077,10 +1075,12 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1077 | nolock = is_free_space_inode(root, inode); | 1075 | nolock = is_free_space_inode(root, inode); |
1078 | 1076 | ||
1079 | if (nolock) | 1077 | if (nolock) |
1080 | trans = btrfs_join_transaction_nolock(root, 1); | 1078 | trans = btrfs_join_transaction_nolock(root); |
1081 | else | 1079 | else |
1082 | trans = btrfs_join_transaction(root, 1); | 1080 | trans = btrfs_join_transaction(root); |
1081 | |||
1083 | BUG_ON(IS_ERR(trans)); | 1082 | BUG_ON(IS_ERR(trans)); |
1083 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
1084 | 1084 | ||
1085 | cow_start = (u64)-1; | 1085 | cow_start = (u64)-1; |
1086 | cur_offset = start; | 1086 | cur_offset = start; |
@@ -1519,8 +1519,6 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, | |||
1519 | { | 1519 | { |
1520 | struct btrfs_ordered_sum *sum; | 1520 | struct btrfs_ordered_sum *sum; |
1521 | 1521 | ||
1522 | btrfs_set_trans_block_group(trans, inode); | ||
1523 | |||
1524 | list_for_each_entry(sum, list, list) { | 1522 | list_for_each_entry(sum, list, list) { |
1525 | btrfs_csum_file_blocks(trans, | 1523 | btrfs_csum_file_blocks(trans, |
1526 | BTRFS_I(inode)->root->fs_info->csum_root, sum); | 1524 | BTRFS_I(inode)->root->fs_info->csum_root, sum); |
@@ -1735,11 +1733,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1735 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1733 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1736 | if (!ret) { | 1734 | if (!ret) { |
1737 | if (nolock) | 1735 | if (nolock) |
1738 | trans = btrfs_join_transaction_nolock(root, 1); | 1736 | trans = btrfs_join_transaction_nolock(root); |
1739 | else | 1737 | else |
1740 | trans = btrfs_join_transaction(root, 1); | 1738 | trans = btrfs_join_transaction(root); |
1741 | BUG_ON(IS_ERR(trans)); | 1739 | BUG_ON(IS_ERR(trans)); |
1742 | btrfs_set_trans_block_group(trans, inode); | ||
1743 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1740 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1744 | ret = btrfs_update_inode(trans, root, inode); | 1741 | ret = btrfs_update_inode(trans, root, inode); |
1745 | BUG_ON(ret); | 1742 | BUG_ON(ret); |
@@ -1752,11 +1749,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1752 | 0, &cached_state, GFP_NOFS); | 1749 | 0, &cached_state, GFP_NOFS); |
1753 | 1750 | ||
1754 | if (nolock) | 1751 | if (nolock) |
1755 | trans = btrfs_join_transaction_nolock(root, 1); | 1752 | trans = btrfs_join_transaction_nolock(root); |
1756 | else | 1753 | else |
1757 | trans = btrfs_join_transaction(root, 1); | 1754 | trans = btrfs_join_transaction(root); |
1758 | BUG_ON(IS_ERR(trans)); | 1755 | BUG_ON(IS_ERR(trans)); |
1759 | btrfs_set_trans_block_group(trans, inode); | ||
1760 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1756 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1761 | 1757 | ||
1762 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) | 1758 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) |
@@ -2431,7 +2427,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2431 | (u64)-1); | 2427 | (u64)-1); |
2432 | 2428 | ||
2433 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2429 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2434 | trans = btrfs_join_transaction(root, 1); | 2430 | trans = btrfs_join_transaction(root); |
2435 | if (!IS_ERR(trans)) | 2431 | if (!IS_ERR(trans)) |
2436 | btrfs_end_transaction(trans, root); | 2432 | btrfs_end_transaction(trans, root); |
2437 | } | 2433 | } |
@@ -2511,12 +2507,12 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2511 | struct btrfs_root *root = BTRFS_I(inode)->root; | 2507 | struct btrfs_root *root = BTRFS_I(inode)->root; |
2512 | struct btrfs_key location; | 2508 | struct btrfs_key location; |
2513 | int maybe_acls; | 2509 | int maybe_acls; |
2514 | u64 alloc_group_block; | ||
2515 | u32 rdev; | 2510 | u32 rdev; |
2516 | int ret; | 2511 | int ret; |
2517 | 2512 | ||
2518 | path = btrfs_alloc_path(); | 2513 | path = btrfs_alloc_path(); |
2519 | BUG_ON(!path); | 2514 | BUG_ON(!path); |
2515 | path->leave_spinning = 1; | ||
2520 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); | 2516 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); |
2521 | 2517 | ||
2522 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); | 2518 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); |
@@ -2526,6 +2522,12 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2526 | leaf = path->nodes[0]; | 2522 | leaf = path->nodes[0]; |
2527 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2523 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2528 | struct btrfs_inode_item); | 2524 | struct btrfs_inode_item); |
2525 | if (!leaf->map_token) | ||
2526 | map_private_extent_buffer(leaf, (unsigned long)inode_item, | ||
2527 | sizeof(struct btrfs_inode_item), | ||
2528 | &leaf->map_token, &leaf->kaddr, | ||
2529 | &leaf->map_start, &leaf->map_len, | ||
2530 | KM_USER1); | ||
2529 | 2531 | ||
2530 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); | 2532 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); |
2531 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); | 2533 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); |
@@ -2555,8 +2557,6 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2555 | BTRFS_I(inode)->index_cnt = (u64)-1; | 2557 | BTRFS_I(inode)->index_cnt = (u64)-1; |
2556 | BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); | 2558 | BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); |
2557 | 2559 | ||
2558 | alloc_group_block = btrfs_inode_block_group(leaf, inode_item); | ||
2559 | |||
2560 | /* | 2560 | /* |
2561 | * try to precache a NULL acl entry for files that don't have | 2561 | * try to precache a NULL acl entry for files that don't have |
2562 | * any xattrs or acls | 2562 | * any xattrs or acls |
@@ -2566,8 +2566,11 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2566 | if (!maybe_acls) | 2566 | if (!maybe_acls) |
2567 | cache_no_acl(inode); | 2567 | cache_no_acl(inode); |
2568 | 2568 | ||
2569 | BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, | 2569 | if (leaf->map_token) { |
2570 | alloc_group_block, 0); | 2570 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); |
2571 | leaf->map_token = NULL; | ||
2572 | } | ||
2573 | |||
2571 | btrfs_free_path(path); | 2574 | btrfs_free_path(path); |
2572 | inode_item = NULL; | 2575 | inode_item = NULL; |
2573 | 2576 | ||
@@ -2647,7 +2650,7 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2647 | btrfs_set_inode_transid(leaf, item, trans->transid); | 2650 | btrfs_set_inode_transid(leaf, item, trans->transid); |
2648 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2651 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2649 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2652 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2650 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); | 2653 | btrfs_set_inode_block_group(leaf, item, 0); |
2651 | 2654 | ||
2652 | if (leaf->map_token) { | 2655 | if (leaf->map_token) { |
2653 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | 2656 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); |
@@ -3004,8 +3007,6 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry) | |||
3004 | if (IS_ERR(trans)) | 3007 | if (IS_ERR(trans)) |
3005 | return PTR_ERR(trans); | 3008 | return PTR_ERR(trans); |
3006 | 3009 | ||
3007 | btrfs_set_trans_block_group(trans, dir); | ||
3008 | |||
3009 | btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); | 3010 | btrfs_record_unlink_dir(trans, dir, dentry->d_inode, 0); |
3010 | 3011 | ||
3011 | ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, | 3012 | ret = btrfs_unlink_inode(trans, root, dir, dentry->d_inode, |
@@ -3094,8 +3095,6 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
3094 | if (IS_ERR(trans)) | 3095 | if (IS_ERR(trans)) |
3095 | return PTR_ERR(trans); | 3096 | return PTR_ERR(trans); |
3096 | 3097 | ||
3097 | btrfs_set_trans_block_group(trans, dir); | ||
3098 | |||
3099 | if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { | 3098 | if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { |
3100 | err = btrfs_unlink_subvol(trans, root, dir, | 3099 | err = btrfs_unlink_subvol(trans, root, dir, |
3101 | BTRFS_I(inode)->location.objectid, | 3100 | BTRFS_I(inode)->location.objectid, |
@@ -3514,7 +3513,6 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
3514 | err = PTR_ERR(trans); | 3513 | err = PTR_ERR(trans); |
3515 | break; | 3514 | break; |
3516 | } | 3515 | } |
3517 | btrfs_set_trans_block_group(trans, inode); | ||
3518 | 3516 | ||
3519 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3517 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3520 | cur_offset + hole_size, | 3518 | cur_offset + hole_size, |
@@ -3650,7 +3648,6 @@ void btrfs_evict_inode(struct inode *inode) | |||
3650 | while (1) { | 3648 | while (1) { |
3651 | trans = btrfs_start_transaction(root, 0); | 3649 | trans = btrfs_start_transaction(root, 0); |
3652 | BUG_ON(IS_ERR(trans)); | 3650 | BUG_ON(IS_ERR(trans)); |
3653 | btrfs_set_trans_block_group(trans, inode); | ||
3654 | trans->block_rsv = root->orphan_block_rsv; | 3651 | trans->block_rsv = root->orphan_block_rsv; |
3655 | 3652 | ||
3656 | ret = btrfs_block_rsv_check(trans, root, | 3653 | ret = btrfs_block_rsv_check(trans, root, |
@@ -4133,7 +4130,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4133 | path = btrfs_alloc_path(); | 4130 | path = btrfs_alloc_path(); |
4134 | if (!path) | 4131 | if (!path) |
4135 | return -ENOMEM; | 4132 | return -ENOMEM; |
4136 | path->reada = 2; | 4133 | |
4134 | path->reada = 1; | ||
4137 | 4135 | ||
4138 | if (key_type == BTRFS_DIR_INDEX_KEY) { | 4136 | if (key_type == BTRFS_DIR_INDEX_KEY) { |
4139 | INIT_LIST_HEAD(&ins_list); | 4137 | INIT_LIST_HEAD(&ins_list); |
@@ -4268,18 +4266,16 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4268 | if (BTRFS_I(inode)->dummy_inode) | 4266 | if (BTRFS_I(inode)->dummy_inode) |
4269 | return 0; | 4267 | return 0; |
4270 | 4268 | ||
4271 | smp_mb(); | 4269 | if (btrfs_fs_closing(root->fs_info) && is_free_space_inode(root, inode)) |
4272 | if (root->fs_info->closing && is_free_space_inode(root, inode)) | ||
4273 | nolock = true; | 4270 | nolock = true; |
4274 | 4271 | ||
4275 | if (wbc->sync_mode == WB_SYNC_ALL) { | 4272 | if (wbc->sync_mode == WB_SYNC_ALL) { |
4276 | if (nolock) | 4273 | if (nolock) |
4277 | trans = btrfs_join_transaction_nolock(root, 1); | 4274 | trans = btrfs_join_transaction_nolock(root); |
4278 | else | 4275 | else |
4279 | trans = btrfs_join_transaction(root, 1); | 4276 | trans = btrfs_join_transaction(root); |
4280 | if (IS_ERR(trans)) | 4277 | if (IS_ERR(trans)) |
4281 | return PTR_ERR(trans); | 4278 | return PTR_ERR(trans); |
4282 | btrfs_set_trans_block_group(trans, inode); | ||
4283 | if (nolock) | 4279 | if (nolock) |
4284 | ret = btrfs_end_transaction_nolock(trans, root); | 4280 | ret = btrfs_end_transaction_nolock(trans, root); |
4285 | else | 4281 | else |
@@ -4303,9 +4299,8 @@ void btrfs_dirty_inode(struct inode *inode, int flags) | |||
4303 | if (BTRFS_I(inode)->dummy_inode) | 4299 | if (BTRFS_I(inode)->dummy_inode) |
4304 | return; | 4300 | return; |
4305 | 4301 | ||
4306 | trans = btrfs_join_transaction(root, 1); | 4302 | trans = btrfs_join_transaction(root); |
4307 | BUG_ON(IS_ERR(trans)); | 4303 | BUG_ON(IS_ERR(trans)); |
4308 | btrfs_set_trans_block_group(trans, inode); | ||
4309 | 4304 | ||
4310 | ret = btrfs_update_inode(trans, root, inode); | 4305 | ret = btrfs_update_inode(trans, root, inode); |
4311 | if (ret && ret == -ENOSPC) { | 4306 | if (ret && ret == -ENOSPC) { |
@@ -4319,7 +4314,6 @@ void btrfs_dirty_inode(struct inode *inode, int flags) | |||
4319 | PTR_ERR(trans)); | 4314 | PTR_ERR(trans)); |
4320 | return; | 4315 | return; |
4321 | } | 4316 | } |
4322 | btrfs_set_trans_block_group(trans, inode); | ||
4323 | 4317 | ||
4324 | ret = btrfs_update_inode(trans, root, inode); | 4318 | ret = btrfs_update_inode(trans, root, inode); |
4325 | if (ret) { | 4319 | if (ret) { |
@@ -4418,8 +4412,8 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4418 | struct btrfs_root *root, | 4412 | struct btrfs_root *root, |
4419 | struct inode *dir, | 4413 | struct inode *dir, |
4420 | const char *name, int name_len, | 4414 | const char *name, int name_len, |
4421 | u64 ref_objectid, u64 objectid, | 4415 | u64 ref_objectid, u64 objectid, int mode, |
4422 | u64 alloc_hint, int mode, u64 *index) | 4416 | u64 *index) |
4423 | { | 4417 | { |
4424 | struct inode *inode; | 4418 | struct inode *inode; |
4425 | struct btrfs_inode_item *inode_item; | 4419 | struct btrfs_inode_item *inode_item; |
@@ -4472,8 +4466,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4472 | owner = 0; | 4466 | owner = 0; |
4473 | else | 4467 | else |
4474 | owner = 1; | 4468 | owner = 1; |
4475 | BTRFS_I(inode)->block_group = | ||
4476 | btrfs_find_block_group(root, 0, alloc_hint, owner); | ||
4477 | 4469 | ||
4478 | key[0].objectid = objectid; | 4470 | key[0].objectid = objectid; |
4479 | btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); | 4471 | btrfs_set_key_type(&key[0], BTRFS_INODE_ITEM_KEY); |
@@ -4629,15 +4621,13 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4629 | if (IS_ERR(trans)) | 4621 | if (IS_ERR(trans)) |
4630 | return PTR_ERR(trans); | 4622 | return PTR_ERR(trans); |
4631 | 4623 | ||
4632 | btrfs_set_trans_block_group(trans, dir); | ||
4633 | |||
4634 | err = btrfs_find_free_ino(root, &objectid); | 4624 | err = btrfs_find_free_ino(root, &objectid); |
4635 | if (err) | 4625 | if (err) |
4636 | goto out_unlock; | 4626 | goto out_unlock; |
4637 | 4627 | ||
4638 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4628 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4639 | dentry->d_name.len, btrfs_ino(dir), objectid, | 4629 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4640 | BTRFS_I(dir)->block_group, mode, &index); | 4630 | mode, &index); |
4641 | if (IS_ERR(inode)) { | 4631 | if (IS_ERR(inode)) { |
4642 | err = PTR_ERR(inode); | 4632 | err = PTR_ERR(inode); |
4643 | goto out_unlock; | 4633 | goto out_unlock; |
@@ -4649,7 +4639,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4649 | goto out_unlock; | 4639 | goto out_unlock; |
4650 | } | 4640 | } |
4651 | 4641 | ||
4652 | btrfs_set_trans_block_group(trans, inode); | ||
4653 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 4642 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
4654 | if (err) | 4643 | if (err) |
4655 | drop_inode = 1; | 4644 | drop_inode = 1; |
@@ -4658,8 +4647,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4658 | init_special_inode(inode, inode->i_mode, rdev); | 4647 | init_special_inode(inode, inode->i_mode, rdev); |
4659 | btrfs_update_inode(trans, root, inode); | 4648 | btrfs_update_inode(trans, root, inode); |
4660 | } | 4649 | } |
4661 | btrfs_update_inode_block_group(trans, inode); | ||
4662 | btrfs_update_inode_block_group(trans, dir); | ||
4663 | out_unlock: | 4650 | out_unlock: |
4664 | nr = trans->blocks_used; | 4651 | nr = trans->blocks_used; |
4665 | btrfs_end_transaction_throttle(trans, root); | 4652 | btrfs_end_transaction_throttle(trans, root); |
@@ -4692,15 +4679,13 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4692 | if (IS_ERR(trans)) | 4679 | if (IS_ERR(trans)) |
4693 | return PTR_ERR(trans); | 4680 | return PTR_ERR(trans); |
4694 | 4681 | ||
4695 | btrfs_set_trans_block_group(trans, dir); | ||
4696 | |||
4697 | err = btrfs_find_free_ino(root, &objectid); | 4682 | err = btrfs_find_free_ino(root, &objectid); |
4698 | if (err) | 4683 | if (err) |
4699 | goto out_unlock; | 4684 | goto out_unlock; |
4700 | 4685 | ||
4701 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4686 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4702 | dentry->d_name.len, btrfs_ino(dir), objectid, | 4687 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4703 | BTRFS_I(dir)->block_group, mode, &index); | 4688 | mode, &index); |
4704 | if (IS_ERR(inode)) { | 4689 | if (IS_ERR(inode)) { |
4705 | err = PTR_ERR(inode); | 4690 | err = PTR_ERR(inode); |
4706 | goto out_unlock; | 4691 | goto out_unlock; |
@@ -4712,7 +4697,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4712 | goto out_unlock; | 4697 | goto out_unlock; |
4713 | } | 4698 | } |
4714 | 4699 | ||
4715 | btrfs_set_trans_block_group(trans, inode); | ||
4716 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 4700 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
4717 | if (err) | 4701 | if (err) |
4718 | drop_inode = 1; | 4702 | drop_inode = 1; |
@@ -4723,8 +4707,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4723 | inode->i_op = &btrfs_file_inode_operations; | 4707 | inode->i_op = &btrfs_file_inode_operations; |
4724 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 4708 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
4725 | } | 4709 | } |
4726 | btrfs_update_inode_block_group(trans, inode); | ||
4727 | btrfs_update_inode_block_group(trans, dir); | ||
4728 | out_unlock: | 4710 | out_unlock: |
4729 | nr = trans->blocks_used; | 4711 | nr = trans->blocks_used; |
4730 | btrfs_end_transaction_throttle(trans, root); | 4712 | btrfs_end_transaction_throttle(trans, root); |
@@ -4771,8 +4753,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4771 | 4753 | ||
4772 | btrfs_inc_nlink(inode); | 4754 | btrfs_inc_nlink(inode); |
4773 | inode->i_ctime = CURRENT_TIME; | 4755 | inode->i_ctime = CURRENT_TIME; |
4774 | |||
4775 | btrfs_set_trans_block_group(trans, dir); | ||
4776 | ihold(inode); | 4756 | ihold(inode); |
4777 | 4757 | ||
4778 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); | 4758 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); |
@@ -4781,7 +4761,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4781 | drop_inode = 1; | 4761 | drop_inode = 1; |
4782 | } else { | 4762 | } else { |
4783 | struct dentry *parent = dget_parent(dentry); | 4763 | struct dentry *parent = dget_parent(dentry); |
4784 | btrfs_update_inode_block_group(trans, dir); | ||
4785 | err = btrfs_update_inode(trans, root, inode); | 4764 | err = btrfs_update_inode(trans, root, inode); |
4786 | BUG_ON(err); | 4765 | BUG_ON(err); |
4787 | btrfs_log_new_name(trans, inode, NULL, parent); | 4766 | btrfs_log_new_name(trans, inode, NULL, parent); |
@@ -4818,7 +4797,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4818 | trans = btrfs_start_transaction(root, 5); | 4797 | trans = btrfs_start_transaction(root, 5); |
4819 | if (IS_ERR(trans)) | 4798 | if (IS_ERR(trans)) |
4820 | return PTR_ERR(trans); | 4799 | return PTR_ERR(trans); |
4821 | btrfs_set_trans_block_group(trans, dir); | ||
4822 | 4800 | ||
4823 | err = btrfs_find_free_ino(root, &objectid); | 4801 | err = btrfs_find_free_ino(root, &objectid); |
4824 | if (err) | 4802 | if (err) |
@@ -4826,8 +4804,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4826 | 4804 | ||
4827 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4805 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4828 | dentry->d_name.len, btrfs_ino(dir), objectid, | 4806 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4829 | BTRFS_I(dir)->block_group, S_IFDIR | mode, | 4807 | S_IFDIR | mode, &index); |
4830 | &index); | ||
4831 | if (IS_ERR(inode)) { | 4808 | if (IS_ERR(inode)) { |
4832 | err = PTR_ERR(inode); | 4809 | err = PTR_ERR(inode); |
4833 | goto out_fail; | 4810 | goto out_fail; |
@@ -4841,7 +4818,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4841 | 4818 | ||
4842 | inode->i_op = &btrfs_dir_inode_operations; | 4819 | inode->i_op = &btrfs_dir_inode_operations; |
4843 | inode->i_fop = &btrfs_dir_file_operations; | 4820 | inode->i_fop = &btrfs_dir_file_operations; |
4844 | btrfs_set_trans_block_group(trans, inode); | ||
4845 | 4821 | ||
4846 | btrfs_i_size_write(inode, 0); | 4822 | btrfs_i_size_write(inode, 0); |
4847 | err = btrfs_update_inode(trans, root, inode); | 4823 | err = btrfs_update_inode(trans, root, inode); |
@@ -4855,8 +4831,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4855 | 4831 | ||
4856 | d_instantiate(dentry, inode); | 4832 | d_instantiate(dentry, inode); |
4857 | drop_on_err = 0; | 4833 | drop_on_err = 0; |
4858 | btrfs_update_inode_block_group(trans, inode); | ||
4859 | btrfs_update_inode_block_group(trans, dir); | ||
4860 | 4834 | ||
4861 | out_fail: | 4835 | out_fail: |
4862 | nr = trans->blocks_used; | 4836 | nr = trans->blocks_used; |
@@ -4989,7 +4963,15 @@ again: | |||
4989 | 4963 | ||
4990 | if (!path) { | 4964 | if (!path) { |
4991 | path = btrfs_alloc_path(); | 4965 | path = btrfs_alloc_path(); |
4992 | BUG_ON(!path); | 4966 | if (!path) { |
4967 | err = -ENOMEM; | ||
4968 | goto out; | ||
4969 | } | ||
4970 | /* | ||
4971 | * Chances are we'll be called again, so go ahead and do | ||
4972 | * readahead | ||
4973 | */ | ||
4974 | path->reada = 1; | ||
4993 | } | 4975 | } |
4994 | 4976 | ||
4995 | ret = btrfs_lookup_file_extent(trans, root, path, | 4977 | ret = btrfs_lookup_file_extent(trans, root, path, |
@@ -5130,8 +5112,10 @@ again: | |||
5130 | kunmap(page); | 5112 | kunmap(page); |
5131 | free_extent_map(em); | 5113 | free_extent_map(em); |
5132 | em = NULL; | 5114 | em = NULL; |
5115 | |||
5133 | btrfs_release_path(path); | 5116 | btrfs_release_path(path); |
5134 | trans = btrfs_join_transaction(root, 1); | 5117 | trans = btrfs_join_transaction(root); |
5118 | |||
5135 | if (IS_ERR(trans)) | 5119 | if (IS_ERR(trans)) |
5136 | return ERR_CAST(trans); | 5120 | return ERR_CAST(trans); |
5137 | goto again; | 5121 | goto again; |
@@ -5375,7 +5359,7 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5375 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5359 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); |
5376 | } | 5360 | } |
5377 | 5361 | ||
5378 | trans = btrfs_join_transaction(root, 0); | 5362 | trans = btrfs_join_transaction(root); |
5379 | if (IS_ERR(trans)) | 5363 | if (IS_ERR(trans)) |
5380 | return ERR_CAST(trans); | 5364 | return ERR_CAST(trans); |
5381 | 5365 | ||
@@ -5611,7 +5595,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
5611 | * to make sure the current transaction stays open | 5595 | * to make sure the current transaction stays open |
5612 | * while we look for nocow cross refs | 5596 | * while we look for nocow cross refs |
5613 | */ | 5597 | */ |
5614 | trans = btrfs_join_transaction(root, 0); | 5598 | trans = btrfs_join_transaction(root); |
5615 | if (IS_ERR(trans)) | 5599 | if (IS_ERR(trans)) |
5616 | goto must_cow; | 5600 | goto must_cow; |
5617 | 5601 | ||
@@ -5750,7 +5734,7 @@ again: | |||
5750 | 5734 | ||
5751 | BUG_ON(!ordered); | 5735 | BUG_ON(!ordered); |
5752 | 5736 | ||
5753 | trans = btrfs_join_transaction(root, 1); | 5737 | trans = btrfs_join_transaction(root); |
5754 | if (IS_ERR(trans)) { | 5738 | if (IS_ERR(trans)) { |
5755 | err = -ENOMEM; | 5739 | err = -ENOMEM; |
5756 | goto out; | 5740 | goto out; |
@@ -6500,6 +6484,7 @@ out: | |||
6500 | static int btrfs_truncate(struct inode *inode) | 6484 | static int btrfs_truncate(struct inode *inode) |
6501 | { | 6485 | { |
6502 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6486 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6487 | struct btrfs_block_rsv *rsv; | ||
6503 | int ret; | 6488 | int ret; |
6504 | int err = 0; | 6489 | int err = 0; |
6505 | struct btrfs_trans_handle *trans; | 6490 | struct btrfs_trans_handle *trans; |
@@ -6513,28 +6498,80 @@ static int btrfs_truncate(struct inode *inode) | |||
6513 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6498 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6514 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6499 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6515 | 6500 | ||
6516 | trans = btrfs_start_transaction(root, 5); | 6501 | /* |
6517 | if (IS_ERR(trans)) | 6502 | * Yes ladies and gentelment, this is indeed ugly. The fact is we have |
6518 | return PTR_ERR(trans); | 6503 | * 3 things going on here |
6504 | * | ||
6505 | * 1) We need to reserve space for our orphan item and the space to | ||
6506 | * delete our orphan item. Lord knows we don't want to have a dangling | ||
6507 | * orphan item because we didn't reserve space to remove it. | ||
6508 | * | ||
6509 | * 2) We need to reserve space to update our inode. | ||
6510 | * | ||
6511 | * 3) We need to have something to cache all the space that is going to | ||
6512 | * be free'd up by the truncate operation, but also have some slack | ||
6513 | * space reserved in case it uses space during the truncate (thank you | ||
6514 | * very much snapshotting). | ||
6515 | * | ||
6516 | * And we need these to all be seperate. The fact is we can use alot of | ||
6517 | * space doing the truncate, and we have no earthly idea how much space | ||
6518 | * we will use, so we need the truncate reservation to be seperate so it | ||
6519 | * doesn't end up using space reserved for updating the inode or | ||
6520 | * removing the orphan item. We also need to be able to stop the | ||
6521 | * transaction and start a new one, which means we need to be able to | ||
6522 | * update the inode several times, and we have no idea of knowing how | ||
6523 | * many times that will be, so we can't just reserve 1 item for the | ||
6524 | * entirety of the opration, so that has to be done seperately as well. | ||
6525 | * Then there is the orphan item, which does indeed need to be held on | ||
6526 | * to for the whole operation, and we need nobody to touch this reserved | ||
6527 | * space except the orphan code. | ||
6528 | * | ||
6529 | * So that leaves us with | ||
6530 | * | ||
6531 | * 1) root->orphan_block_rsv - for the orphan deletion. | ||
6532 | * 2) rsv - for the truncate reservation, which we will steal from the | ||
6533 | * transaction reservation. | ||
6534 | * 3) fs_info->trans_block_rsv - this will have 1 items worth left for | ||
6535 | * updating the inode. | ||
6536 | */ | ||
6537 | rsv = btrfs_alloc_block_rsv(root); | ||
6538 | if (!rsv) | ||
6539 | return -ENOMEM; | ||
6540 | btrfs_add_durable_block_rsv(root->fs_info, rsv); | ||
6541 | |||
6542 | trans = btrfs_start_transaction(root, 4); | ||
6543 | if (IS_ERR(trans)) { | ||
6544 | err = PTR_ERR(trans); | ||
6545 | goto out; | ||
6546 | } | ||
6519 | 6547 | ||
6520 | btrfs_set_trans_block_group(trans, inode); | 6548 | /* |
6549 | * Reserve space for the truncate process. Truncate should be adding | ||
6550 | * space, but if there are snapshots it may end up using space. | ||
6551 | */ | ||
6552 | ret = btrfs_truncate_reserve_metadata(trans, root, rsv); | ||
6553 | BUG_ON(ret); | ||
6521 | 6554 | ||
6522 | ret = btrfs_orphan_add(trans, inode); | 6555 | ret = btrfs_orphan_add(trans, inode); |
6523 | if (ret) { | 6556 | if (ret) { |
6524 | btrfs_end_transaction(trans, root); | 6557 | btrfs_end_transaction(trans, root); |
6525 | return ret; | 6558 | goto out; |
6526 | } | 6559 | } |
6527 | 6560 | ||
6528 | nr = trans->blocks_used; | 6561 | nr = trans->blocks_used; |
6529 | btrfs_end_transaction(trans, root); | 6562 | btrfs_end_transaction(trans, root); |
6530 | btrfs_btree_balance_dirty(root, nr); | 6563 | btrfs_btree_balance_dirty(root, nr); |
6531 | 6564 | ||
6532 | /* Now start a transaction for the truncate */ | 6565 | /* |
6533 | trans = btrfs_start_transaction(root, 0); | 6566 | * Ok so we've already migrated our bytes over for the truncate, so here |
6534 | if (IS_ERR(trans)) | 6567 | * just reserve the one slot we need for updating the inode. |
6535 | return PTR_ERR(trans); | 6568 | */ |
6536 | btrfs_set_trans_block_group(trans, inode); | 6569 | trans = btrfs_start_transaction(root, 1); |
6537 | trans->block_rsv = root->orphan_block_rsv; | 6570 | if (IS_ERR(trans)) { |
6571 | err = PTR_ERR(trans); | ||
6572 | goto out; | ||
6573 | } | ||
6574 | trans->block_rsv = rsv; | ||
6538 | 6575 | ||
6539 | /* | 6576 | /* |
6540 | * setattr is responsible for setting the ordered_data_close flag, | 6577 | * setattr is responsible for setting the ordered_data_close flag, |
@@ -6558,24 +6595,17 @@ static int btrfs_truncate(struct inode *inode) | |||
6558 | 6595 | ||
6559 | while (1) { | 6596 | while (1) { |
6560 | if (!trans) { | 6597 | if (!trans) { |
6561 | trans = btrfs_start_transaction(root, 0); | 6598 | trans = btrfs_start_transaction(root, 3); |
6562 | if (IS_ERR(trans)) | 6599 | if (IS_ERR(trans)) { |
6563 | return PTR_ERR(trans); | 6600 | err = PTR_ERR(trans); |
6564 | btrfs_set_trans_block_group(trans, inode); | 6601 | goto out; |
6565 | trans->block_rsv = root->orphan_block_rsv; | 6602 | } |
6566 | } | ||
6567 | 6603 | ||
6568 | ret = btrfs_block_rsv_check(trans, root, | 6604 | ret = btrfs_truncate_reserve_metadata(trans, root, |
6569 | root->orphan_block_rsv, 0, 5); | 6605 | rsv); |
6570 | if (ret == -EAGAIN) { | 6606 | BUG_ON(ret); |
6571 | ret = btrfs_commit_transaction(trans, root); | 6607 | |
6572 | if (ret) | 6608 | trans->block_rsv = rsv; |
6573 | return ret; | ||
6574 | trans = NULL; | ||
6575 | continue; | ||
6576 | } else if (ret) { | ||
6577 | err = ret; | ||
6578 | break; | ||
6579 | } | 6609 | } |
6580 | 6610 | ||
6581 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6611 | ret = btrfs_truncate_inode_items(trans, root, inode, |
@@ -6586,6 +6616,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6586 | break; | 6616 | break; |
6587 | } | 6617 | } |
6588 | 6618 | ||
6619 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
6589 | ret = btrfs_update_inode(trans, root, inode); | 6620 | ret = btrfs_update_inode(trans, root, inode); |
6590 | if (ret) { | 6621 | if (ret) { |
6591 | err = ret; | 6622 | err = ret; |
@@ -6599,6 +6630,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6599 | } | 6630 | } |
6600 | 6631 | ||
6601 | if (ret == 0 && inode->i_nlink > 0) { | 6632 | if (ret == 0 && inode->i_nlink > 0) { |
6633 | trans->block_rsv = root->orphan_block_rsv; | ||
6602 | ret = btrfs_orphan_del(trans, inode); | 6634 | ret = btrfs_orphan_del(trans, inode); |
6603 | if (ret) | 6635 | if (ret) |
6604 | err = ret; | 6636 | err = ret; |
@@ -6610,15 +6642,20 @@ static int btrfs_truncate(struct inode *inode) | |||
6610 | ret = btrfs_orphan_del(NULL, inode); | 6642 | ret = btrfs_orphan_del(NULL, inode); |
6611 | } | 6643 | } |
6612 | 6644 | ||
6645 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
6613 | ret = btrfs_update_inode(trans, root, inode); | 6646 | ret = btrfs_update_inode(trans, root, inode); |
6614 | if (ret && !err) | 6647 | if (ret && !err) |
6615 | err = ret; | 6648 | err = ret; |
6616 | 6649 | ||
6617 | nr = trans->blocks_used; | 6650 | nr = trans->blocks_used; |
6618 | ret = btrfs_end_transaction_throttle(trans, root); | 6651 | ret = btrfs_end_transaction_throttle(trans, root); |
6652 | btrfs_btree_balance_dirty(root, nr); | ||
6653 | |||
6654 | out: | ||
6655 | btrfs_free_block_rsv(root, rsv); | ||
6656 | |||
6619 | if (ret && !err) | 6657 | if (ret && !err) |
6620 | err = ret; | 6658 | err = ret; |
6621 | btrfs_btree_balance_dirty(root, nr); | ||
6622 | 6659 | ||
6623 | return err; | 6660 | return err; |
6624 | } | 6661 | } |
@@ -6627,15 +6664,14 @@ static int btrfs_truncate(struct inode *inode) | |||
6627 | * create a new subvolume directory/inode (helper for the ioctl). | 6664 | * create a new subvolume directory/inode (helper for the ioctl). |
6628 | */ | 6665 | */ |
6629 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | 6666 | int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, |
6630 | struct btrfs_root *new_root, | 6667 | struct btrfs_root *new_root, u64 new_dirid) |
6631 | u64 new_dirid, u64 alloc_hint) | ||
6632 | { | 6668 | { |
6633 | struct inode *inode; | 6669 | struct inode *inode; |
6634 | int err; | 6670 | int err; |
6635 | u64 index = 0; | 6671 | u64 index = 0; |
6636 | 6672 | ||
6637 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, | 6673 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, |
6638 | new_dirid, alloc_hint, S_IFDIR | 0700, &index); | 6674 | new_dirid, S_IFDIR | 0700, &index); |
6639 | if (IS_ERR(inode)) | 6675 | if (IS_ERR(inode)) |
6640 | return PTR_ERR(inode); | 6676 | return PTR_ERR(inode); |
6641 | inode->i_op = &btrfs_dir_inode_operations; | 6677 | inode->i_op = &btrfs_dir_inode_operations; |
@@ -6748,21 +6784,6 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6748 | spin_unlock(&root->fs_info->ordered_extent_lock); | 6784 | spin_unlock(&root->fs_info->ordered_extent_lock); |
6749 | } | 6785 | } |
6750 | 6786 | ||
6751 | if (root == root->fs_info->tree_root) { | ||
6752 | struct btrfs_block_group_cache *block_group; | ||
6753 | |||
6754 | block_group = btrfs_lookup_block_group(root->fs_info, | ||
6755 | BTRFS_I(inode)->block_group); | ||
6756 | if (block_group && block_group->inode == inode) { | ||
6757 | spin_lock(&block_group->lock); | ||
6758 | block_group->inode = NULL; | ||
6759 | spin_unlock(&block_group->lock); | ||
6760 | btrfs_put_block_group(block_group); | ||
6761 | } else if (block_group) { | ||
6762 | btrfs_put_block_group(block_group); | ||
6763 | } | ||
6764 | } | ||
6765 | |||
6766 | spin_lock(&root->orphan_lock); | 6787 | spin_lock(&root->orphan_lock); |
6767 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { | 6788 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { |
6768 | printk(KERN_INFO "BTRFS: inode %llu still on the orphan list\n", | 6789 | printk(KERN_INFO "BTRFS: inode %llu still on the orphan list\n", |
@@ -6948,8 +6969,6 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6948 | goto out_notrans; | 6969 | goto out_notrans; |
6949 | } | 6970 | } |
6950 | 6971 | ||
6951 | btrfs_set_trans_block_group(trans, new_dir); | ||
6952 | |||
6953 | if (dest != root) | 6972 | if (dest != root) |
6954 | btrfs_record_root_in_trans(trans, dest); | 6973 | btrfs_record_root_in_trans(trans, dest); |
6955 | 6974 | ||
@@ -7131,16 +7150,13 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7131 | if (IS_ERR(trans)) | 7150 | if (IS_ERR(trans)) |
7132 | return PTR_ERR(trans); | 7151 | return PTR_ERR(trans); |
7133 | 7152 | ||
7134 | btrfs_set_trans_block_group(trans, dir); | ||
7135 | |||
7136 | err = btrfs_find_free_ino(root, &objectid); | 7153 | err = btrfs_find_free_ino(root, &objectid); |
7137 | if (err) | 7154 | if (err) |
7138 | goto out_unlock; | 7155 | goto out_unlock; |
7139 | 7156 | ||
7140 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 7157 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
7141 | dentry->d_name.len, btrfs_ino(dir), objectid, | 7158 | dentry->d_name.len, btrfs_ino(dir), objectid, |
7142 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, | 7159 | S_IFLNK|S_IRWXUGO, &index); |
7143 | &index); | ||
7144 | if (IS_ERR(inode)) { | 7160 | if (IS_ERR(inode)) { |
7145 | err = PTR_ERR(inode); | 7161 | err = PTR_ERR(inode); |
7146 | goto out_unlock; | 7162 | goto out_unlock; |
@@ -7152,7 +7168,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7152 | goto out_unlock; | 7168 | goto out_unlock; |
7153 | } | 7169 | } |
7154 | 7170 | ||
7155 | btrfs_set_trans_block_group(trans, inode); | ||
7156 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 7171 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
7157 | if (err) | 7172 | if (err) |
7158 | drop_inode = 1; | 7173 | drop_inode = 1; |
@@ -7163,8 +7178,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7163 | inode->i_op = &btrfs_file_inode_operations; | 7178 | inode->i_op = &btrfs_file_inode_operations; |
7164 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 7179 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
7165 | } | 7180 | } |
7166 | btrfs_update_inode_block_group(trans, inode); | ||
7167 | btrfs_update_inode_block_group(trans, dir); | ||
7168 | if (drop_inode) | 7181 | if (drop_inode) |
7169 | goto out_unlock; | 7182 | goto out_unlock; |
7170 | 7183 | ||