diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 376 |
1 files changed, 187 insertions, 189 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index ba58024d40d3..3d3e2c17d8d1 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -94,8 +94,8 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, | |||
| 94 | u64 flags, struct btrfs_disk_key *key, | 94 | u64 flags, struct btrfs_disk_key *key, |
| 95 | int level, struct btrfs_key *ins); | 95 | int level, struct btrfs_key *ins); |
| 96 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, | 96 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, |
| 97 | struct btrfs_root *extent_root, u64 alloc_bytes, | 97 | struct btrfs_root *extent_root, u64 flags, |
| 98 | u64 flags, int force); | 98 | int force); |
| 99 | static int find_next_key(struct btrfs_path *path, int level, | 99 | static int find_next_key(struct btrfs_path *path, int level, |
| 100 | struct btrfs_key *key); | 100 | struct btrfs_key *key); |
| 101 | static void dump_space_info(struct btrfs_space_info *info, u64 bytes, | 101 | static void dump_space_info(struct btrfs_space_info *info, u64 bytes, |
| @@ -312,7 +312,8 @@ static u64 add_new_free_space(struct btrfs_block_group_cache *block_group, | |||
| 312 | while (start < end) { | 312 | while (start < end) { |
| 313 | ret = find_first_extent_bit(info->pinned_extents, start, | 313 | ret = find_first_extent_bit(info->pinned_extents, start, |
| 314 | &extent_start, &extent_end, | 314 | &extent_start, &extent_end, |
| 315 | EXTENT_DIRTY | EXTENT_UPTODATE); | 315 | EXTENT_DIRTY | EXTENT_UPTODATE, |
| 316 | NULL); | ||
| 316 | if (ret) | 317 | if (ret) |
| 317 | break; | 318 | break; |
| 318 | 319 | ||
| @@ -2361,10 +2362,6 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
| 2361 | } | 2362 | } |
| 2362 | 2363 | ||
| 2363 | next: | 2364 | next: |
| 2364 | do_chunk_alloc(trans, fs_info->extent_root, | ||
| 2365 | 2 * 1024 * 1024, | ||
| 2366 | btrfs_get_alloc_profile(root, 0), | ||
| 2367 | CHUNK_ALLOC_NO_FORCE); | ||
| 2368 | cond_resched(); | 2365 | cond_resched(); |
| 2369 | spin_lock(&delayed_refs->lock); | 2366 | spin_lock(&delayed_refs->lock); |
| 2370 | } | 2367 | } |
| @@ -2478,10 +2475,6 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
| 2478 | if (root == root->fs_info->extent_root) | 2475 | if (root == root->fs_info->extent_root) |
| 2479 | root = root->fs_info->tree_root; | 2476 | root = root->fs_info->tree_root; |
| 2480 | 2477 | ||
| 2481 | do_chunk_alloc(trans, root->fs_info->extent_root, | ||
| 2482 | 2 * 1024 * 1024, btrfs_get_alloc_profile(root, 0), | ||
| 2483 | CHUNK_ALLOC_NO_FORCE); | ||
| 2484 | |||
| 2485 | btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info); | 2478 | btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info); |
| 2486 | 2479 | ||
| 2487 | delayed_refs = &trans->transaction->delayed_refs; | 2480 | delayed_refs = &trans->transaction->delayed_refs; |
| @@ -2551,6 +2544,12 @@ again: | |||
| 2551 | } | 2544 | } |
| 2552 | 2545 | ||
| 2553 | if (run_all) { | 2546 | if (run_all) { |
| 2547 | if (!list_empty(&trans->new_bgs)) { | ||
| 2548 | spin_unlock(&delayed_refs->lock); | ||
| 2549 | btrfs_create_pending_block_groups(trans, root); | ||
| 2550 | spin_lock(&delayed_refs->lock); | ||
| 2551 | } | ||
| 2552 | |||
| 2554 | node = rb_first(&delayed_refs->root); | 2553 | node = rb_first(&delayed_refs->root); |
| 2555 | if (!node) | 2554 | if (!node) |
| 2556 | goto out; | 2555 | goto out; |
| @@ -3406,7 +3405,6 @@ alloc: | |||
| 3406 | return PTR_ERR(trans); | 3405 | return PTR_ERR(trans); |
| 3407 | 3406 | ||
| 3408 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | 3407 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, |
| 3409 | bytes + 2 * 1024 * 1024, | ||
| 3410 | alloc_target, | 3408 | alloc_target, |
| 3411 | CHUNK_ALLOC_NO_FORCE); | 3409 | CHUNK_ALLOC_NO_FORCE); |
| 3412 | btrfs_end_transaction(trans, root); | 3410 | btrfs_end_transaction(trans, root); |
| @@ -3488,8 +3486,7 @@ static void force_metadata_allocation(struct btrfs_fs_info *info) | |||
| 3488 | } | 3486 | } |
| 3489 | 3487 | ||
| 3490 | static int should_alloc_chunk(struct btrfs_root *root, | 3488 | static int should_alloc_chunk(struct btrfs_root *root, |
| 3491 | struct btrfs_space_info *sinfo, u64 alloc_bytes, | 3489 | struct btrfs_space_info *sinfo, int force) |
| 3492 | int force) | ||
| 3493 | { | 3490 | { |
| 3494 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; | 3491 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; |
| 3495 | u64 num_bytes = sinfo->total_bytes - sinfo->bytes_readonly; | 3492 | u64 num_bytes = sinfo->total_bytes - sinfo->bytes_readonly; |
| @@ -3504,7 +3501,8 @@ static int should_alloc_chunk(struct btrfs_root *root, | |||
| 3504 | * and purposes it's used space. Don't worry about locking the | 3501 | * and purposes it's used space. Don't worry about locking the |
| 3505 | * global_rsv, it doesn't change except when the transaction commits. | 3502 | * global_rsv, it doesn't change except when the transaction commits. |
| 3506 | */ | 3503 | */ |
| 3507 | num_allocated += global_rsv->size; | 3504 | if (sinfo->flags & BTRFS_BLOCK_GROUP_METADATA) |
| 3505 | num_allocated += global_rsv->size; | ||
| 3508 | 3506 | ||
| 3509 | /* | 3507 | /* |
| 3510 | * in limited mode, we want to have some free space up to | 3508 | * in limited mode, we want to have some free space up to |
| @@ -3518,15 +3516,8 @@ static int should_alloc_chunk(struct btrfs_root *root, | |||
| 3518 | if (num_bytes - num_allocated < thresh) | 3516 | if (num_bytes - num_allocated < thresh) |
| 3519 | return 1; | 3517 | return 1; |
| 3520 | } | 3518 | } |
| 3521 | thresh = btrfs_super_total_bytes(root->fs_info->super_copy); | ||
| 3522 | 3519 | ||
| 3523 | /* 256MB or 2% of the FS */ | 3520 | if (num_allocated + 2 * 1024 * 1024 < div_factor(num_bytes, 8)) |
| 3524 | thresh = max_t(u64, 256 * 1024 * 1024, div_factor_fine(thresh, 2)); | ||
| 3525 | /* system chunks need a much small threshold */ | ||
| 3526 | if (sinfo->flags & BTRFS_BLOCK_GROUP_SYSTEM) | ||
| 3527 | thresh = 32 * 1024 * 1024; | ||
| 3528 | |||
| 3529 | if (num_bytes > thresh && sinfo->bytes_used < div_factor(num_bytes, 8)) | ||
| 3530 | return 0; | 3521 | return 0; |
| 3531 | return 1; | 3522 | return 1; |
| 3532 | } | 3523 | } |
| @@ -3576,8 +3567,7 @@ static void check_system_chunk(struct btrfs_trans_handle *trans, | |||
| 3576 | } | 3567 | } |
| 3577 | 3568 | ||
| 3578 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, | 3569 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, |
| 3579 | struct btrfs_root *extent_root, u64 alloc_bytes, | 3570 | struct btrfs_root *extent_root, u64 flags, int force) |
| 3580 | u64 flags, int force) | ||
| 3581 | { | 3571 | { |
| 3582 | struct btrfs_space_info *space_info; | 3572 | struct btrfs_space_info *space_info; |
| 3583 | struct btrfs_fs_info *fs_info = extent_root->fs_info; | 3573 | struct btrfs_fs_info *fs_info = extent_root->fs_info; |
| @@ -3601,7 +3591,7 @@ again: | |||
| 3601 | return 0; | 3591 | return 0; |
| 3602 | } | 3592 | } |
| 3603 | 3593 | ||
| 3604 | if (!should_alloc_chunk(extent_root, space_info, alloc_bytes, force)) { | 3594 | if (!should_alloc_chunk(extent_root, space_info, force)) { |
| 3605 | spin_unlock(&space_info->lock); | 3595 | spin_unlock(&space_info->lock); |
| 3606 | return 0; | 3596 | return 0; |
| 3607 | } else if (space_info->chunk_alloc) { | 3597 | } else if (space_info->chunk_alloc) { |
| @@ -3669,6 +3659,46 @@ out: | |||
| 3669 | return ret; | 3659 | return ret; |
| 3670 | } | 3660 | } |
| 3671 | 3661 | ||
| 3662 | static int can_overcommit(struct btrfs_root *root, | ||
| 3663 | struct btrfs_space_info *space_info, u64 bytes, | ||
| 3664 | int flush) | ||
| 3665 | { | ||
| 3666 | u64 profile = btrfs_get_alloc_profile(root, 0); | ||
| 3667 | u64 avail; | ||
| 3668 | u64 used; | ||
| 3669 | |||
| 3670 | used = space_info->bytes_used + space_info->bytes_reserved + | ||
| 3671 | space_info->bytes_pinned + space_info->bytes_readonly + | ||
| 3672 | space_info->bytes_may_use; | ||
| 3673 | |||
| 3674 | spin_lock(&root->fs_info->free_chunk_lock); | ||
| 3675 | avail = root->fs_info->free_chunk_space; | ||
| 3676 | spin_unlock(&root->fs_info->free_chunk_lock); | ||
| 3677 | |||
| 3678 | /* | ||
| 3679 | * If we have dup, raid1 or raid10 then only half of the free | ||
| 3680 | * space is actually useable. | ||
| 3681 | */ | ||
| 3682 | if (profile & (BTRFS_BLOCK_GROUP_DUP | | ||
| 3683 | BTRFS_BLOCK_GROUP_RAID1 | | ||
| 3684 | BTRFS_BLOCK_GROUP_RAID10)) | ||
| 3685 | avail >>= 1; | ||
| 3686 | |||
| 3687 | /* | ||
| 3688 | * If we aren't flushing don't let us overcommit too much, say | ||
| 3689 | * 1/8th of the space. If we can flush, let it overcommit up to | ||
| 3690 | * 1/2 of the space. | ||
| 3691 | */ | ||
| 3692 | if (flush) | ||
| 3693 | avail >>= 3; | ||
| 3694 | else | ||
| 3695 | avail >>= 1; | ||
| 3696 | |||
| 3697 | if (used + bytes < space_info->total_bytes + avail) | ||
| 3698 | return 1; | ||
| 3699 | return 0; | ||
| 3700 | } | ||
| 3701 | |||
| 3672 | /* | 3702 | /* |
| 3673 | * shrink metadata reservation for delalloc | 3703 | * shrink metadata reservation for delalloc |
| 3674 | */ | 3704 | */ |
| @@ -3693,7 +3723,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
| 3693 | if (delalloc_bytes == 0) { | 3723 | if (delalloc_bytes == 0) { |
| 3694 | if (trans) | 3724 | if (trans) |
| 3695 | return; | 3725 | return; |
| 3696 | btrfs_wait_ordered_extents(root, 0, 0); | 3726 | btrfs_wait_ordered_extents(root, 0); |
| 3697 | return; | 3727 | return; |
| 3698 | } | 3728 | } |
| 3699 | 3729 | ||
| @@ -3703,11 +3733,15 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
| 3703 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, | 3733 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, |
| 3704 | WB_REASON_FS_FREE_SPACE); | 3734 | WB_REASON_FS_FREE_SPACE); |
| 3705 | 3735 | ||
| 3736 | /* | ||
| 3737 | * We need to wait for the async pages to actually start before | ||
| 3738 | * we do anything. | ||
| 3739 | */ | ||
| 3740 | wait_event(root->fs_info->async_submit_wait, | ||
| 3741 | !atomic_read(&root->fs_info->async_delalloc_pages)); | ||
| 3742 | |||
| 3706 | spin_lock(&space_info->lock); | 3743 | spin_lock(&space_info->lock); |
| 3707 | if (space_info->bytes_used + space_info->bytes_reserved + | 3744 | if (can_overcommit(root, space_info, orig, !trans)) { |
| 3708 | space_info->bytes_pinned + space_info->bytes_readonly + | ||
| 3709 | space_info->bytes_may_use + orig <= | ||
| 3710 | space_info->total_bytes) { | ||
| 3711 | spin_unlock(&space_info->lock); | 3745 | spin_unlock(&space_info->lock); |
| 3712 | break; | 3746 | break; |
| 3713 | } | 3747 | } |
| @@ -3715,7 +3749,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
| 3715 | 3749 | ||
| 3716 | loops++; | 3750 | loops++; |
| 3717 | if (wait_ordered && !trans) { | 3751 | if (wait_ordered && !trans) { |
| 3718 | btrfs_wait_ordered_extents(root, 0, 0); | 3752 | btrfs_wait_ordered_extents(root, 0); |
| 3719 | } else { | 3753 | } else { |
| 3720 | time_left = schedule_timeout_killable(1); | 3754 | time_left = schedule_timeout_killable(1); |
| 3721 | if (time_left) | 3755 | if (time_left) |
| @@ -3784,11 +3818,12 @@ commit: | |||
| 3784 | } | 3818 | } |
| 3785 | 3819 | ||
| 3786 | enum flush_state { | 3820 | enum flush_state { |
| 3787 | FLUSH_DELALLOC = 1, | 3821 | FLUSH_DELAYED_ITEMS_NR = 1, |
| 3788 | FLUSH_DELALLOC_WAIT = 2, | 3822 | FLUSH_DELAYED_ITEMS = 2, |
| 3789 | FLUSH_DELAYED_ITEMS_NR = 3, | 3823 | FLUSH_DELALLOC = 3, |
| 3790 | FLUSH_DELAYED_ITEMS = 4, | 3824 | FLUSH_DELALLOC_WAIT = 4, |
| 3791 | COMMIT_TRANS = 5, | 3825 | ALLOC_CHUNK = 5, |
| 3826 | COMMIT_TRANS = 6, | ||
| 3792 | }; | 3827 | }; |
| 3793 | 3828 | ||
| 3794 | static int flush_space(struct btrfs_root *root, | 3829 | static int flush_space(struct btrfs_root *root, |
| @@ -3800,11 +3835,6 @@ static int flush_space(struct btrfs_root *root, | |||
| 3800 | int ret = 0; | 3835 | int ret = 0; |
| 3801 | 3836 | ||
| 3802 | switch (state) { | 3837 | switch (state) { |
| 3803 | case FLUSH_DELALLOC: | ||
| 3804 | case FLUSH_DELALLOC_WAIT: | ||
| 3805 | shrink_delalloc(root, num_bytes, orig_bytes, | ||
| 3806 | state == FLUSH_DELALLOC_WAIT); | ||
| 3807 | break; | ||
| 3808 | case FLUSH_DELAYED_ITEMS_NR: | 3838 | case FLUSH_DELAYED_ITEMS_NR: |
| 3809 | case FLUSH_DELAYED_ITEMS: | 3839 | case FLUSH_DELAYED_ITEMS: |
| 3810 | if (state == FLUSH_DELAYED_ITEMS_NR) { | 3840 | if (state == FLUSH_DELAYED_ITEMS_NR) { |
| @@ -3825,6 +3855,24 @@ static int flush_space(struct btrfs_root *root, | |||
| 3825 | ret = btrfs_run_delayed_items_nr(trans, root, nr); | 3855 | ret = btrfs_run_delayed_items_nr(trans, root, nr); |
| 3826 | btrfs_end_transaction(trans, root); | 3856 | btrfs_end_transaction(trans, root); |
| 3827 | break; | 3857 | break; |
| 3858 | case FLUSH_DELALLOC: | ||
| 3859 | case FLUSH_DELALLOC_WAIT: | ||
| 3860 | shrink_delalloc(root, num_bytes, orig_bytes, | ||
| 3861 | state == FLUSH_DELALLOC_WAIT); | ||
| 3862 | break; | ||
| 3863 | case ALLOC_CHUNK: | ||
| 3864 | trans = btrfs_join_transaction(root); | ||
| 3865 | if (IS_ERR(trans)) { | ||
| 3866 | ret = PTR_ERR(trans); | ||
| 3867 | break; | ||
| 3868 | } | ||
| 3869 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | ||
| 3870 | btrfs_get_alloc_profile(root, 0), | ||
| 3871 | CHUNK_ALLOC_NO_FORCE); | ||
| 3872 | btrfs_end_transaction(trans, root); | ||
| 3873 | if (ret == -ENOSPC) | ||
| 3874 | ret = 0; | ||
| 3875 | break; | ||
| 3828 | case COMMIT_TRANS: | 3876 | case COMMIT_TRANS: |
| 3829 | ret = may_commit_transaction(root, space_info, orig_bytes, 0); | 3877 | ret = may_commit_transaction(root, space_info, orig_bytes, 0); |
| 3830 | break; | 3878 | break; |
| @@ -3856,10 +3904,9 @@ static int reserve_metadata_bytes(struct btrfs_root *root, | |||
| 3856 | struct btrfs_space_info *space_info = block_rsv->space_info; | 3904 | struct btrfs_space_info *space_info = block_rsv->space_info; |
| 3857 | u64 used; | 3905 | u64 used; |
| 3858 | u64 num_bytes = orig_bytes; | 3906 | u64 num_bytes = orig_bytes; |
| 3859 | int flush_state = FLUSH_DELALLOC; | 3907 | int flush_state = FLUSH_DELAYED_ITEMS_NR; |
| 3860 | int ret = 0; | 3908 | int ret = 0; |
| 3861 | bool flushing = false; | 3909 | bool flushing = false; |
| 3862 | bool committed = false; | ||
| 3863 | 3910 | ||
| 3864 | again: | 3911 | again: |
| 3865 | ret = 0; | 3912 | ret = 0; |
| @@ -3922,57 +3969,12 @@ again: | |||
| 3922 | (orig_bytes * 2); | 3969 | (orig_bytes * 2); |
| 3923 | } | 3970 | } |
| 3924 | 3971 | ||
| 3925 | if (ret) { | 3972 | if (ret && can_overcommit(root, space_info, orig_bytes, flush)) { |
| 3926 | u64 profile = btrfs_get_alloc_profile(root, 0); | 3973 | space_info->bytes_may_use += orig_bytes; |
| 3927 | u64 avail; | 3974 | trace_btrfs_space_reservation(root->fs_info, "space_info", |
| 3928 | 3975 | space_info->flags, orig_bytes, | |
| 3929 | /* | 3976 | 1); |
| 3930 | * If we have a lot of space that's pinned, don't bother doing | 3977 | ret = 0; |
| 3931 | * the overcommit dance yet and just commit the transaction. | ||
| 3932 | */ | ||
| 3933 | avail = (space_info->total_bytes - space_info->bytes_used) * 8; | ||
| 3934 | do_div(avail, 10); | ||
| 3935 | if (space_info->bytes_pinned >= avail && flush && !committed) { | ||
| 3936 | space_info->flush = 1; | ||
| 3937 | flushing = true; | ||
| 3938 | spin_unlock(&space_info->lock); | ||
| 3939 | ret = may_commit_transaction(root, space_info, | ||
| 3940 | orig_bytes, 1); | ||
| 3941 | if (ret) | ||
| 3942 | goto out; | ||
| 3943 | committed = true; | ||
| 3944 | goto again; | ||
| 3945 | } | ||
| 3946 | |||
| 3947 | spin_lock(&root->fs_info->free_chunk_lock); | ||
| 3948 | avail = root->fs_info->free_chunk_space; | ||
| 3949 | |||
| 3950 | /* | ||
| 3951 | * If we have dup, raid1 or raid10 then only half of the free | ||
| 3952 | * space is actually useable. | ||
| 3953 | */ | ||
| 3954 | if (profile & (BTRFS_BLOCK_GROUP_DUP | | ||
| 3955 | BTRFS_BLOCK_GROUP_RAID1 | | ||
| 3956 | BTRFS_BLOCK_GROUP_RAID10)) | ||
| 3957 | avail >>= 1; | ||
| 3958 | |||
| 3959 | /* | ||
| 3960 | * If we aren't flushing don't let us overcommit too much, say | ||
| 3961 | * 1/8th of the space. If we can flush, let it overcommit up to | ||
| 3962 | * 1/2 of the space. | ||
| 3963 | */ | ||
| 3964 | if (flush) | ||
| 3965 | avail >>= 3; | ||
| 3966 | else | ||
| 3967 | avail >>= 1; | ||
| 3968 | spin_unlock(&root->fs_info->free_chunk_lock); | ||
| 3969 | |||
| 3970 | if (used + num_bytes < space_info->total_bytes + avail) { | ||
| 3971 | space_info->bytes_may_use += orig_bytes; | ||
| 3972 | trace_btrfs_space_reservation(root->fs_info, | ||
| 3973 | "space_info", space_info->flags, orig_bytes, 1); | ||
| 3974 | ret = 0; | ||
| 3975 | } | ||
| 3976 | } | 3978 | } |
| 3977 | 3979 | ||
| 3978 | /* | 3980 | /* |
| @@ -4114,13 +4116,15 @@ static int block_rsv_migrate_bytes(struct btrfs_block_rsv *src, | |||
| 4114 | return 0; | 4116 | return 0; |
| 4115 | } | 4117 | } |
| 4116 | 4118 | ||
| 4117 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv) | 4119 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type) |
| 4118 | { | 4120 | { |
| 4119 | memset(rsv, 0, sizeof(*rsv)); | 4121 | memset(rsv, 0, sizeof(*rsv)); |
| 4120 | spin_lock_init(&rsv->lock); | 4122 | spin_lock_init(&rsv->lock); |
| 4123 | rsv->type = type; | ||
| 4121 | } | 4124 | } |
| 4122 | 4125 | ||
| 4123 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root) | 4126 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root, |
| 4127 | unsigned short type) | ||
| 4124 | { | 4128 | { |
| 4125 | struct btrfs_block_rsv *block_rsv; | 4129 | struct btrfs_block_rsv *block_rsv; |
| 4126 | struct btrfs_fs_info *fs_info = root->fs_info; | 4130 | struct btrfs_fs_info *fs_info = root->fs_info; |
| @@ -4129,7 +4133,7 @@ struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root) | |||
| 4129 | if (!block_rsv) | 4133 | if (!block_rsv) |
| 4130 | return NULL; | 4134 | return NULL; |
| 4131 | 4135 | ||
| 4132 | btrfs_init_block_rsv(block_rsv); | 4136 | btrfs_init_block_rsv(block_rsv, type); |
| 4133 | block_rsv->space_info = __find_space_info(fs_info, | 4137 | block_rsv->space_info = __find_space_info(fs_info, |
| 4134 | BTRFS_BLOCK_GROUP_METADATA); | 4138 | BTRFS_BLOCK_GROUP_METADATA); |
| 4135 | return block_rsv; | 4139 | return block_rsv; |
| @@ -4138,6 +4142,8 @@ struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root) | |||
| 4138 | void btrfs_free_block_rsv(struct btrfs_root *root, | 4142 | void btrfs_free_block_rsv(struct btrfs_root *root, |
| 4139 | struct btrfs_block_rsv *rsv) | 4143 | struct btrfs_block_rsv *rsv) |
| 4140 | { | 4144 | { |
| 4145 | if (!rsv) | ||
| 4146 | return; | ||
| 4141 | btrfs_block_rsv_release(root, rsv, (u64)-1); | 4147 | btrfs_block_rsv_release(root, rsv, (u64)-1); |
| 4142 | kfree(rsv); | 4148 | kfree(rsv); |
| 4143 | } | 4149 | } |
| @@ -4416,10 +4422,10 @@ int btrfs_snap_reserve_metadata(struct btrfs_trans_handle *trans, | |||
| 4416 | struct btrfs_block_rsv *src_rsv = get_block_rsv(trans, root); | 4422 | struct btrfs_block_rsv *src_rsv = get_block_rsv(trans, root); |
| 4417 | struct btrfs_block_rsv *dst_rsv = &pending->block_rsv; | 4423 | struct btrfs_block_rsv *dst_rsv = &pending->block_rsv; |
| 4418 | /* | 4424 | /* |
| 4419 | * two for root back/forward refs, two for directory entries | 4425 | * two for root back/forward refs, two for directory entries, |
| 4420 | * and one for root of the snapshot. | 4426 | * one for root of the snapshot and one for parent inode. |
| 4421 | */ | 4427 | */ |
| 4422 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 5); | 4428 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 6); |
| 4423 | dst_rsv->space_info = src_rsv->space_info; | 4429 | dst_rsv->space_info = src_rsv->space_info; |
| 4424 | return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); | 4430 | return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); |
| 4425 | } | 4431 | } |
| @@ -5018,7 +5024,7 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, | |||
| 5018 | 5024 | ||
| 5019 | while (1) { | 5025 | while (1) { |
| 5020 | ret = find_first_extent_bit(unpin, 0, &start, &end, | 5026 | ret = find_first_extent_bit(unpin, 0, &start, &end, |
| 5021 | EXTENT_DIRTY); | 5027 | EXTENT_DIRTY, NULL); |
| 5022 | if (ret) | 5028 | if (ret) |
| 5023 | break; | 5029 | break; |
| 5024 | 5030 | ||
| @@ -5096,8 +5102,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5096 | ret = remove_extent_backref(trans, extent_root, path, | 5102 | ret = remove_extent_backref(trans, extent_root, path, |
| 5097 | NULL, refs_to_drop, | 5103 | NULL, refs_to_drop, |
| 5098 | is_data); | 5104 | is_data); |
| 5099 | if (ret) | 5105 | if (ret) { |
| 5100 | goto abort; | 5106 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5107 | goto out; | ||
| 5108 | } | ||
| 5101 | btrfs_release_path(path); | 5109 | btrfs_release_path(path); |
| 5102 | path->leave_spinning = 1; | 5110 | path->leave_spinning = 1; |
| 5103 | 5111 | ||
| @@ -5115,8 +5123,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5115 | btrfs_print_leaf(extent_root, | 5123 | btrfs_print_leaf(extent_root, |
| 5116 | path->nodes[0]); | 5124 | path->nodes[0]); |
| 5117 | } | 5125 | } |
| 5118 | if (ret < 0) | 5126 | if (ret < 0) { |
| 5119 | goto abort; | 5127 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5128 | goto out; | ||
| 5129 | } | ||
| 5120 | extent_slot = path->slots[0]; | 5130 | extent_slot = path->slots[0]; |
| 5121 | } | 5131 | } |
| 5122 | } else if (ret == -ENOENT) { | 5132 | } else if (ret == -ENOENT) { |
| @@ -5130,7 +5140,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5130 | (unsigned long long)owner_objectid, | 5140 | (unsigned long long)owner_objectid, |
| 5131 | (unsigned long long)owner_offset); | 5141 | (unsigned long long)owner_offset); |
| 5132 | } else { | 5142 | } else { |
| 5133 | goto abort; | 5143 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5144 | goto out; | ||
| 5134 | } | 5145 | } |
| 5135 | 5146 | ||
| 5136 | leaf = path->nodes[0]; | 5147 | leaf = path->nodes[0]; |
| @@ -5140,8 +5151,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5140 | BUG_ON(found_extent || extent_slot != path->slots[0]); | 5151 | BUG_ON(found_extent || extent_slot != path->slots[0]); |
| 5141 | ret = convert_extent_item_v0(trans, extent_root, path, | 5152 | ret = convert_extent_item_v0(trans, extent_root, path, |
| 5142 | owner_objectid, 0); | 5153 | owner_objectid, 0); |
| 5143 | if (ret < 0) | 5154 | if (ret < 0) { |
| 5144 | goto abort; | 5155 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5156 | goto out; | ||
| 5157 | } | ||
| 5145 | 5158 | ||
| 5146 | btrfs_release_path(path); | 5159 | btrfs_release_path(path); |
| 5147 | path->leave_spinning = 1; | 5160 | path->leave_spinning = 1; |
| @@ -5158,8 +5171,11 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5158 | (unsigned long long)bytenr); | 5171 | (unsigned long long)bytenr); |
| 5159 | btrfs_print_leaf(extent_root, path->nodes[0]); | 5172 | btrfs_print_leaf(extent_root, path->nodes[0]); |
| 5160 | } | 5173 | } |
| 5161 | if (ret < 0) | 5174 | if (ret < 0) { |
| 5162 | goto abort; | 5175 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5176 | goto out; | ||
| 5177 | } | ||
| 5178 | |||
| 5163 | extent_slot = path->slots[0]; | 5179 | extent_slot = path->slots[0]; |
| 5164 | leaf = path->nodes[0]; | 5180 | leaf = path->nodes[0]; |
| 5165 | item_size = btrfs_item_size_nr(leaf, extent_slot); | 5181 | item_size = btrfs_item_size_nr(leaf, extent_slot); |
| @@ -5196,8 +5212,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5196 | ret = remove_extent_backref(trans, extent_root, path, | 5212 | ret = remove_extent_backref(trans, extent_root, path, |
| 5197 | iref, refs_to_drop, | 5213 | iref, refs_to_drop, |
| 5198 | is_data); | 5214 | is_data); |
| 5199 | if (ret) | 5215 | if (ret) { |
| 5200 | goto abort; | 5216 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5217 | goto out; | ||
| 5218 | } | ||
| 5201 | } | 5219 | } |
| 5202 | } else { | 5220 | } else { |
| 5203 | if (found_extent) { | 5221 | if (found_extent) { |
| @@ -5214,27 +5232,29 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5214 | 5232 | ||
| 5215 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], | 5233 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], |
| 5216 | num_to_del); | 5234 | num_to_del); |
| 5217 | if (ret) | 5235 | if (ret) { |
| 5218 | goto abort; | 5236 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5237 | goto out; | ||
| 5238 | } | ||
| 5219 | btrfs_release_path(path); | 5239 | btrfs_release_path(path); |
| 5220 | 5240 | ||
| 5221 | if (is_data) { | 5241 | if (is_data) { |
| 5222 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); | 5242 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); |
| 5223 | if (ret) | 5243 | if (ret) { |
| 5224 | goto abort; | 5244 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5245 | goto out; | ||
| 5246 | } | ||
| 5225 | } | 5247 | } |
| 5226 | 5248 | ||
| 5227 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); | 5249 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); |
| 5228 | if (ret) | 5250 | if (ret) { |
| 5229 | goto abort; | 5251 | btrfs_abort_transaction(trans, extent_root, ret); |
| 5252 | goto out; | ||
| 5253 | } | ||
| 5230 | } | 5254 | } |
| 5231 | out: | 5255 | out: |
| 5232 | btrfs_free_path(path); | 5256 | btrfs_free_path(path); |
| 5233 | return ret; | 5257 | return ret; |
| 5234 | |||
| 5235 | abort: | ||
| 5236 | btrfs_abort_transaction(trans, extent_root, ret); | ||
| 5237 | goto out; | ||
| 5238 | } | 5258 | } |
| 5239 | 5259 | ||
| 5240 | /* | 5260 | /* |
| @@ -5497,8 +5517,6 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, | |||
| 5497 | struct btrfs_block_group_cache *used_block_group; | 5517 | struct btrfs_block_group_cache *used_block_group; |
| 5498 | u64 search_start = 0; | 5518 | u64 search_start = 0; |
| 5499 | int empty_cluster = 2 * 1024 * 1024; | 5519 | int empty_cluster = 2 * 1024 * 1024; |
| 5500 | int allowed_chunk_alloc = 0; | ||
| 5501 | int done_chunk_alloc = 0; | ||
| 5502 | struct btrfs_space_info *space_info; | 5520 | struct btrfs_space_info *space_info; |
| 5503 | int loop = 0; | 5521 | int loop = 0; |
| 5504 | int index = 0; | 5522 | int index = 0; |
| @@ -5530,9 +5548,6 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, | |||
| 5530 | if (btrfs_mixed_space_info(space_info)) | 5548 | if (btrfs_mixed_space_info(space_info)) |
| 5531 | use_cluster = false; | 5549 | use_cluster = false; |
| 5532 | 5550 | ||
| 5533 | if (orig_root->ref_cows || empty_size) | ||
| 5534 | allowed_chunk_alloc = 1; | ||
| 5535 | |||
| 5536 | if (data & BTRFS_BLOCK_GROUP_METADATA && use_cluster) { | 5551 | if (data & BTRFS_BLOCK_GROUP_METADATA && use_cluster) { |
| 5537 | last_ptr = &root->fs_info->meta_alloc_cluster; | 5552 | last_ptr = &root->fs_info->meta_alloc_cluster; |
| 5538 | if (!btrfs_test_opt(root, SSD)) | 5553 | if (!btrfs_test_opt(root, SSD)) |
| @@ -5806,10 +5821,6 @@ checks: | |||
| 5806 | 5821 | ||
| 5807 | trace_btrfs_reserve_extent(orig_root, block_group, | 5822 | trace_btrfs_reserve_extent(orig_root, block_group, |
| 5808 | search_start, num_bytes); | 5823 | search_start, num_bytes); |
| 5809 | if (offset < search_start) | ||
| 5810 | btrfs_add_free_space(used_block_group, offset, | ||
| 5811 | search_start - offset); | ||
| 5812 | BUG_ON(offset > search_start); | ||
| 5813 | if (used_block_group != block_group) | 5824 | if (used_block_group != block_group) |
| 5814 | btrfs_put_block_group(used_block_group); | 5825 | btrfs_put_block_group(used_block_group); |
| 5815 | btrfs_put_block_group(block_group); | 5826 | btrfs_put_block_group(block_group); |
| @@ -5842,34 +5853,17 @@ loop: | |||
| 5842 | index = 0; | 5853 | index = 0; |
| 5843 | loop++; | 5854 | loop++; |
| 5844 | if (loop == LOOP_ALLOC_CHUNK) { | 5855 | if (loop == LOOP_ALLOC_CHUNK) { |
| 5845 | if (allowed_chunk_alloc) { | 5856 | ret = do_chunk_alloc(trans, root, data, |
| 5846 | ret = do_chunk_alloc(trans, root, num_bytes + | 5857 | CHUNK_ALLOC_FORCE); |
| 5847 | 2 * 1024 * 1024, data, | 5858 | /* |
| 5848 | CHUNK_ALLOC_LIMITED); | 5859 | * Do not bail out on ENOSPC since we |
| 5849 | /* | 5860 | * can do more things. |
| 5850 | * Do not bail out on ENOSPC since we | 5861 | */ |
| 5851 | * can do more things. | 5862 | if (ret < 0 && ret != -ENOSPC) { |
| 5852 | */ | 5863 | btrfs_abort_transaction(trans, |
| 5853 | if (ret < 0 && ret != -ENOSPC) { | 5864 | root, ret); |
| 5854 | btrfs_abort_transaction(trans, | 5865 | goto out; |
| 5855 | root, ret); | ||
| 5856 | goto out; | ||
| 5857 | } | ||
| 5858 | allowed_chunk_alloc = 0; | ||
| 5859 | if (ret == 1) | ||
| 5860 | done_chunk_alloc = 1; | ||
| 5861 | } else if (!done_chunk_alloc && | ||
| 5862 | space_info->force_alloc == | ||
| 5863 | CHUNK_ALLOC_NO_FORCE) { | ||
| 5864 | space_info->force_alloc = CHUNK_ALLOC_LIMITED; | ||
| 5865 | } | 5866 | } |
| 5866 | |||
| 5867 | /* | ||
| 5868 | * We didn't allocate a chunk, go ahead and drop the | ||
| 5869 | * empty size and loop again. | ||
| 5870 | */ | ||
| 5871 | if (!done_chunk_alloc) | ||
| 5872 | loop = LOOP_NO_EMPTY_SIZE; | ||
| 5873 | } | 5867 | } |
| 5874 | 5868 | ||
| 5875 | if (loop == LOOP_NO_EMPTY_SIZE) { | 5869 | if (loop == LOOP_NO_EMPTY_SIZE) { |
| @@ -5944,20 +5938,6 @@ int btrfs_reserve_extent(struct btrfs_trans_handle *trans, | |||
| 5944 | 5938 | ||
| 5945 | data = btrfs_get_alloc_profile(root, data); | 5939 | data = btrfs_get_alloc_profile(root, data); |
| 5946 | again: | 5940 | again: |
| 5947 | /* | ||
| 5948 | * the only place that sets empty_size is btrfs_realloc_node, which | ||
| 5949 | * is not called recursively on allocations | ||
| 5950 | */ | ||
| 5951 | if (empty_size || root->ref_cows) { | ||
| 5952 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | ||
| 5953 | num_bytes + 2 * 1024 * 1024, data, | ||
| 5954 | CHUNK_ALLOC_NO_FORCE); | ||
| 5955 | if (ret < 0 && ret != -ENOSPC) { | ||
| 5956 | btrfs_abort_transaction(trans, root, ret); | ||
| 5957 | return ret; | ||
| 5958 | } | ||
| 5959 | } | ||
| 5960 | |||
| 5961 | WARN_ON(num_bytes < root->sectorsize); | 5941 | WARN_ON(num_bytes < root->sectorsize); |
| 5962 | ret = find_free_extent(trans, root, num_bytes, empty_size, | 5942 | ret = find_free_extent(trans, root, num_bytes, empty_size, |
| 5963 | hint_byte, ins, data); | 5943 | hint_byte, ins, data); |
| @@ -5967,12 +5947,6 @@ again: | |||
| 5967 | num_bytes = num_bytes >> 1; | 5947 | num_bytes = num_bytes >> 1; |
| 5968 | num_bytes = num_bytes & ~(root->sectorsize - 1); | 5948 | num_bytes = num_bytes & ~(root->sectorsize - 1); |
| 5969 | num_bytes = max(num_bytes, min_alloc_size); | 5949 | num_bytes = max(num_bytes, min_alloc_size); |
| 5970 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | ||
| 5971 | num_bytes, data, CHUNK_ALLOC_FORCE); | ||
| 5972 | if (ret < 0 && ret != -ENOSPC) { | ||
| 5973 | btrfs_abort_transaction(trans, root, ret); | ||
| 5974 | return ret; | ||
| 5975 | } | ||
| 5976 | if (num_bytes == min_alloc_size) | 5950 | if (num_bytes == min_alloc_size) |
| 5977 | final_tried = true; | 5951 | final_tried = true; |
| 5978 | goto again; | 5952 | goto again; |
| @@ -6314,7 +6288,7 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
| 6314 | ret = block_rsv_use_bytes(block_rsv, blocksize); | 6288 | ret = block_rsv_use_bytes(block_rsv, blocksize); |
| 6315 | if (!ret) | 6289 | if (!ret) |
| 6316 | return block_rsv; | 6290 | return block_rsv; |
| 6317 | if (ret) { | 6291 | if (ret && !block_rsv->failfast) { |
| 6318 | static DEFINE_RATELIMIT_STATE(_rs, | 6292 | static DEFINE_RATELIMIT_STATE(_rs, |
| 6319 | DEFAULT_RATELIMIT_INTERVAL, | 6293 | DEFAULT_RATELIMIT_INTERVAL, |
| 6320 | /*DEFAULT_RATELIMIT_BURST*/ 2); | 6294 | /*DEFAULT_RATELIMIT_BURST*/ 2); |
| @@ -7279,7 +7253,7 @@ int btrfs_set_block_group_ro(struct btrfs_root *root, | |||
| 7279 | 7253 | ||
| 7280 | alloc_flags = update_block_group_flags(root, cache->flags); | 7254 | alloc_flags = update_block_group_flags(root, cache->flags); |
| 7281 | if (alloc_flags != cache->flags) { | 7255 | if (alloc_flags != cache->flags) { |
| 7282 | ret = do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7256 | ret = do_chunk_alloc(trans, root, alloc_flags, |
| 7283 | CHUNK_ALLOC_FORCE); | 7257 | CHUNK_ALLOC_FORCE); |
| 7284 | if (ret < 0) | 7258 | if (ret < 0) |
| 7285 | goto out; | 7259 | goto out; |
| @@ -7289,7 +7263,7 @@ int btrfs_set_block_group_ro(struct btrfs_root *root, | |||
| 7289 | if (!ret) | 7263 | if (!ret) |
| 7290 | goto out; | 7264 | goto out; |
| 7291 | alloc_flags = get_alloc_profile(root, cache->space_info->flags); | 7265 | alloc_flags = get_alloc_profile(root, cache->space_info->flags); |
| 7292 | ret = do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7266 | ret = do_chunk_alloc(trans, root, alloc_flags, |
| 7293 | CHUNK_ALLOC_FORCE); | 7267 | CHUNK_ALLOC_FORCE); |
| 7294 | if (ret < 0) | 7268 | if (ret < 0) |
| 7295 | goto out; | 7269 | goto out; |
| @@ -7303,7 +7277,7 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans, | |||
| 7303 | struct btrfs_root *root, u64 type) | 7277 | struct btrfs_root *root, u64 type) |
| 7304 | { | 7278 | { |
| 7305 | u64 alloc_flags = get_alloc_profile(root, type); | 7279 | u64 alloc_flags = get_alloc_profile(root, type); |
| 7306 | return do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7280 | return do_chunk_alloc(trans, root, alloc_flags, |
| 7307 | CHUNK_ALLOC_FORCE); | 7281 | CHUNK_ALLOC_FORCE); |
| 7308 | } | 7282 | } |
| 7309 | 7283 | ||
| @@ -7810,6 +7784,34 @@ error: | |||
| 7810 | return ret; | 7784 | return ret; |
| 7811 | } | 7785 | } |
| 7812 | 7786 | ||
| 7787 | void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | ||
| 7788 | struct btrfs_root *root) | ||
| 7789 | { | ||
| 7790 | struct btrfs_block_group_cache *block_group, *tmp; | ||
| 7791 | struct btrfs_root *extent_root = root->fs_info->extent_root; | ||
| 7792 | struct btrfs_block_group_item item; | ||
| 7793 | struct btrfs_key key; | ||
| 7794 | int ret = 0; | ||
| 7795 | |||
| 7796 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, | ||
| 7797 | new_bg_list) { | ||
| 7798 | list_del_init(&block_group->new_bg_list); | ||
| 7799 | |||
| 7800 | if (ret) | ||
| 7801 | continue; | ||
| 7802 | |||
| 7803 | spin_lock(&block_group->lock); | ||
| 7804 | memcpy(&item, &block_group->item, sizeof(item)); | ||
| 7805 | memcpy(&key, &block_group->key, sizeof(key)); | ||
| 7806 | spin_unlock(&block_group->lock); | ||
| 7807 | |||
| 7808 | ret = btrfs_insert_item(trans, extent_root, &key, &item, | ||
| 7809 | sizeof(item)); | ||
| 7810 | if (ret) | ||
| 7811 | btrfs_abort_transaction(trans, extent_root, ret); | ||
| 7812 | } | ||
| 7813 | } | ||
| 7814 | |||
| 7813 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, | 7815 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, |
| 7814 | struct btrfs_root *root, u64 bytes_used, | 7816 | struct btrfs_root *root, u64 bytes_used, |
| 7815 | u64 type, u64 chunk_objectid, u64 chunk_offset, | 7817 | u64 type, u64 chunk_objectid, u64 chunk_offset, |
| @@ -7843,6 +7845,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
| 7843 | spin_lock_init(&cache->lock); | 7845 | spin_lock_init(&cache->lock); |
| 7844 | INIT_LIST_HEAD(&cache->list); | 7846 | INIT_LIST_HEAD(&cache->list); |
| 7845 | INIT_LIST_HEAD(&cache->cluster_list); | 7847 | INIT_LIST_HEAD(&cache->cluster_list); |
| 7848 | INIT_LIST_HEAD(&cache->new_bg_list); | ||
| 7846 | 7849 | ||
| 7847 | btrfs_init_free_space_ctl(cache); | 7850 | btrfs_init_free_space_ctl(cache); |
| 7848 | 7851 | ||
| @@ -7874,12 +7877,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
| 7874 | ret = btrfs_add_block_group_cache(root->fs_info, cache); | 7877 | ret = btrfs_add_block_group_cache(root->fs_info, cache); |
| 7875 | BUG_ON(ret); /* Logic error */ | 7878 | BUG_ON(ret); /* Logic error */ |
| 7876 | 7879 | ||
| 7877 | ret = btrfs_insert_item(trans, extent_root, &cache->key, &cache->item, | 7880 | list_add_tail(&cache->new_bg_list, &trans->new_bgs); |
| 7878 | sizeof(cache->item)); | ||
| 7879 | if (ret) { | ||
| 7880 | btrfs_abort_transaction(trans, extent_root, ret); | ||
| 7881 | return ret; | ||
| 7882 | } | ||
| 7883 | 7881 | ||
| 7884 | set_avail_alloc_bits(extent_root->fs_info, type); | 7882 | set_avail_alloc_bits(extent_root->fs_info, type); |
| 7885 | 7883 | ||
