summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2017-06-28 13:34:15 -0400
committerJ. Bruce Fields <bfields@redhat.com>2017-06-28 13:34:15 -0400
commit9a1d168e1bc2893120bb7c0d9932dd22f97d0b55 (patch)
treef7d419f1601419aa0aebda102a6b14bdf7653443 /fs/nfsd
parentbb2a8b0cd116219777b99cb71fe9e24b31d3f521 (diff)
parent32c1431eea4881a6b17bd7c639315010aeefa452 (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.c23
-rw-r--r--fs/nfsd/nfs4proc.c13
-rw-r--r--fs/nfsd/nfsxdr.c13
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
363int 360int
@@ -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
565int 560int
@@ -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
599int 590int
@@ -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
627int 616int
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
1799encode_op: 1804encode_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
285int 282int
@@ -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
383int 378int
@@ -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/*