From: Trond Myklebust Date: Thu, 25 Oct 2007 22:42:53 +0000 (-0400) Subject: SUNRPC: allow the caller of rpc_run_task to preallocate the struct rpc_task X-Git-Tag: v2.6.25-rc1~1146^2~88 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8f5d77c8029ff8f5dcd1dfc133aac0bbbffd92b;p=linux-2.6 SUNRPC: allow the caller of rpc_run_task to preallocate the struct rpc_task Signed-off-by: Trond Myklebust --- diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index c9444fdc23..60a05c7163 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -118,6 +118,7 @@ struct rpc_call_ops { }; struct rpc_task_setup { + struct rpc_task *task; struct rpc_clnt *rpc_client; const struct rpc_message *rpc_message; const struct rpc_call_ops *callback_ops; diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index fa53a88b2c..c03e7bf6e9 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -885,16 +885,20 @@ static void rpc_free_task(struct rcu_head *rcu) */ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data) { - struct rpc_task *task; - - task = rpc_alloc_task(); - if (!task) - goto out; + struct rpc_task *task = setup_data->task; + unsigned short flags = 0; + + if (task == NULL) { + task = rpc_alloc_task(); + if (task == NULL) + goto out; + flags = RPC_TASK_DYNAMIC; + } rpc_init_task(task, setup_data); + task->tk_flags |= flags; dprintk("RPC: allocated task %p\n", task); - task->tk_flags |= RPC_TASK_DYNAMIC; out: return task; }