@@ -894,8 +894,7 @@
static void rpc_release_resources_task(struct rpc_task *task)
{
- if (task->tk_rqstp)
- xprt_release(task);
+ xprt_release(task);
if (task->tk_msg.rpc_cred)
put_rpccred(task->tk_msg.rpc_cred);
rpc_task_release_client(task);
@@ -1128,10 +1128,16 @@
void xprt_release(struct rpc_task *task)
{
struct rpc_xprt *xprt;
- struct rpc_rqst *req;
+ struct rpc_rqst *req = task->tk_rqstp;
- if (!(req = task->tk_rqstp))
+ if (req == NULL) {
+ if (task->tk_client) {
+ xprt = task->tk_xprt;
+ if (xprt->snd_task == task)
+ xprt_release_write(xprt, task);
+ }
return;
+ }
xprt = req->rq_xprt;
rpc_count_iostats(task);