diff options
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 26 |
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); |