aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2010-02-28 16:33:31 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-04-01 19:01:34 -0400
commitf3fb6babd4e025fc1c4f00280e7c9486171a920e (patch)
treeabd10cc38b48f37c729d986f11e57e1982cc857e /net
parentc08a8108a40a68a0a9bda6d32af820a6af25c6bd (diff)
Revert "sunrpc: move the close processing after do recvfrom method"
commit 1b644b6e6f6160ae35ce4b52c2ca89ed3e356e18 upstream. This reverts commit b0401d725334a94d57335790b8ac2404144748ee, which moved svc_delete_xprt() outside of XPT_BUSY, and allowed it to be called after svc_xpt_recived(), removing its last reference and destroying it after it had already been queued for future processing. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/svc_xprt.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index d6d7df1e4a50..6bd41a9c0e5e 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -699,7 +699,10 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
699 spin_unlock_bh(&pool->sp_lock); 699 spin_unlock_bh(&pool->sp_lock);
700 700
701 len = 0; 701 len = 0;
702 if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) { 702 if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
703 dprintk("svc_recv: found XPT_CLOSE\n");
704 svc_delete_xprt(xprt);
705 } else if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) {
703 struct svc_xprt *newxpt; 706 struct svc_xprt *newxpt;
704 newxpt = xprt->xpt_ops->xpo_accept(xprt); 707 newxpt = xprt->xpt_ops->xpo_accept(xprt);
705 if (newxpt) { 708 if (newxpt) {
@@ -725,7 +728,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
725 svc_xprt_received(newxpt); 728 svc_xprt_received(newxpt);
726 } 729 }
727 svc_xprt_received(xprt); 730 svc_xprt_received(xprt);
728 } else if (!test_bit(XPT_CLOSE, &xprt->xpt_flags)) { 731 } else {
729 dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n", 732 dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n",
730 rqstp, pool->sp_id, xprt, 733 rqstp, pool->sp_id, xprt,
731 atomic_read(&xprt->xpt_ref.refcount)); 734 atomic_read(&xprt->xpt_ref.refcount));
@@ -738,11 +741,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
738 dprintk("svc: got len=%d\n", len); 741 dprintk("svc: got len=%d\n", len);
739 } 742 }
740 743
741 if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
742 dprintk("svc_recv: found XPT_CLOSE\n");
743 svc_delete_xprt(xprt);
744 }
745
746 /* No data, incomplete (TCP) read, or accept() */ 744 /* No data, incomplete (TCP) read, or accept() */
747 if (len == 0 || len == -EAGAIN) { 745 if (len == 0 || len == -EAGAIN) {
748 rqstp->rq_res.len = 0; 746 rqstp->rq_res.len = 0;