diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/sunrpc/sched.c | 3 | ||||
| -rw-r--r-- | net/sunrpc/xprt.c | 12 | 
2 files changed, 11 insertions, 4 deletions
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index b4133bd1391..bfa31714581 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -972,8 +972,7 @@ static void rpc_async_release(struct work_struct *work)  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);  		task->tk_msg.rpc_cred = NULL; diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index bd462a532ac..33811db8788 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -1136,10 +1136,18 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)  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) { +			rcu_read_lock(); +			xprt = rcu_dereference(task->tk_client->cl_xprt); +			if (xprt->snd_task == task) +				xprt_release_write(xprt, task); +			rcu_read_unlock(); +		}  		return; +	}  	xprt = req->rq_xprt;  	if (task->tk_ops->rpc_count_stats != NULL)  |