If a server wants to drop a request, then it should also drop the connection, in order to let the client know. Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> --- net/sunrpc/svc_xprt.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index de3c077733a7..83a527e56c87 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -873,6 +873,13 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) } EXPORT_SYMBOL_GPL(svc_recv); +static void svc_drop_connection(struct svc_xprt *xprt) +{ + if (test_bit(XPT_TEMP, &xprt->xpt_flags) && + !test_and_set_bit(XPT_CLOSE, &xprt->xpt_flags)) + svc_xprt_enqueue(xprt); +} + /* * Drop request */ @@ -880,6 +887,8 @@ void svc_drop(struct svc_rqst *rqstp) { trace_svc_drop(rqstp); dprintk("svc: xprt %p dropped request\n", rqstp->rq_xprt); + /* Close the connection when dropping a request */ + svc_drop_connection(rqstp->rq_xprt); svc_xprt_release(rqstp); } EXPORT_SYMBOL_GPL(svc_drop); @@ -1148,6 +1157,7 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many) if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) { spin_unlock(&xprt->xpt_lock); dprintk("revisit canceled\n"); + svc_drop_connection(xprt); svc_xprt_put(xprt); trace_svc_drop_deferred(dr); kfree(dr); -- 2.24.1