On Sun, Mar 1, 2020 at 6:25 PM Trond Myklebust <trondmy@xxxxxxxxx> wrote: > > 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 > Trond, back in 2014 you had this NFSv4 only patch that took a more surgical approach: https://marc.info/?l=linux-nfs&m=141414531832768&w=2 It looks like discussion died out on it after it was ineffective to solve a different problem. Is there a reason why you don't want to do that approach now?