diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 5411f0ab5683..601d7d45d164 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -2828,6 +2828,7 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2828 | struct btrfs_delayed_ref_head *head; | 2828 | struct btrfs_delayed_ref_head *head; |
2829 | int ret; | 2829 | int ret; |
2830 | int run_all = count == (unsigned long)-1; | 2830 | int run_all = count == (unsigned long)-1; |
2831 | bool can_flush_pending_bgs = trans->can_flush_pending_bgs; | ||
2831 | 2832 | ||
2832 | /* We'll clean this up in btrfs_cleanup_transaction */ | 2833 | /* We'll clean this up in btrfs_cleanup_transaction */ |
2833 | if (trans->aborted) | 2834 | if (trans->aborted) |
@@ -2844,6 +2845,7 @@ again: | |||
2844 | #ifdef SCRAMBLE_DELAYED_REFS | 2845 | #ifdef SCRAMBLE_DELAYED_REFS |
2845 | delayed_refs->run_delayed_start = find_middle(&delayed_refs->root); | 2846 | delayed_refs->run_delayed_start = find_middle(&delayed_refs->root); |
2846 | #endif | 2847 | #endif |
2848 | trans->can_flush_pending_bgs = false; | ||
2847 | ret = __btrfs_run_delayed_refs(trans, root, count); | 2849 | ret = __btrfs_run_delayed_refs(trans, root, count); |
2848 | if (ret < 0) { | 2850 | if (ret < 0) { |
2849 | btrfs_abort_transaction(trans, root, ret); | 2851 | btrfs_abort_transaction(trans, root, ret); |
@@ -2893,6 +2895,7 @@ again: | |||
2893 | } | 2895 | } |
2894 | out: | 2896 | out: |
2895 | assert_qgroups_uptodate(trans); | 2897 | assert_qgroups_uptodate(trans); |
2898 | trans->can_flush_pending_bgs = can_flush_pending_bgs; | ||
2896 | return 0; | 2899 | return 0; |
2897 | } | 2900 | } |
2898 | 2901 | ||
@@ -3742,10 +3745,7 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags, | |||
3742 | found->bytes_reserved = 0; | 3745 | found->bytes_reserved = 0; |
3743 | found->bytes_readonly = 0; | 3746 | found->bytes_readonly = 0; |
3744 | found->bytes_may_use = 0; | 3747 | found->bytes_may_use = 0; |
3745 | if (total_bytes > 0) | 3748 | found->full = 0; |
3746 | found->full = 0; | ||
3747 | else | ||
3748 | found->full = 1; | ||
3749 | found->force_alloc = CHUNK_ALLOC_NO_FORCE; | 3749 | found->force_alloc = CHUNK_ALLOC_NO_FORCE; |
3750 | found->chunk_alloc = 0; | 3750 | found->chunk_alloc = 0; |
3751 | found->flush = 0; | 3751 | found->flush = 0; |
@@ -4309,7 +4309,8 @@ out: | |||
4309 | * the block groups that were made dirty during the lifetime of the | 4309 | * the block groups that were made dirty during the lifetime of the |
4310 | * transaction. | 4310 | * transaction. |
4311 | */ | 4311 | */ |
4312 | if (trans->chunk_bytes_reserved >= (2 * 1024 * 1024ull)) { | 4312 | if (trans->can_flush_pending_bgs && |
4313 | trans->chunk_bytes_reserved >= (2 * 1024 * 1024ull)) { | ||
4313 | btrfs_create_pending_block_groups(trans, trans->root); | 4314 | btrfs_create_pending_block_groups(trans, trans->root); |
4314 | btrfs_trans_release_chunk_metadata(trans); | 4315 | btrfs_trans_release_chunk_metadata(trans); |
4315 | } | 4316 | } |
@@ -8668,7 +8669,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
8668 | } | 8669 | } |
8669 | 8670 | ||
8670 | if (test_bit(BTRFS_ROOT_IN_RADIX, &root->state)) { | 8671 | if (test_bit(BTRFS_ROOT_IN_RADIX, &root->state)) { |
8671 | btrfs_drop_and_free_fs_root(tree_root->fs_info, root); | 8672 | btrfs_add_dropped_root(trans, root); |
8672 | } else { | 8673 | } else { |
8673 | free_extent_buffer(root->node); | 8674 | free_extent_buffer(root->node); |
8674 | free_extent_buffer(root->commit_root); | 8675 | free_extent_buffer(root->commit_root); |
@@ -9563,7 +9564,9 @@ void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | |||
9563 | struct btrfs_block_group_item item; | 9564 | struct btrfs_block_group_item item; |
9564 | struct btrfs_key key; | 9565 | struct btrfs_key key; |
9565 | int ret = 0; | 9566 | int ret = 0; |
9567 | bool can_flush_pending_bgs = trans->can_flush_pending_bgs; | ||
9566 | 9568 | ||
9569 | trans->can_flush_pending_bgs = false; | ||
9567 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, bg_list) { | 9570 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, bg_list) { |
9568 | if (ret) | 9571 | if (ret) |
9569 | goto next; | 9572 | goto next; |
@@ -9584,6 +9587,7 @@ void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | |||
9584 | next: | 9587 | next: |
9585 | list_del_init(&block_group->bg_list); | 9588 | list_del_init(&block_group->bg_list); |
9586 | } | 9589 | } |
9590 | trans->can_flush_pending_bgs = can_flush_pending_bgs; | ||
9587 | } | 9591 | } |
9588 | 9592 | ||
9589 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, | 9593 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, |