mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	nfsd: allow nfsv3 readdir request to be larger.
nfsd currently reports the NFSv3 dtpref FSINFO parameter to be PAGE_SIZE, so NFS clients will typically ask for one page of directory entries at a time. This is needlessly restrictive as nfsd can handle larger replies easily. Also, a READDIR request (but not a READDIRPLUS request) has the count size clipped to PAGE_SIE, again unnecessary. This patch lifts these limits so that larger readdir requests can be used. Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
		
							parent
							
								
									dd838821f0
								
							
						
					
					
						commit
						f875a792ab
					
				
					 2 changed files with 4 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -588,7 +588,7 @@ nfsd3_proc_fsinfo(struct svc_rqst *rqstp)
 | 
			
		|||
	resp->f_wtmax  = max_blocksize;
 | 
			
		||||
	resp->f_wtpref = max_blocksize;
 | 
			
		||||
	resp->f_wtmult = PAGE_SIZE;
 | 
			
		||||
	resp->f_dtpref = PAGE_SIZE;
 | 
			
		||||
	resp->f_dtpref = max_blocksize;
 | 
			
		||||
	resp->f_maxfilesize = ~(u32) 0;
 | 
			
		||||
	resp->f_properties = NFS3_FSF_DEFAULT;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -573,6 +573,8 @@ int
 | 
			
		|||
nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	struct nfsd3_readdirargs *args = rqstp->rq_argp;
 | 
			
		||||
	u32 max_blocksize = svc_max_payload(rqstp);
 | 
			
		||||
 | 
			
		||||
	p = decode_fh(p, &args->fh);
 | 
			
		||||
	if (!p)
 | 
			
		||||
		return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -580,7 +582,7 @@ nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		|||
	args->verf   = p; p += 2;
 | 
			
		||||
	args->dircount = ~0;
 | 
			
		||||
	args->count  = ntohl(*p++);
 | 
			
		||||
	args->count  = min_t(u32, args->count, PAGE_SIZE);
 | 
			
		||||
	args->count  = min_t(u32, args->count, max_blocksize);
 | 
			
		||||
	args->buffer = page_address(*(rqstp->rq_next_page++));
 | 
			
		||||
 | 
			
		||||
	return xdr_argsize_check(rqstp, p);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue