Commit 18e4528e authored by Trond Myklebust's avatar Trond Myklebust

RPC: xdr_encode_pages either leaves the tail iovec pointing to

null or, if padding onthe page data is needed, sets it to point
to a little bit of static data. This is a problem if we're
expecting to later append some data in gss_wrap_req. Modify
xdr_encode_pages to make tail point to the end of the data in
head, as xdr_inline_pages and xdr_write_pages do.
parent cb21a718
...@@ -107,16 +107,23 @@ void ...@@ -107,16 +107,23 @@ void
xdr_encode_pages(struct xdr_buf *xdr, struct page **pages, unsigned int base, xdr_encode_pages(struct xdr_buf *xdr, struct page **pages, unsigned int base,
unsigned int len) unsigned int len)
{ {
struct iovec *tail = xdr->tail;
u32 *p;
xdr->pages = pages; xdr->pages = pages;
xdr->page_base = base; xdr->page_base = base;
xdr->page_len = len; xdr->page_len = len;
p = (u32 *)xdr->head[0].iov_base + XDR_QUADLEN(xdr->head[0].iov_len);
tail->iov_base = p;
tail->iov_len = 0;
if (len & 3) { if (len & 3) {
struct iovec *iov = xdr->tail;
unsigned int pad = 4 - (len & 3); unsigned int pad = 4 - (len & 3);
iov->iov_base = (void *) "\0\0\0"; *p = 0;
iov->iov_len = pad; tail->iov_base = (char *)p + (len & 3);
tail->iov_len = pad;
len += pad; len += pad;
} }
xdr->len += len; xdr->len += len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment