diff options
Diffstat (limited to 'net/sunrpc/svcsock.c')
| -rw-r--r-- | net/sunrpc/svcsock.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index f6e1eb1ea720..2772fee93881 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
| @@ -452,6 +452,8 @@ union svc_pktinfo_u { | |||
| 452 | struct in_pktinfo pkti; | 452 | struct in_pktinfo pkti; |
| 453 | struct in6_pktinfo pkti6; | 453 | struct in6_pktinfo pkti6; |
| 454 | }; | 454 | }; |
| 455 | #define SVC_PKTINFO_SPACE \ | ||
| 456 | CMSG_SPACE(sizeof(union svc_pktinfo_u)) | ||
| 455 | 457 | ||
| 456 | static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) | 458 | static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) |
| 457 | { | 459 | { |
| @@ -491,8 +493,11 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr) | |||
| 491 | struct svc_sock *svsk = rqstp->rq_sock; | 493 | struct svc_sock *svsk = rqstp->rq_sock; |
| 492 | struct socket *sock = svsk->sk_sock; | 494 | struct socket *sock = svsk->sk_sock; |
| 493 | int slen; | 495 | int slen; |
| 494 | char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))]; | 496 | union { |
| 495 | struct cmsghdr *cmh = (struct cmsghdr *)buffer; | 497 | struct cmsghdr hdr; |
| 498 | long all[SVC_PKTINFO_SPACE / sizeof(long)]; | ||
| 499 | } buffer; | ||
| 500 | struct cmsghdr *cmh = &buffer.hdr; | ||
| 496 | int len = 0; | 501 | int len = 0; |
| 497 | int result; | 502 | int result; |
| 498 | int size; | 503 | int size; |
| @@ -745,8 +750,11 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
| 745 | struct svc_sock *svsk = rqstp->rq_sock; | 750 | struct svc_sock *svsk = rqstp->rq_sock; |
| 746 | struct svc_serv *serv = svsk->sk_server; | 751 | struct svc_serv *serv = svsk->sk_server; |
| 747 | struct sk_buff *skb; | 752 | struct sk_buff *skb; |
| 748 | char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))]; | 753 | union { |
| 749 | struct cmsghdr *cmh = (struct cmsghdr *)buffer; | 754 | struct cmsghdr hdr; |
| 755 | long all[SVC_PKTINFO_SPACE / sizeof(long)]; | ||
| 756 | } buffer; | ||
| 757 | struct cmsghdr *cmh = &buffer.hdr; | ||
| 750 | int err, len; | 758 | int err, len; |
| 751 | struct msghdr msg = { | 759 | struct msghdr msg = { |
| 752 | .msg_name = svc_addr(rqstp), | 760 | .msg_name = svc_addr(rqstp), |
| @@ -779,8 +787,8 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
| 779 | } | 787 | } |
| 780 | 788 | ||
| 781 | clear_bit(SK_DATA, &svsk->sk_flags); | 789 | clear_bit(SK_DATA, &svsk->sk_flags); |
| 782 | while ((err == kernel_recvmsg(svsk->sk_sock, &msg, NULL, | 790 | while ((err = kernel_recvmsg(svsk->sk_sock, &msg, NULL, |
| 783 | 0, 0, MSG_PEEK | MSG_DONTWAIT)) < 0 || | 791 | 0, 0, MSG_PEEK | MSG_DONTWAIT)) < 0 || |
| 784 | (skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err)) == NULL) { | 792 | (skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err)) == NULL) { |
| 785 | if (err == -EAGAIN) { | 793 | if (err == -EAGAIN) { |
| 786 | svc_sock_received(svsk); | 794 | svc_sock_received(svsk); |
