diff options
Diffstat (limited to 'fs/nfsd/nfsproc.c')
| -rw-r--r-- | fs/nfsd/nfsproc.c | 16 | 
1 files changed, 7 insertions, 9 deletions
| diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index eea5b59b6a6c..18b8eb43a19b 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -235,10 +235,6 @@ nfsd_proc_write(struct svc_rqst *rqstp)  		argp->len, argp->offset);  	nvecs = svc_fill_write_vector(rqstp, &argp->payload); -	if (!nvecs) { -		resp->status = nfserr_io; -		goto out; -	}  	resp->status = nfsd_write(rqstp, fh_copy(&resp->fh, &argp->fh),  				  argp->offset, rqstp->rq_vec, nvecs, @@ -247,7 +243,6 @@ nfsd_proc_write(struct svc_rqst *rqstp)  		resp->status = fh_getattr(&resp->fh, &resp->stat);  	else if (resp->status == nfserr_jukebox)  		return rpc_drop_reply; -out:  	return rpc_success;  } @@ -556,17 +551,17 @@ nfsd_proc_rmdir(struct svc_rqst *rqstp)  static void nfsd_init_dirlist_pages(struct svc_rqst *rqstp,  				    struct nfsd_readdirres *resp, -				    int count) +				    u32 count)  {  	struct xdr_buf *buf = &resp->dirlist;  	struct xdr_stream *xdr = &resp->xdr; -	count = min_t(u32, count, PAGE_SIZE); +	count = clamp(count, (u32)(XDR_UNIT * 2), svc_max_payload(rqstp));  	memset(buf, 0, sizeof(*buf));  	/* Reserve room for the NULL ptr & eof flag (-2 words) */ -	buf->buflen = count - sizeof(__be32) * 2; +	buf->buflen = count - XDR_UNIT * 2;  	buf->pages = rqstp->rq_next_page;  	rqstp->rq_next_page++; @@ -577,7 +572,7 @@ static void nfsd_init_dirlist_pages(struct svc_rqst *rqstp,  	xdr->page_ptr = buf->pages;  	xdr->iov = NULL;  	xdr->p = page_address(*buf->pages); -	xdr->end = xdr->p + (PAGE_SIZE >> 2); +	xdr->end = (void *)xdr->p + min_t(u32, buf->buflen, PAGE_SIZE);  	xdr->rqst = NULL;  } @@ -850,6 +845,7 @@ nfserrno (int errno)  		{ nfserr_io, -EIO },  		{ nfserr_nxio, -ENXIO },  		{ nfserr_fbig, -E2BIG }, +		{ nfserr_stale, -EBADF },  		{ nfserr_acces, -EACCES },  		{ nfserr_exist, -EEXIST },  		{ nfserr_xdev, -EXDEV }, @@ -878,6 +874,8 @@ nfserrno (int errno)  		{ nfserr_toosmall, -ETOOSMALL },  		{ nfserr_serverfault, -ESERVERFAULT },  		{ nfserr_serverfault, -ENFILE }, +		{ nfserr_io, -EREMOTEIO }, +		{ nfserr_stale, -EOPENSTALE },  		{ nfserr_io, -EUCLEAN },  		{ nfserr_perm, -ENOKEY },  		{ nfserr_no_grace, -ENOGRACE}, |