Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 3127

kernel-2.6.18-238.el5.src.rpm

From: Jeff Layton <jlayton@redhat.com>
Date: Fri, 31 Jul 2009 08:38:45 -0400
Subject: [net] sunrpc: set rq_daddr in svc_rqst on socket recv
Message-id: 1249043927-10558-2-git-send-email-jlayton@redhat.com
O-Subject: [RHEL5.5 PATCH 1/3] BZ#500653: SUNRPC: set rq_daddr in svc_rqst when receiving on socket
Bugzilla: 500653
RH-Acked-by: Peter Staubach <staubach@redhat.com>

The svc_rqst already has a rq_daddr field that gets populated with the
destination address of the call in the UDP codepath. In order to do
callbacks from the correct address, we'll need to track it for other
socktypes too.

Signed-off-by: Jeff Layton <jlayton@redhat.com>

diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 99f0919..12e82f8 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -532,6 +532,7 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen)
 {
 	struct msghdr	msg;
 	struct socket	*sock;
+	struct sockaddr_in daddr;
 	int		len, alen;
 
 	rqstp->rq_addrlen = sizeof(rqstp->rq_addr);
@@ -553,6 +554,10 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen)
 	alen = sizeof(rqstp->rq_addr);
 	kernel_getpeername(sock, (struct sockaddr *)&rqstp->rq_addr, &alen);
 
+	alen = sizeof(daddr);
+	kernel_getsockname(sock, (struct sockaddr *)&daddr, &alen);
+	rqstp->rq_daddr = daddr.sin_addr.s_addr;
+
 	dprintk("svc: socket %p recvfrom(%p, %Zu) = %d\n",
 		rqstp->rq_sock, iov[0].iov_base, iov[0].iov_len, len);