diff options
Diffstat (limited to 'fs/btrfs/transaction.c')
| -rw-r--r-- | fs/btrfs/transaction.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 8da29e8e4de..36422254ef6 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -73,8 +73,10 @@ loop:  	cur_trans = root->fs_info->running_transaction;  	if (cur_trans) { -		if (cur_trans->aborted) +		if (cur_trans->aborted) { +			spin_unlock(&root->fs_info->trans_lock);  			return cur_trans->aborted; +		}  		atomic_inc(&cur_trans->use_count);  		atomic_inc(&cur_trans->num_writers);  		cur_trans->num_joined++; @@ -480,6 +482,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,  	struct btrfs_transaction *cur_trans = trans->transaction;  	struct btrfs_fs_info *info = root->fs_info;  	int count = 0; +	int err = 0;  	if (--trans->use_count) {  		trans->block_rsv = trans->orig_rsv; @@ -532,18 +535,18 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,  	if (current->journal_info == trans)  		current->journal_info = NULL; -	memset(trans, 0, sizeof(*trans)); -	kmem_cache_free(btrfs_trans_handle_cachep, trans);  	if (throttle)  		btrfs_run_delayed_iputs(root);  	if (trans->aborted ||  	    root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { -		return -EIO; +		err = -EIO;  	} -	return 0; +	memset(trans, 0, sizeof(*trans)); +	kmem_cache_free(btrfs_trans_handle_cachep, trans); +	return err;  }  int btrfs_end_transaction(struct btrfs_trans_handle *trans, @@ -1399,6 +1402,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,  	ret = commit_fs_roots(trans, root);  	if (ret) {  		mutex_unlock(&root->fs_info->tree_log_mutex); +		mutex_unlock(&root->fs_info->reloc_mutex);  		goto cleanup_transaction;  	} @@ -1410,6 +1414,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,  	ret = commit_cowonly_roots(trans, root);  	if (ret) {  		mutex_unlock(&root->fs_info->tree_log_mutex); +		mutex_unlock(&root->fs_info->reloc_mutex);  		goto cleanup_transaction;  	}  |