diff options
author | J. Bruce Fields <bfields@redhat.com> | 2017-06-28 13:34:15 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2017-06-28 13:34:15 -0400 |
commit | 9a1d168e1bc2893120bb7c0d9932dd22f97d0b55 (patch) | |
tree | f7d419f1601419aa0aebda102a6b14bdf7653443 /fs/nfsd | |
parent | bb2a8b0cd116219777b99cb71fe9e24b31d3f521 (diff) | |
parent | 32c1431eea4881a6b17bd7c639315010aeefa452 (diff) |
Merge tag 'v4.12-rc5' into nfsd tree
Update to get f0c3192ceee3 "virtio_net: lower limit on buffer size".
That bug was interfering with my nfsd testing.
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs3xdr.c | 23 | ||||
-rw-r--r-- | fs/nfsd/nfs4proc.c | 13 | ||||
-rw-r--r-- | fs/nfsd/nfsxdr.c | 13 |
3 files changed, 15 insertions, 34 deletions
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 349e355edc73..b8838d3023ff 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c | |||
@@ -339,11 +339,8 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p) | |||
339 | if (!p) | 339 | if (!p) |
340 | return 0; | 340 | return 0; |
341 | p = xdr_decode_hyper(p, &args->offset); | 341 | p = xdr_decode_hyper(p, &args->offset); |
342 | args->count = ntohl(*p++); | ||
343 | |||
344 | if (!xdr_argsize_check(rqstp, p)) | ||
345 | return 0; | ||
346 | 342 | ||
343 | args->count = ntohl(*p++); | ||
347 | len = min(args->count, max_blocksize); | 344 | len = min(args->count, max_blocksize); |
348 | 345 | ||
349 | /* set up the kvec */ | 346 | /* set up the kvec */ |
@@ -357,7 +354,7 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p) | |||
357 | v++; | 354 | v++; |
358 | } | 355 | } |
359 | args->vlen = v; | 356 | args->vlen = v; |
360 | return 1; | 357 | return xdr_argsize_check(rqstp, p); |
361 | } | 358 | } |
362 | 359 | ||
363 | int | 360 | int |
@@ -555,11 +552,9 @@ nfs3svc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p) | |||
555 | p = decode_fh(p, &args->fh); | 552 | p = decode_fh(p, &args->fh); |
556 | if (!p) | 553 | if (!p) |
557 | return 0; | 554 | return 0; |
558 | if (!xdr_argsize_check(rqstp, p)) | ||
559 | return 0; | ||
560 | args->buffer = page_address(*(rqstp->rq_next_page++)); | 555 | args->buffer = page_address(*(rqstp->rq_next_page++)); |
561 | 556 | ||
562 | return 1; | 557 | return xdr_argsize_check(rqstp, p); |
563 | } | 558 | } |
564 | 559 | ||
565 | int | 560 | int |
@@ -586,14 +581,10 @@ nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p) | |||
586 | args->verf = p; p += 2; | 581 | args->verf = p; p += 2; |
587 | args->dircount = ~0; | 582 | args->dircount = ~0; |
588 | args->count = ntohl(*p++); | 583 | args->count = ntohl(*p++); |
589 | |||
590 | if (!xdr_argsize_check(rqstp, p)) | ||
591 | return 0; | ||
592 | |||
593 | args->count = min_t(u32, args->count, PAGE_SIZE); | 584 | args->count = min_t(u32, args->count, PAGE_SIZE); |
594 | args->buffer = page_address(*(rqstp->rq_next_page++)); | 585 | args->buffer = page_address(*(rqstp->rq_next_page++)); |
595 | 586 | ||
596 | return 1; | 587 | return xdr_argsize_check(rqstp, p); |
597 | } | 588 | } |
598 | 589 | ||
599 | int | 590 | int |
@@ -611,9 +602,6 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p) | |||
611 | args->dircount = ntohl(*p++); | 602 | args->dircount = ntohl(*p++); |
612 | args->count = ntohl(*p++); | 603 | args->count = ntohl(*p++); |
613 | 604 | ||
614 | if (!xdr_argsize_check(rqstp, p)) | ||
615 | return 0; | ||
616 | |||
617 | len = args->count = min(args->count, max_blocksize); | 605 | len = args->count = min(args->count, max_blocksize); |
618 | while (len > 0) { | 606 | while (len > 0) { |
619 | struct page *p = *(rqstp->rq_next_page++); | 607 | struct page *p = *(rqstp->rq_next_page++); |
@@ -621,7 +609,8 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p) | |||
621 | args->buffer = page_address(p); | 609 | args->buffer = page_address(p); |
622 | len -= PAGE_SIZE; | 610 | len -= PAGE_SIZE; |
623 | } | 611 | } |
624 | return 1; | 612 | |
613 | return xdr_argsize_check(rqstp, p); | ||
625 | } | 614 | } |
626 | 615 | ||
627 | int | 616 | int |
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index fe6cb5b6d31c..d27e75ad25e3 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c | |||
@@ -1785,6 +1785,12 @@ nfsd4_proc_compound(struct svc_rqst *rqstp) | |||
1785 | opdesc->op_get_currentstateid(cstate, &op->u); | 1785 | opdesc->op_get_currentstateid(cstate, &op->u); |
1786 | op->status = opdesc->op_func(rqstp, cstate, &op->u); | 1786 | op->status = opdesc->op_func(rqstp, cstate, &op->u); |
1787 | 1787 | ||
1788 | /* Only from SEQUENCE */ | ||
1789 | if (cstate->status == nfserr_replay_cache) { | ||
1790 | dprintk("%s NFS4.1 replay from cache\n", __func__); | ||
1791 | status = op->status; | ||
1792 | goto out; | ||
1793 | } | ||
1788 | if (!op->status) { | 1794 | if (!op->status) { |
1789 | if (opdesc->op_set_currentstateid) | 1795 | if (opdesc->op_set_currentstateid) |
1790 | opdesc->op_set_currentstateid(cstate, &op->u); | 1796 | opdesc->op_set_currentstateid(cstate, &op->u); |
@@ -1795,14 +1801,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp) | |||
1795 | if (need_wrongsec_check(rqstp)) | 1801 | if (need_wrongsec_check(rqstp)) |
1796 | op->status = check_nfsd_access(current_fh->fh_export, rqstp); | 1802 | op->status = check_nfsd_access(current_fh->fh_export, rqstp); |
1797 | } | 1803 | } |
1798 | |||
1799 | encode_op: | 1804 | encode_op: |
1800 | /* Only from SEQUENCE */ | ||
1801 | if (cstate->status == nfserr_replay_cache) { | ||
1802 | dprintk("%s NFS4.1 replay from cache\n", __func__); | ||
1803 | status = op->status; | ||
1804 | goto out; | ||
1805 | } | ||
1806 | if (op->status == nfserr_replay_me) { | 1805 | if (op->status == nfserr_replay_me) { |
1807 | op->replay = &cstate->replay_owner->so_replay; | 1806 | op->replay = &cstate->replay_owner->so_replay; |
1808 | nfsd4_encode_replay(&resp->xdr, op); | 1807 | nfsd4_encode_replay(&resp->xdr, op); |
diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index bb1998c5ae61..e4da2717982d 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c | |||
@@ -261,9 +261,6 @@ nfssvc_decode_readargs(struct svc_rqst *rqstp, __be32 *p) | |||
261 | len = args->count = ntohl(*p++); | 261 | len = args->count = ntohl(*p++); |
262 | p++; /* totalcount - unused */ | 262 | p++; /* totalcount - unused */ |
263 | 263 | ||
264 | if (!xdr_argsize_check(rqstp, p)) | ||
265 | return 0; | ||
266 | |||
267 | len = min_t(unsigned int, len, NFSSVC_MAXBLKSIZE_V2); | 264 | len = min_t(unsigned int, len, NFSSVC_MAXBLKSIZE_V2); |
268 | 265 | ||
269 | /* set up somewhere to store response. | 266 | /* set up somewhere to store response. |
@@ -279,7 +276,7 @@ nfssvc_decode_readargs(struct svc_rqst *rqstp, __be32 *p) | |||
279 | v++; | 276 | v++; |
280 | } | 277 | } |
281 | args->vlen = v; | 278 | args->vlen = v; |
282 | return 1; | 279 | return xdr_argsize_check(rqstp, p); |
283 | } | 280 | } |
284 | 281 | ||
285 | int | 282 | int |
@@ -373,11 +370,9 @@ nfssvc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p) | |||
373 | p = decode_fh(p, &args->fh); | 370 | p = decode_fh(p, &args->fh); |
374 | if (!p) | 371 | if (!p) |
375 | return 0; | 372 | return 0; |
376 | if (!xdr_argsize_check(rqstp, p)) | ||
377 | return 0; | ||
378 | args->buffer = page_address(*(rqstp->rq_next_page++)); | 373 | args->buffer = page_address(*(rqstp->rq_next_page++)); |
379 | 374 | ||
380 | return 1; | 375 | return xdr_argsize_check(rqstp, p); |
381 | } | 376 | } |
382 | 377 | ||
383 | int | 378 | int |
@@ -418,11 +413,9 @@ nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p) | |||
418 | args->cookie = ntohl(*p++); | 413 | args->cookie = ntohl(*p++); |
419 | args->count = ntohl(*p++); | 414 | args->count = ntohl(*p++); |
420 | args->count = min_t(u32, args->count, PAGE_SIZE); | 415 | args->count = min_t(u32, args->count, PAGE_SIZE); |
421 | if (!xdr_argsize_check(rqstp, p)) | ||
422 | return 0; | ||
423 | args->buffer = page_address(*(rqstp->rq_next_page++)); | 416 | args->buffer = page_address(*(rqstp->rq_next_page++)); |
424 | 417 | ||
425 | return 1; | 418 | return xdr_argsize_check(rqstp, p); |
426 | } | 419 | } |
427 | 420 | ||
428 | /* | 421 | /* |