netfilter: ip6table_raw: fix table priority
[safe/jmp/linux-2.6] / net / sunrpc / svc_xprt.c
index d7ec5ca..8f0f1fb 100644 (file)
@@ -706,8 +706,10 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
        spin_unlock_bh(&pool->sp_lock);
 
        len = 0;
-       if (test_bit(XPT_LISTENER, &xprt->xpt_flags) &&
-           !test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
+       if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
+               dprintk("svc_recv: found XPT_CLOSE\n");
+               svc_delete_xprt(xprt);
+       } else if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) {
                struct svc_xprt *newxpt;
                newxpt = xprt->xpt_ops->xpo_accept(xprt);
                if (newxpt) {
@@ -733,7 +735,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
                        svc_xprt_received(newxpt);
                }
                svc_xprt_received(xprt);
-       } else if (!test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
+       } else {
                dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n",
                        rqstp, pool->sp_id, xprt,
                        atomic_read(&xprt->xpt_ref.refcount));
@@ -746,11 +748,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
                dprintk("svc: got len=%d\n", len);
        }
 
-       if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
-               dprintk("svc_recv: found XPT_CLOSE\n");
-               svc_delete_xprt(xprt);
-       }
-
        /* No data, incomplete (TCP) read, or accept() */
        if (len == 0 || len == -EAGAIN) {
                rqstp->rq_res.len = 0;
@@ -896,11 +893,8 @@ void svc_delete_xprt(struct svc_xprt *xprt)
        if (test_bit(XPT_TEMP, &xprt->xpt_flags))
                serv->sv_tmpcnt--;
 
-       for (dr = svc_deferred_dequeue(xprt); dr;
-            dr = svc_deferred_dequeue(xprt)) {
-               svc_xprt_put(xprt);
+       while ((dr = svc_deferred_dequeue(xprt)) != NULL)
                kfree(dr);
-       }
 
        svc_xprt_put(xprt);
        spin_unlock_bh(&serv->sv_lock);