2007-09-10 18:00:21

by Talpey, Thomas

[permalink] [raw]
Subject: [PATCH 06/19] SUNRPC: mark bulk read/write data in xdrbuf

SUNRPC: mark bulk read/write data in xdrbuf

Adds a flag word to the xdrbuf struct which indicates any bulk
disposition of the data. This enables RPC transport providers to
marshal it efficiently/appropriately, and may enable other
optimizations.

Signed-off-by: Tom Talpey <[email protected]>

---

fs/nfs/nfs2xdr.c | 2 ++
fs/nfs/nfs3xdr.c | 2 ++
fs/nfs/nfs4xdr.c | 2 ++
include/linux/sunrpc/xdr.h | 5 ++++-
net/sunrpc/clnt.c | 1 +
5 files changed, 11 insertions(+), 1 deletion(-)

Index: kernel/fs/nfs/nfs2xdr.c
===================================================================
--- kernel.orig/fs/nfs/nfs2xdr.c
+++ kernel/fs/nfs/nfs2xdr.c
@@ -251,6 +251,7 @@ nfs_xdr_readargs(struct rpc_rqst *req, _
replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS_readres_sz) << 2;
xdr_inline_pages(&req->rq_rcv_buf, replen,
args->pages, args->pgbase, count);
+ req->rq_rcv_buf.flags |= XDRBUF_READ;
return 0;
}

@@ -313,6 +314,7 @@ nfs_xdr_writeargs(struct rpc_rqst *req,

/* Copy the page array */
xdr_encode_pages(sndbuf, args->pages, args->pgbase, count);
+ sndbuf->flags |= XDRBUF_WRITE;
return 0;
}

Index: kernel/fs/nfs/nfs3xdr.c
===================================================================
--- kernel.orig/fs/nfs/nfs3xdr.c
+++ kernel/fs/nfs/nfs3xdr.c
@@ -346,6 +346,7 @@ nfs3_xdr_readargs(struct rpc_rqst *req,
replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS3_readres_sz) << 2;
xdr_inline_pages(&req->rq_rcv_buf, replen,
args->pages, args->pgbase, count);
+ req->rq_rcv_buf.flags |= XDRBUF_READ;
return 0;
}

@@ -367,6 +368,7 @@ nfs3_xdr_writeargs(struct rpc_rqst *req,

/* Copy the page array */
xdr_encode_pages(sndbuf, args->pages, args->pgbase, count);
+ sndbuf->flags |= XDRBUF_WRITE;
return 0;
}

Index: kernel/fs/nfs/nfs4xdr.c
===================================================================
--- kernel.orig/fs/nfs/nfs4xdr.c
+++ kernel/fs/nfs/nfs4xdr.c
@@ -1865,6 +1865,7 @@ static int nfs4_xdr_enc_read(struct rpc_
replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_read_sz) << 2;
xdr_inline_pages(&req->rq_rcv_buf, replen,
args->pages, args->pgbase, args->count);
+ req->rq_rcv_buf.flags |= XDRBUF_READ;
out:
return status;
}
@@ -1941,6 +1942,7 @@ static int nfs4_xdr_enc_write(struct rpc
status = encode_write(&xdr, args);
if (status)
goto out;
+ req->rq_snd_buf.flags |= XDRBUF_WRITE;
status = encode_getfattr(&xdr, args->bitmask);
out:
return status;
Index: kernel/include/linux/sunrpc/xdr.h
===================================================================
--- kernel.orig/include/linux/sunrpc/xdr.h
+++ kernel/include/linux/sunrpc/xdr.h
@@ -70,7 +70,10 @@ struct xdr_buf {

struct page ** pages; /* Array of contiguous pages */
unsigned int page_base, /* Start of page data */
- page_len; /* Length of page data */
+ page_len, /* Length of page data */
+ flags; /* Flags for data disposition */
+#define XDRBUF_READ 0x01 /* target of file read */
+#define XDRBUF_WRITE 0x02 /* source of file write */

unsigned int buflen, /* Total length of storage buffer */
len; /* Length of XDR encoded message */
Index: kernel/net/sunrpc/clnt.c
===================================================================
--- kernel.orig/net/sunrpc/clnt.c
+++ kernel/net/sunrpc/clnt.c
@@ -871,6 +871,7 @@ rpc_xdr_buf_init(struct xdr_buf *buf, vo
buf->head[0].iov_len = len;
buf->tail[0].iov_len = 0;
buf->page_len = 0;
+ buf->flags = 0;
buf->len = 0;
buf->buflen = len;
}

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs