Skip to contentSkip to conversation

knfsd: allow preserving of transport header across deferrals

RFC PATCH New Greg Banks 1 participant 1 message May 23, 2007

Subsystems (3)
lore
Share & tools
lore

Greg Banks

author
#0 lore raw

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.

---

 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
Index: linux/include/linux/sunrpc/svc.h
===================================================================
@@ -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
Index: linux/include/linux/sunrpc/xdr.h
===================================================================
@@ -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
Index: linux/net/sunrpc/svc.c
===================================================================
@@ -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
Index: linux/net/sunrpc/svcsock.c
===================================================================
@@ -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