aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4xdr.c
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2012-11-16 14:16:46 -0500
committerJ. Bruce Fields <bfields@redhat.com>2012-11-26 09:08:14 -0500
commit70cc7f75b1ee4161dfdea1012223db25712ab1a5 (patch)
tree4e9756cce119094f08a7bbeb52b5487c31790b8a /fs/nfsd/nfs4xdr.c
parent5a80a54d21c96590d013378d8c5f65f879451ab4 (diff)
nfsd4: move more write parameters into xdr argument
In preparation for moving some of this elsewhere. Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r--fs/nfsd/nfs4xdr.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 579dc707bad9..cb9f9017af8f 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1139,16 +1139,17 @@ nfsd4_decode_verify(struct nfsd4_compoundargs *argp, struct nfsd4_verify *verify
1139 DECODE_TAIL; 1139 DECODE_TAIL;
1140} 1140}
1141 1141
1142static int fill_in_write_vector(struct kvec *vec, struct kvec *head, struct page **pagelist, int buflen) 1142static int fill_in_write_vector(struct kvec *vec, struct nfsd4_write *write)
1143{ 1143{
1144 int i = 1; 1144 int i = 1;
1145 int buflen = write->wr_buflen;
1145 1146
1146 vec[0].iov_base = head->iov_base; 1147 vec[0].iov_base = write->wr_head.iov_base;
1147 vec[0].iov_len = min_t(int, buflen, head->iov_len); 1148 vec[0].iov_len = min_t(int, buflen, write->wr_head.iov_len);
1148 buflen -= vec[0].iov_len; 1149 buflen -= vec[0].iov_len;
1149 1150
1150 while (buflen) { 1151 while (buflen) {
1151 vec[i].iov_base = page_address(pagelist[i - 1]); 1152 vec[i].iov_base = page_address(write->wr_pagelist[i - 1]);
1152 vec[i].iov_len = min_t(int, PAGE_SIZE, buflen); 1153 vec[i].iov_len = min_t(int, PAGE_SIZE, buflen);
1153 buflen -= vec[i].iov_len; 1154 buflen -= vec[i].iov_len;
1154 i++; 1155 i++;
@@ -1161,8 +1162,6 @@ nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write)
1161{ 1162{
1162 int avail; 1163 int avail;
1163 int len; 1164 int len;
1164 struct page **pagelist;
1165 struct kvec head;
1166 DECODE_HEAD; 1165 DECODE_HEAD;
1167 1166
1168 status = nfsd4_decode_stateid(argp, &write->wr_stateid); 1167 status = nfsd4_decode_stateid(argp, &write->wr_stateid);
@@ -1185,10 +1184,10 @@ nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write)
1185 __FILE__, __LINE__); 1184 __FILE__, __LINE__);
1186 goto xdr_error; 1185 goto xdr_error;
1187 } 1186 }
1188 head.iov_base = p; 1187 write->wr_head.iov_base = p;
1189 head.iov_len = avail; 1188 write->wr_head.iov_len = avail;
1190 WARN_ON(avail != (XDR_QUADLEN(avail) << 2)); 1189 WARN_ON(avail != (XDR_QUADLEN(avail) << 2));
1191 pagelist = argp->pagelist; 1190 write->wr_pagelist = argp->pagelist;
1192 1191
1193 len = XDR_QUADLEN(write->wr_buflen) << 2; 1192 len = XDR_QUADLEN(write->wr_buflen) << 2;
1194 if (len >= avail) { 1193 if (len >= avail) {
@@ -1205,8 +1204,7 @@ nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write)
1205 argp->end = argp->p + XDR_QUADLEN(PAGE_SIZE); 1204 argp->end = argp->p + XDR_QUADLEN(PAGE_SIZE);
1206 } 1205 }
1207 argp->p += XDR_QUADLEN(len); 1206 argp->p += XDR_QUADLEN(len);
1208 write->wr_vlen = fill_in_write_vector(argp->rqstp->rq_vec, 1207 write->wr_vlen = fill_in_write_vector(argp->rqstp->rq_vec, write);
1209 &head, pagelist, write->wr_buflen);
1210 WARN_ON_ONCE(write->wr_vlen > ARRAY_SIZE(argp->rqstp->rq_vec)); 1208 WARN_ON_ONCE(write->wr_vlen > ARRAY_SIZE(argp->rqstp->rq_vec));
1211 1209
1212 DECODE_TAIL; 1210 DECODE_TAIL;