diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2010-03-30 03:02:31 +0200 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2010-03-30 03:02:31 +0200 |
commit | 788e69e548cc8d127b90f0de1f7b7e983d1d587a (patch) | |
tree | b8312151a877978d579af189789e1f3f477f3a5f /net/sunrpc | |
parent | sunrpc/cache: fix module refcnt leak in a failure path (diff) | |
download | linux-788e69e548cc8d127b90f0de1f7b7e983d1d587a.tar.xz linux-788e69e548cc8d127b90f0de1f7b7e983d1d587a.zip |
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 <mijinlong@cn.fujitsu.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/svc_xprt.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 8f0f1fb3dc52..c334f5413c60 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) |