patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / net / sunrpc / svcsock.c
index a8ac421..024e768 100644 (file)
@@ -1255,6 +1255,7 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
 
        /* No data, incomplete (TCP) read, or accept() */
        if (len == 0 || len == -EAGAIN) {
+               rqstp->rq_res.len = 0;
                svc_sock_release(rqstp);
                return -EAGAIN;
        }
@@ -1511,9 +1512,9 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
        dprintk("revisit queued\n");
        svsk = dr->svsk;
        dr->svsk = NULL;
-       spin_lock(&serv->sv_lock);
+       spin_lock_bh(&serv->sv_lock);
        list_add(&dr->handle.recent, &svsk->sk_deferred);
-       spin_unlock(&serv->sv_lock);
+       spin_unlock_bh(&serv->sv_lock);
        set_bit(SK_DEFERRED, &svsk->sk_flags);
        svc_sock_enqueue(svsk);
        svc_sock_put(svsk);
@@ -1544,10 +1545,10 @@ svc_defer(struct cache_req *req)
                dr->argslen = rqstp->rq_arg.len >> 2;
                memcpy(dr->args, rqstp->rq_arg.head[0].iov_base-skip, dr->argslen<<2);
        }
-       spin_lock(&rqstp->rq_server->sv_lock);
+       spin_lock_bh(&rqstp->rq_server->sv_lock);
        rqstp->rq_sock->sk_inuse++;
        dr->svsk = rqstp->rq_sock;
-       spin_unlock(&rqstp->rq_server->sv_lock);
+       spin_unlock_bh(&rqstp->rq_server->sv_lock);
 
        dr->handle.revisit = svc_revisit;
        return &dr->handle;
@@ -1577,7 +1578,7 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk)
        
        if (!test_bit(SK_DEFERRED, &svsk->sk_flags))
                return NULL;
-       spin_lock(&serv->sv_lock);
+       spin_lock_bh(&serv->sv_lock);
        clear_bit(SK_DEFERRED, &svsk->sk_flags);
        if (!list_empty(&svsk->sk_deferred)) {
                dr = list_entry(svsk->sk_deferred.next,
@@ -1586,6 +1587,6 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk)
                list_del_init(&dr->handle.recent);
                set_bit(SK_DEFERRED, &svsk->sk_flags);
        }
-       spin_unlock(&serv->sv_lock);
+       spin_unlock_bh(&serv->sv_lock);
        return dr;
 }