diff options
Diffstat (limited to 'fs/nfs/nfs42proc.c')
| -rw-r--r-- | fs/nfs/nfs42proc.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index ac5b784a1de0..fed06fd9998d 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -137,31 +137,32 @@ static int handle_async_copy(struct nfs42_copy_res *res,  			     struct file *dst,  			     nfs4_stateid *src_stateid)  { -	struct nfs4_copy_state *copy; +	struct nfs4_copy_state *copy, *tmp_copy;  	int status = NFS4_OK;  	bool found_pending = false;  	struct nfs_open_context *ctx = nfs_file_open_context(dst); +	copy = kzalloc(sizeof(struct nfs4_copy_state), GFP_NOFS); +	if (!copy) +		return -ENOMEM; +  	spin_lock(&server->nfs_client->cl_lock); -	list_for_each_entry(copy, &server->nfs_client->pending_cb_stateids, +	list_for_each_entry(tmp_copy, &server->nfs_client->pending_cb_stateids,  				copies) { -		if (memcmp(&res->write_res.stateid, ©->stateid, +		if (memcmp(&res->write_res.stateid, &tmp_copy->stateid,  				NFS4_STATEID_SIZE))  			continue;  		found_pending = true; -		list_del(©->copies); +		list_del(&tmp_copy->copies);  		break;  	}  	if (found_pending) {  		spin_unlock(&server->nfs_client->cl_lock); +		kfree(copy); +		copy = tmp_copy;  		goto out;  	} -	copy = kzalloc(sizeof(struct nfs4_copy_state), GFP_NOFS); -	if (!copy) { -		spin_unlock(&server->nfs_client->cl_lock); -		return -ENOMEM; -	}  	memcpy(©->stateid, &res->write_res.stateid, NFS4_STATEID_SIZE);  	init_completion(©->completion);  	copy->parent_state = ctx->state;  | 
