From: J. Bruce Fields Date: Tue, 30 Mar 2010 01:02:31 +0000 (-0400) Subject: svcrpc: don't hold sv_lock over svc_xprt_put() X-Git-Tag: cont_sys_log_2~3^2~35 X-Git-Url: http://ftp.safe.ca/?a=commitdiff_plain;h=788e69e548cc8d127b90f0de1f7b7e983d1d587a;p=safe%2Fjmp%2Flinux-2.6 svcrpc: don't hold sv_lock over svc_xprt_put() svc_xprt_put() can call tcp_close(), which can sleep, so we shouldn't be holding this lock. In fact, only the xpt_list removal and the sv_tmpcnt decrement should need the sv_lock here. Reported-by: Mi Jinlong Signed-off-by: J. Bruce Fields --- diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 8f0f1fb..c334f54 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -892,12 +892,12 @@ void svc_delete_xprt(struct svc_xprt *xprt) */ if (test_bit(XPT_TEMP, &xprt->xpt_flags)) serv->sv_tmpcnt--; + spin_unlock_bh(&serv->sv_lock); while ((dr = svc_deferred_dequeue(xprt)) != NULL) kfree(dr); svc_xprt_put(xprt); - spin_unlock_bh(&serv->sv_lock); } void svc_close_xprt(struct svc_xprt *xprt)