diff options
| author | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
|---|---|---|
| committer | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
| commit | 5c34202b8bf942da411b6599668a76b07449bbfd (patch) | |
| tree | 5719c361321eaddc8e4f1b0c8a7994f0e9a6fdd3 /net/sunrpc/svcsock.c | |
| parent | 0d4804b31f91cfbcff6d62af0bc09a893a1c8ae0 (diff) | |
| parent | 1f8a6b658a943b4f04a1fc7b3a420360202c86cd (diff) | |
Merge /pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'net/sunrpc/svcsock.c')
| -rw-r--r-- | net/sunrpc/svcsock.c | 34 | 
1 files changed, 20 insertions, 14 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 22f61aee482..5baf48de255 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -53,7 +53,8 @@   * 	svc_serv->sv_lock protects sv_tempsocks, sv_permsocks, sv_tmpcnt.   *	when both need to be taken (rare), svc_serv->sv_lock is first.   *	BKL protects svc_serv->sv_nrthread. - *	svc_sock->sk_defer_lock protects the svc_sock->sk_deferred list + *	svc_sock->sk_lock protects the svc_sock->sk_deferred list + *             and the ->sk_info_authunix cache.   *	svc_sock->sk_flags.SK_BUSY prevents a svc_sock being enqueued multiply.   *   *	Some flags can be set to certain values at any time @@ -787,15 +788,20 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)  	}  	clear_bit(SK_DATA, &svsk->sk_flags); -	while ((err = kernel_recvmsg(svsk->sk_sock, &msg, NULL, -				     0, 0, MSG_PEEK | MSG_DONTWAIT)) < 0 || -	       (skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err)) == NULL) { -		if (err == -EAGAIN) { -			svc_sock_received(svsk); -			return err; +	skb = NULL; +	err = kernel_recvmsg(svsk->sk_sock, &msg, NULL, +			     0, 0, MSG_PEEK | MSG_DONTWAIT); +	if (err >= 0) +		skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err); + +	if (skb == NULL) { +		if (err != -EAGAIN) { +			/* possibly an icmp error */ +			dprintk("svc: recvfrom returned error %d\n", -err); +			set_bit(SK_DATA, &svsk->sk_flags);  		} -		/* possibly an icmp error */ -		dprintk("svc: recvfrom returned error %d\n", -err); +		svc_sock_received(svsk); +		return -EAGAIN;  	}  	rqstp->rq_addrlen = sizeof(rqstp->rq_addr);  	if (skb->tstamp.tv64 == 0) { @@ -1633,7 +1639,7 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,  	svsk->sk_server = serv;  	atomic_set(&svsk->sk_inuse, 1);  	svsk->sk_lastrecv = get_seconds(); -	spin_lock_init(&svsk->sk_defer_lock); +	spin_lock_init(&svsk->sk_lock);  	INIT_LIST_HEAD(&svsk->sk_deferred);  	INIT_LIST_HEAD(&svsk->sk_ready);  	mutex_init(&svsk->sk_mutex); @@ -1857,9 +1863,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_bh(&svsk->sk_defer_lock); +	spin_lock(&svsk->sk_lock);  	list_add(&dr->handle.recent, &svsk->sk_deferred); -	spin_unlock_bh(&svsk->sk_defer_lock); +	spin_unlock(&svsk->sk_lock);  	set_bit(SK_DEFERRED, &svsk->sk_flags);  	svc_sock_enqueue(svsk);  	svc_sock_put(svsk); @@ -1925,7 +1931,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_bh(&svsk->sk_defer_lock); +	spin_lock(&svsk->sk_lock);  	clear_bit(SK_DEFERRED, &svsk->sk_flags);  	if (!list_empty(&svsk->sk_deferred)) {  		dr = list_entry(svsk->sk_deferred.next, @@ -1934,6 +1940,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_bh(&svsk->sk_defer_lock); +	spin_unlock(&svsk->sk_lock);  	return dr;  }  | 
