diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 20 | 
1 files changed, 6 insertions, 14 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 528cae123dc9..3d33c4e41e5f 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -2713,14 +2713,12 @@ static inline void btrfs_remove_all_log_ctxs(struct btrfs_root *root,  					     int index, int error)  {  	struct btrfs_log_ctx *ctx; +	struct btrfs_log_ctx *safe; -	if (!error) { -		INIT_LIST_HEAD(&root->log_ctxs[index]); -		return; -	} - -	list_for_each_entry(ctx, &root->log_ctxs[index], list) +	list_for_each_entry_safe(ctx, safe, &root->log_ctxs[index], list) { +		list_del_init(&ctx->list);  		ctx->log_ret = error; +	}  	INIT_LIST_HEAD(&root->log_ctxs[index]);  } @@ -2961,13 +2959,9 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,  	mutex_unlock(&root->log_mutex);  out_wake_log_root: -	/* -	 * We needn't get log_mutex here because we are sure all -	 * the other tasks are blocked. -	 */ +	mutex_lock(&log_root_tree->log_mutex);  	btrfs_remove_all_log_ctxs(log_root_tree, index2, ret); -	mutex_lock(&log_root_tree->log_mutex);  	log_root_tree->log_transid_committed++;  	atomic_set(&log_root_tree->log_commit[index2], 0);  	mutex_unlock(&log_root_tree->log_mutex); @@ -2978,10 +2972,8 @@ out_wake_log_root:  	if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))  		wake_up(&log_root_tree->log_commit_wait[index2]);  out: -	/* See above. */ -	btrfs_remove_all_log_ctxs(root, index1, ret); -  	mutex_lock(&root->log_mutex); +	btrfs_remove_all_log_ctxs(root, index1, ret);  	root->log_transid_committed++;  	atomic_set(&root->log_commit[index1], 0);  	mutex_unlock(&root->log_mutex);  | 
