diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-25 09:52:59 +0100 | 
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-25 09:52:59 +0100 | 
| commit | d1e16c1a61d68692dba346f4a841315343b085f4 (patch) | |
| tree | 249ec07d1489769fe83b4ec507708455cc0c5138 /fs/btrfs/transaction.c | |
| parent | 1573ee81cb9ef24fa5acee6b7442e215e63ede2f (diff) | |
| parent | 6b16351acbd415e66ba16bf7d473ece1574cf0bc (diff) | |
| download | olio-linux-3.10-d1e16c1a61d68692dba346f4a841315343b085f4.tar.xz olio-linux-3.10-d1e16c1a61d68692dba346f4a841315343b085f4.zip  | |
Merge tag 'v3.5-rc4' into for-3.6
Linux 3.5-rc4 contains some bug fixes which overlap with new features.
Diffstat (limited to 'fs/btrfs/transaction.c')
| -rw-r--r-- | fs/btrfs/transaction.c | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 1791c6e3d83..b72b068183e 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -100,6 +100,10 @@ loop:  		kmem_cache_free(btrfs_transaction_cachep, cur_trans);  		cur_trans = fs_info->running_transaction;  		goto loop; +	} else if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { +		spin_unlock(&root->fs_info->trans_lock); +		kmem_cache_free(btrfs_transaction_cachep, cur_trans); +		return -EROFS;  	}  	atomic_set(&cur_trans->num_writers, 1); @@ -1213,14 +1217,20 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans,  static void cleanup_transaction(struct btrfs_trans_handle *trans, -				struct btrfs_root *root) +				struct btrfs_root *root, int err)  {  	struct btrfs_transaction *cur_trans = trans->transaction;  	WARN_ON(trans->use_count > 1); +	btrfs_abort_transaction(trans, root, err); +  	spin_lock(&root->fs_info->trans_lock);  	list_del_init(&cur_trans->list); +	if (cur_trans == root->fs_info->running_transaction) { +		root->fs_info->running_transaction = NULL; +		root->fs_info->trans_no_join = 0; +	}  	spin_unlock(&root->fs_info->trans_lock);  	btrfs_cleanup_one_transaction(trans->transaction, root); @@ -1526,7 +1536,7 @@ cleanup_transaction:  //	WARN_ON(1);  	if (current->journal_info == trans)  		current->journal_info = NULL; -	cleanup_transaction(trans, root); +	cleanup_transaction(trans, root, ret);  	return ret;  }  |