|
@@ -788,15 +788,20 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
|
|
}
|
|
}
|
|
|
|
|
|
clear_bit(SK_DATA, &svsk->sk_flags);
|
|
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);
|
|
rqstp->rq_addrlen = sizeof(rqstp->rq_addr);
|
|
if (skb->tstamp.tv64 == 0) {
|
|
if (skb->tstamp.tv64 == 0) {
|