Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19445b99 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Cleanup - make rpc_new_task() call rpc_release_calldata on failure



Also have it return an ERR_PTR(-ENOMEM) instead of a null pointer.

Reviewed-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent ee5ebe85
Loading
Loading
Loading
Loading
+4 −15
Original line number Original line Diff line number Diff line
@@ -556,26 +556,16 @@ static const struct rpc_call_ops rpc_default_ops = {
 */
 */
struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
{
{
	struct rpc_task *task, *ret;
	struct rpc_task *task;


	task = rpc_new_task(task_setup_data);
	task = rpc_new_task(task_setup_data);
	if (task == NULL) {
	if (IS_ERR(task))
		rpc_release_calldata(task_setup_data->callback_ops,
				task_setup_data->callback_data);
		ret = ERR_PTR(-ENOMEM);
		goto out;
		goto out;
	}


	if (task->tk_status != 0) {
		ret = ERR_PTR(task->tk_status);
		rpc_put_task(task);
		goto out;
	}
	atomic_inc(&task->tk_count);
	atomic_inc(&task->tk_count);
	rpc_execute(task);
	rpc_execute(task);
	ret = task;
out:
out:
	return ret;
	return task;
}
}
EXPORT_SYMBOL_GPL(rpc_run_task);
EXPORT_SYMBOL_GPL(rpc_run_task);


@@ -657,9 +647,8 @@ struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req,
	 * Create an rpc_task to send the data
	 * Create an rpc_task to send the data
	 */
	 */
	task = rpc_new_task(&task_setup_data);
	task = rpc_new_task(&task_setup_data);
	if (!task) {
	if (IS_ERR(task)) {
		xprt_free_bc_request(req);
		xprt_free_bc_request(req);
		task = ERR_PTR(-ENOMEM);
		goto out;
		goto out;
	}
	}
	task->tk_rqstp = req;
	task->tk_rqstp = req;
+10 −3
Original line number Original line Diff line number Diff line
@@ -856,16 +856,23 @@ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data)


	if (task == NULL) {
	if (task == NULL) {
		task = rpc_alloc_task();
		task = rpc_alloc_task();
		if (task == NULL)
		if (task == NULL) {
			goto out;
			rpc_release_calldata(setup_data->callback_ops,
					setup_data->callback_data);
			return ERR_PTR(-ENOMEM);
		}
		flags = RPC_TASK_DYNAMIC;
		flags = RPC_TASK_DYNAMIC;
	}
	}


	rpc_init_task(task, setup_data);
	rpc_init_task(task, setup_data);
	if (task->tk_status < 0) {
		int err = task->tk_status;
		rpc_put_task(task);
		return ERR_PTR(err);
	}


	task->tk_flags |= flags;
	task->tk_flags |= flags;
	dprintk("RPC:       allocated task %p\n", task);
	dprintk("RPC:       allocated task %p\n", task);
out:
	return task;
	return task;
}
}