aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4xdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r--fs/nfsd/nfs4xdr.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index d6ef0955a979..9df898ba648f 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1072,8 +1072,9 @@ nfsd4_decode_rename(struct nfsd4_compoundargs *argp, struct nfsd4_rename *rename
1072 1072
1073 READ_BUF(4); 1073 READ_BUF(4);
1074 rename->rn_snamelen = be32_to_cpup(p++); 1074 rename->rn_snamelen = be32_to_cpup(p++);
1075 READ_BUF(rename->rn_snamelen + 4); 1075 READ_BUF(rename->rn_snamelen);
1076 SAVEMEM(rename->rn_sname, rename->rn_snamelen); 1076 SAVEMEM(rename->rn_sname, rename->rn_snamelen);
1077 READ_BUF(4);
1077 rename->rn_tnamelen = be32_to_cpup(p++); 1078 rename->rn_tnamelen = be32_to_cpup(p++);
1078 READ_BUF(rename->rn_tnamelen); 1079 READ_BUF(rename->rn_tnamelen);
1079 SAVEMEM(rename->rn_tname, rename->rn_tnamelen); 1080 SAVEMEM(rename->rn_tname, rename->rn_tnamelen);
@@ -1155,13 +1156,14 @@ nfsd4_decode_setclientid(struct nfsd4_compoundargs *argp, struct nfsd4_setclient
1155 READ_BUF(8); 1156 READ_BUF(8);
1156 setclientid->se_callback_prog = be32_to_cpup(p++); 1157 setclientid->se_callback_prog = be32_to_cpup(p++);
1157 setclientid->se_callback_netid_len = be32_to_cpup(p++); 1158 setclientid->se_callback_netid_len = be32_to_cpup(p++);
1158 1159 READ_BUF(setclientid->se_callback_netid_len);
1159 READ_BUF(setclientid->se_callback_netid_len + 4);
1160 SAVEMEM(setclientid->se_callback_netid_val, setclientid->se_callback_netid_len); 1160 SAVEMEM(setclientid->se_callback_netid_val, setclientid->se_callback_netid_len);
1161 READ_BUF(4);
1161 setclientid->se_callback_addr_len = be32_to_cpup(p++); 1162 setclientid->se_callback_addr_len = be32_to_cpup(p++);
1162 1163
1163 READ_BUF(setclientid->se_callback_addr_len + 4); 1164 READ_BUF(setclientid->se_callback_addr_len);
1164 SAVEMEM(setclientid->se_callback_addr_val, setclientid->se_callback_addr_len); 1165 SAVEMEM(setclientid->se_callback_addr_val, setclientid->se_callback_addr_len);
1166 READ_BUF(4);
1165 setclientid->se_callback_ident = be32_to_cpup(p++); 1167 setclientid->se_callback_ident = be32_to_cpup(p++);
1166 1168
1167 DECODE_TAIL; 1169 DECODE_TAIL;
@@ -1835,8 +1837,9 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
1835 1837
1836 READ_BUF(4); 1838 READ_BUF(4);
1837 argp->taglen = be32_to_cpup(p++); 1839 argp->taglen = be32_to_cpup(p++);
1838 READ_BUF(argp->taglen + 8); 1840 READ_BUF(argp->taglen);
1839 SAVEMEM(argp->tag, argp->taglen); 1841 SAVEMEM(argp->tag, argp->taglen);
1842 READ_BUF(8);
1840 argp->minorversion = be32_to_cpup(p++); 1843 argp->minorversion = be32_to_cpup(p++);
1841 argp->opcnt = be32_to_cpup(p++); 1844 argp->opcnt = be32_to_cpup(p++);
1842 max_reply += 4 + (XDR_QUADLEN(argp->taglen) << 2); 1845 max_reply += 4 + (XDR_QUADLEN(argp->taglen) << 2);
@@ -3060,7 +3063,7 @@ static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp,
3060 p = xdr_encode_opaque_fixed(p, bcts->sessionid.data, 3063 p = xdr_encode_opaque_fixed(p, bcts->sessionid.data,
3061 NFS4_MAX_SESSIONID_LEN); 3064 NFS4_MAX_SESSIONID_LEN);
3062 *p++ = cpu_to_be32(bcts->dir); 3065 *p++ = cpu_to_be32(bcts->dir);
3063 /* Sorry, we do not yet support RDMA over 4.1: */ 3066 /* Upshifting from TCP to RDMA is not supported */
3064 *p++ = cpu_to_be32(0); 3067 *p++ = cpu_to_be32(0);
3065 } 3068 }
3066 return nfserr; 3069 return nfserr;
@@ -3362,6 +3365,7 @@ static __be32 nfsd4_encode_splice_read(
3362 struct xdr_stream *xdr = &resp->xdr; 3365 struct xdr_stream *xdr = &resp->xdr;
3363 struct xdr_buf *buf = xdr->buf; 3366 struct xdr_buf *buf = xdr->buf;
3364 u32 eof; 3367 u32 eof;
3368 long len;
3365 int space_left; 3369 int space_left;
3366 __be32 nfserr; 3370 __be32 nfserr;
3367 __be32 *p = xdr->p - 2; 3371 __be32 *p = xdr->p - 2;
@@ -3370,6 +3374,7 @@ static __be32 nfsd4_encode_splice_read(
3370 if (xdr->end - xdr->p < 1) 3374 if (xdr->end - xdr->p < 1)
3371 return nfserr_resource; 3375 return nfserr_resource;
3372 3376
3377 len = maxcount;
3373 nfserr = nfsd_splice_read(read->rd_rqstp, file, 3378 nfserr = nfsd_splice_read(read->rd_rqstp, file,
3374 read->rd_offset, &maxcount); 3379 read->rd_offset, &maxcount);
3375 if (nfserr) { 3380 if (nfserr) {
@@ -3382,8 +3387,8 @@ static __be32 nfsd4_encode_splice_read(
3382 return nfserr; 3387 return nfserr;
3383 } 3388 }
3384 3389
3385 eof = (read->rd_offset + maxcount >= 3390 eof = nfsd_eof_on_read(len, maxcount, read->rd_offset,
3386 d_inode(read->rd_fhp->fh_dentry)->i_size); 3391 d_inode(read->rd_fhp->fh_dentry)->i_size);
3387 3392
3388 *(p++) = htonl(eof); 3393 *(p++) = htonl(eof);
3389 *(p++) = htonl(maxcount); 3394 *(p++) = htonl(maxcount);
@@ -3453,14 +3458,15 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
3453 } 3458 }
3454 read->rd_vlen = v; 3459 read->rd_vlen = v;
3455 3460
3461 len = maxcount;
3456 nfserr = nfsd_readv(file, read->rd_offset, resp->rqstp->rq_vec, 3462 nfserr = nfsd_readv(file, read->rd_offset, resp->rqstp->rq_vec,
3457 read->rd_vlen, &maxcount); 3463 read->rd_vlen, &maxcount);
3458 if (nfserr) 3464 if (nfserr)
3459 return nfserr; 3465 return nfserr;
3460 xdr_truncate_encode(xdr, starting_len + 8 + ((maxcount+3)&~3)); 3466 xdr_truncate_encode(xdr, starting_len + 8 + ((maxcount+3)&~3));
3461 3467
3462 eof = (read->rd_offset + maxcount >= 3468 eof = nfsd_eof_on_read(len, maxcount, read->rd_offset,
3463 d_inode(read->rd_fhp->fh_dentry)->i_size); 3469 d_inode(read->rd_fhp->fh_dentry)->i_size);
3464 3470
3465 tmp = htonl(eof); 3471 tmp = htonl(eof);
3466 write_bytes_to_xdr_buf(xdr->buf, starting_len , &tmp, 4); 3472 write_bytes_to_xdr_buf(xdr->buf, starting_len , &tmp, 4);