Subject: NFS: never queue requests with rq_cong set on the sending queue
From: NeilBrown <neilb@suse.de>
References: bsc#932458
Patch-mainline: not submitted

Requests with ->rq_cong set prevent other requests from being processed.
If all allowed such requested end up on the sending queue behind
one which doesn't have ->rq_cong set, we deadlock.

So make sure ->rq_cong is not set before enqueuing.

Signed-off-by: NeilBrown <neilb@suse.de>
---
 net/sunrpc/xprt.c |    3 +++
 1 file changed, 3 insertions(+)

--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -65,6 +65,7 @@
 static void	xprt_request_init(struct rpc_task *, struct rpc_xprt *);
 static void	xprt_connect_status(struct rpc_task *task);
 static int      __xprt_get_cong(struct rpc_xprt *, struct rpc_task *);
+static void	__xprt_put_cong(struct rpc_xprt *xprt, struct rpc_rqst *req);
 
 static DEFINE_SPINLOCK(xprt_list_lock);
 static LIST_HEAD(xprt_list);
@@ -270,6 +271,8 @@ static int xprt_reserve_xprt_cong2(struc
 	}
 	xprt_clear_locked(xprt);
 out_sleep:
+	if (req)
+		__xprt_put_cong(xprt, req);
 	dprintk("RPC: %5u failed to lock transport %p\n", task->tk_pid, xprt);
 	task->tk_timeout = 0;
 	task->tk_status = -EAGAIN;
