diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2006-01-18 20:43:16 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-18 22:20:24 -0500 |
commit | 1918e341383ab787d6c5b17200f4ed901b10c777 (patch) | |
tree | 5644f3d1ecfbc104ed956ad674785ee69348df41 | |
parent | 7e8f05934d540aeb45c1cc3cc3a0e811bd61866b (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.h | 1 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 2 |
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 | ||