|
@@ -358,6 +358,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
{
|
|
|
unsigned int len, v, hdr, dlen;
|
|
|
u32 max_blocksize = svc_max_payload(rqstp);
|
|
|
+ struct kvec *head = rqstp->rq_arg.head;
|
|
|
+ struct kvec *tail = rqstp->rq_arg.tail;
|
|
|
|
|
|
p = decode_fh(p, &args->fh);
|
|
|
if (!p)
|
|
@@ -377,9 +379,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
* Check to make sure that we got the right number of
|
|
|
* bytes.
|
|
|
*/
|
|
|
- hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
|
|
|
- dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
|
|
|
- + rqstp->rq_arg.tail[0].iov_len - hdr;
|
|
|
+ hdr = (void*)p - head->iov_base;
|
|
|
+ dlen = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len - hdr;
|
|
|
/*
|
|
|
* Round the length of the data which was specified up to
|
|
|
* the next multiple of XDR units and then compare that
|
|
@@ -396,7 +397,7 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
len = args->len = max_blocksize;
|
|
|
}
|
|
|
rqstp->rq_vec[0].iov_base = (void*)p;
|
|
|
- rqstp->rq_vec[0].iov_len = rqstp->rq_arg.head[0].iov_len - hdr;
|
|
|
+ rqstp->rq_vec[0].iov_len = head->iov_len - hdr;
|
|
|
v = 0;
|
|
|
while (len > rqstp->rq_vec[v].iov_len) {
|
|
|
len -= rqstp->rq_vec[v].iov_len;
|