knfsd: allow preserving of transport header across deferrals
Subsystems (3)
RFC PATCH 2/5 knfsd: allow preserving of transport header across deferrals
Generic code allows transport-specific code to specify a number of bytes of transport-specific header which needs to be preserved across call deferral & revisit.
Signed-off-by Greg Banks <[email protected]>
---
include/linux/sunrpc/svc.h | 2 ++ include/linux/sunrpc/xdr.h | 3 ++- net/sunrpc/svc.c | 1 + net/sunrpc/svcsock.c | 9 +++++++-- 4 files changed, 12 insertions(+), 3 deletions(-)
include/linux/sunrpc/svc.h +2 -0
@@ -321,6 +321,8 @@ struct svc_deferred_req {union svc_addr_u daddr;/* where reply must come from */ struct cache_deferred_req handle;int argslen; +int trans_header;/* size of preserved transport- +* specific header */ __be32 args[0 ]; };
include/linux/sunrpc/xdr.h +2 -1
@@ -58,7 +58,8 @@ struct xdr_buf {unsigned int buflen,/* Total length of storage buffer */ len;/* Length of XDR encoded message */ - +unsigned int trans_header;/* Length of transport-specific +* header in bytes */ };/*
net/sunrpc/svc.c +1 -0
@@ -813,6 +813,7 @@ svc_process(struct svc_rqst *rqstp) rqstp->rq_res.buflen =PAGE_SIZE ; rqstp->rq_res.tail[0 ].iov_base =NULL ; rqstp->rq_res.tail[0 ].iov_len =0 ; + rqstp->rq_res.trans_header =0 ;/* Will be turned off only in gss privacy case: */ rqstp->rq_sendfile_ok =1 ; if (rqstp->rq_sock->sk_type->st_prepare_reply &&
net/sunrpc/svcsock.c +7 -2
@@ -1481,6 +1481,7 @@ svc_recv(struct svc_rqst *rqstp, long ti arg->page_len = (pages-2 )*PAGE_SIZE ; arg->len = (pages-1 )*PAGE_SIZE ; arg->tail[0 ].iov_len =0 ; + arg->trans_header =0 ;try_to_freeze ();cond_resched ();
@@ -2007,7 +2008,8 @@ static struct cache_deferred_req * svc_defer(struct cache_req *req) { struct svc_rqst *rqstp = container_of(req, struct svc_rqst, rq_chandle); -int size =sizeof (struct svc_deferred_req ) + (rqstp->rq_arg.len); +int size =sizeof (struct svc_deferred_req ) + (rqstp->rq_arg.len + + rqstp->rq_arg.trans_header);struct svc_deferred_req *dr;if (rqstp->rq_arg.page_len)
@@ -2028,6 +2030,8 @@ svc_defer(struct cache_req *req) dr->addrlen = rqstp->rq_addrlen; dr->daddr = rqstp->rq_daddr; dr->argslen = rqstp->rq_arg.len >>2 ; + dr->trans_header = rqstp->rq_arg.trans_header; + skip += dr->trans_header;memcpy (dr->args, rqstp->rq_arg.head[0 ].iov_base-skip, dr->argslen<<2 ); }svc_sock_get (rqstp->rq_sock);
@@ -2044,10 +2048,11 @@ static int svc_deferred_recv(struct svc_ {struct svc_deferred_req *dr = rqstp->rq_deferred; - rqstp->rq_arg.head[0 ].iov_base = dr->args; + rqstp->rq_arg.head[0 ].iov_base = dr->args + dr->trans_header; rqstp->rq_arg.head[0 ].iov_len = dr->argslen<<2 ; rqstp->rq_arg.page_len =0 ; rqstp->rq_arg.len = dr->argslen<<2 ; + rqstp->rq_arg.trans_header = dr->trans_header; rqstp->rq_prot = dr->prot;memcpy (&rqstp->rq_addr, &dr->addr, dr->addrlen); rqstp->rq_addrlen = dr->addrlen;
Signature · 12 lines
Greg Banks, R&D Software Engineer, SGI Australian Software Group. Apparently, I'm Bedevere. Which MPHG character are you? I don't speak for SGI. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ NFS maillist - [email protected] https://lists.sourceforge.net/lists/listinfo/nfs