diff options
Diffstat (limited to 'fs/btrfs/transaction.c')
| -rw-r--r-- | fs/btrfs/transaction.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 127fa1535f58..4ec2b660d014 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -850,14 +850,6 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, | |||
| 850 | 850 | ||
| 851 | btrfs_trans_release_chunk_metadata(trans); | 851 | btrfs_trans_release_chunk_metadata(trans); |
| 852 | 852 | ||
| 853 | if (lock && should_end_transaction(trans) && | ||
| 854 | READ_ONCE(cur_trans->state) == TRANS_STATE_RUNNING) { | ||
| 855 | spin_lock(&info->trans_lock); | ||
| 856 | if (cur_trans->state == TRANS_STATE_RUNNING) | ||
| 857 | cur_trans->state = TRANS_STATE_BLOCKED; | ||
| 858 | spin_unlock(&info->trans_lock); | ||
| 859 | } | ||
| 860 | |||
| 861 | if (lock && READ_ONCE(cur_trans->state) == TRANS_STATE_BLOCKED) { | 853 | if (lock && READ_ONCE(cur_trans->state) == TRANS_STATE_BLOCKED) { |
| 862 | if (throttle) | 854 | if (throttle) |
| 863 | return btrfs_commit_transaction(trans); | 855 | return btrfs_commit_transaction(trans); |
| @@ -1879,6 +1871,21 @@ static void cleanup_transaction(struct btrfs_trans_handle *trans, int err) | |||
| 1879 | kmem_cache_free(btrfs_trans_handle_cachep, trans); | 1871 | kmem_cache_free(btrfs_trans_handle_cachep, trans); |
| 1880 | } | 1872 | } |
| 1881 | 1873 | ||
| 1874 | /* | ||
| 1875 | * Release reserved delayed ref space of all pending block groups of the | ||
| 1876 | * transaction and remove them from the list | ||
| 1877 | */ | ||
| 1878 | static void btrfs_cleanup_pending_block_groups(struct btrfs_trans_handle *trans) | ||
| 1879 | { | ||
| 1880 | struct btrfs_fs_info *fs_info = trans->fs_info; | ||
| 1881 | struct btrfs_block_group_cache *block_group, *tmp; | ||
| 1882 | |||
| 1883 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, bg_list) { | ||
| 1884 | btrfs_delayed_refs_rsv_release(fs_info, 1); | ||
| 1885 | list_del_init(&block_group->bg_list); | ||
| 1886 | } | ||
| 1887 | } | ||
| 1888 | |||
| 1882 | static inline int btrfs_start_delalloc_flush(struct btrfs_fs_info *fs_info) | 1889 | static inline int btrfs_start_delalloc_flush(struct btrfs_fs_info *fs_info) |
| 1883 | { | 1890 | { |
| 1884 | /* | 1891 | /* |
| @@ -2270,6 +2277,7 @@ scrub_continue: | |||
| 2270 | btrfs_scrub_continue(fs_info); | 2277 | btrfs_scrub_continue(fs_info); |
| 2271 | cleanup_transaction: | 2278 | cleanup_transaction: |
| 2272 | btrfs_trans_release_metadata(trans); | 2279 | btrfs_trans_release_metadata(trans); |
| 2280 | btrfs_cleanup_pending_block_groups(trans); | ||
| 2273 | btrfs_trans_release_chunk_metadata(trans); | 2281 | btrfs_trans_release_chunk_metadata(trans); |
| 2274 | trans->block_rsv = NULL; | 2282 | trans->block_rsv = NULL; |
| 2275 | btrfs_warn(fs_info, "Skipping commit of aborted transaction."); | 2283 | btrfs_warn(fs_info, "Skipping commit of aborted transaction."); |
