aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2006-01-18 20:43:16 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-18 22:20:24 -0500
commit1918e341383ab787d6c5b17200f4ed901b10c777 (patch)
tree5644f3d1ecfbc104ed956ad674785ee69348df41
parent7e8f05934d540aeb45c1cc3cc3a0e811bd61866b (diff)
[PATCH] svcrpc: save and restore the daddr field when request deferred
The server code currently keeps track of the destination address on every request so that it can reply using the same address. However we forget to do that in the case of a deferred request. Remedy this oversight. >From folks at PolyServe. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/linux/sunrpc/svc.h1
-rw-r--r--net/sunrpc/svcsock.c2
2 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index e4086ec8b952..50cab2a09f28 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -246,6 +246,7 @@ struct svc_deferred_req {
246 u32 prot; /* protocol (UDP or TCP) */ 246 u32 prot; /* protocol (UDP or TCP) */
247 struct sockaddr_in addr; 247 struct sockaddr_in addr;
248 struct svc_sock *svsk; /* where reply must go */ 248 struct svc_sock *svsk; /* where reply must go */
249 u32 daddr; /* where reply must come from */
249 struct cache_deferred_req handle; 250 struct cache_deferred_req handle;
250 int argslen; 251 int argslen;
251 u32 args[0]; 252 u32 args[0];
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index e67613e4eb18..50580620e897 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -1527,6 +1527,7 @@ svc_defer(struct cache_req *req)
1527 dr->handle.owner = rqstp->rq_server; 1527 dr->handle.owner = rqstp->rq_server;
1528 dr->prot = rqstp->rq_prot; 1528 dr->prot = rqstp->rq_prot;
1529 dr->addr = rqstp->rq_addr; 1529 dr->addr = rqstp->rq_addr;
1530 dr->daddr = rqstp->rq_daddr;
1530 dr->argslen = rqstp->rq_arg.len >> 2; 1531 dr->argslen = rqstp->rq_arg.len >> 2;
1531 memcpy(dr->args, rqstp->rq_arg.head[0].iov_base-skip, dr->argslen<<2); 1532 memcpy(dr->args, rqstp->rq_arg.head[0].iov_base-skip, dr->argslen<<2);
1532 } 1533 }
@@ -1552,6 +1553,7 @@ static int svc_deferred_recv(struct svc_rqst *rqstp)
1552 rqstp->rq_arg.len = dr->argslen<<2; 1553 rqstp->rq_arg.len = dr->argslen<<2;
1553 rqstp->rq_prot = dr->prot; 1554 rqstp->rq_prot = dr->prot;
1554 rqstp->rq_addr = dr->addr; 1555 rqstp->rq_addr = dr->addr;
1556 rqstp->rq_daddr = dr->daddr;
1555 return dr->argslen<<2; 1557 return dr->argslen<<2;
1556} 1558}
1557 1559