diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/nfs_xdr.h | 8 | ||||
| -rw-r--r-- | include/linux/sunrpc/xdr.h | 34 | ||||
| -rw-r--r-- | include/linux/sunrpc/xprt.h | 8 |
3 files changed, 42 insertions, 8 deletions
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 4c77c2081721..c61b4486ec12 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -87,8 +87,8 @@ struct nfs_writeargs { __u64 offset; __u32 count; enum nfs3_stable_how stable; - unsigned int nriov; - struct iovec iov[NFS_WRITE_MAXIOV]; + unsigned int pgbase; + struct page ** pages; }; struct nfs_writeverf { @@ -329,8 +329,8 @@ struct nfs_rpc_ops { void *buffer, int *eofp); int (*write) (struct inode *, struct rpc_cred *, struct nfs_fattr *, - int, loff_t, unsigned int, - void *buffer, struct nfs_writeverf *verfp); + int, unsigned int, unsigned int, + struct page *, struct nfs_writeverf *verfp); int (*commit) (struct inode *, struct nfs_fattr *, unsigned long, unsigned int); int (*create) (struct inode *, struct qstr *, struct iattr *, diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 69827d88dcae..880dba6e66ad 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -35,6 +35,31 @@ struct xdr_netobj { typedef int (*kxdrproc_t)(void *rqstp, u32 *data, void *obj); /* + * Basic structure for transmission/reception of a client XDR message. + * Features a header (for a linear buffer containing RPC headers + * and the data payload for short messages), and then an array of + * pages. + * The tail iovec allows you to append data after the page array. Its + * main interest is for appending padding to the pages in order to + * satisfy the int_32-alignment requirements in RFC1832. + * + * For the future, we might want to string several of these together + * in a list if anybody wants to make use of NFSv4 COMPOUND + * operations and/or has a need for scatter/gather involving pages. + */ +struct xdr_buf { + struct iovec head[1], /* RPC header + non-page data */ + tail[1]; /* Appended after page data */ + + struct page ** pages; /* Array of contiguous pages */ + unsigned int page_base, /* Start of page data */ + page_len; /* Length of page data */ + + unsigned int len; /* Total length of data */ + +}; + +/* * pre-xdr'ed macros. */ @@ -68,6 +93,9 @@ u32 * xdr_encode_netobj(u32 *p, const struct xdr_netobj *); u32 * xdr_decode_netobj(u32 *p, struct xdr_netobj *); u32 * xdr_decode_netobj_fixed(u32 *p, void *obj, unsigned int len); +void xdr_encode_pages(struct xdr_buf *, struct page **, unsigned int, + unsigned int); + /* * Decode 64bit quantities (NFSv3 support) */ @@ -99,6 +127,12 @@ xdr_adjust_iovec(struct iovec *iov, u32 *p) void xdr_shift_iovec(struct iovec *, int, size_t); void xdr_zero_iovec(struct iovec *, int, size_t); +/* + * XDR buffer helper functions + */ +extern int xdr_kmap(struct iovec *, struct xdr_buf *, unsigned int); +extern void xdr_kunmap(struct xdr_buf *, unsigned int); + #endif /* __KERNEL__ */ #endif /* _SUNRPC_XDR_H_ */ diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index f1a329b62b43..4e7496764b9f 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -13,6 +13,7 @@ #include <linux/socket.h> #include <linux/in.h> #include <linux/sunrpc/sched.h> +#include <linux/sunrpc/xdr.h> /* * Maximum number of iov's we use. @@ -87,7 +88,7 @@ struct rpc_rqst { */ struct rpc_xprt * rq_xprt; /* RPC client */ struct rpc_timeout rq_timeout; /* timeout parms */ - struct rpc_iov rq_snd_buf; /* send buffer */ + struct xdr_buf rq_snd_buf; /* send buffer */ struct rpc_iov rq_rcv_buf; /* recv buffer */ /* @@ -113,9 +114,8 @@ struct rpc_rqst { unsigned long rq_xtime; /* when transmitted */ #endif }; -#define rq_svec rq_snd_buf.io_vec -#define rq_snr rq_snd_buf.io_nr -#define rq_slen rq_snd_buf.io_len +#define rq_svec rq_snd_buf.head +#define rq_slen rq_snd_buf.len #define rq_rvec rq_rcv_buf.io_vec #define rq_rnr rq_rcv_buf.io_nr #define rq_rlen rq_rcv_buf.io_len |
