Commit 0a8f37fb authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Fix returned READDIR offset cookie



Code inspection shows that the server's NFSv3 READDIR implementation
handles offset cookies slightly differently than the NFSv2 READDIR,
NFSv3 READDIRPLUS, and NFSv4 READDIR implementations,
and there doesn't seem to be any need for this difference.

As a clean up, I copied the logic from nfsd3_proc_readdirplus().

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 224c1c89
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -444,6 +444,7 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
	struct nfsd3_readdirargs *argp = rqstp->rq_argp;
	struct nfsd3_readdirres  *resp = rqstp->rq_resp;
	int		count = 0;
	loff_t		offset;
	struct page	**p;
	caddr_t		page_addr = NULL;

@@ -462,7 +463,9 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
	resp->common.err = nfs_ok;
	resp->buffer = argp->buffer;
	resp->rqstp = rqstp;
	resp->status = nfsd_readdir(rqstp, &resp->fh, (loff_t *)&argp->cookie,
	offset = argp->cookie;

	resp->status = nfsd_readdir(rqstp, &resp->fh, &offset,
				    &resp->common, nfs3svc_encode_entry);
	memcpy(resp->verf, argp->verf, 8);
	count = 0;
@@ -478,8 +481,6 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
	}
	resp->count = count >> 2;
	if (resp->offset) {
		loff_t offset = argp->cookie;

		if (unlikely(resp->offset1)) {
			/* we ended up with offset on a page boundary */
			*resp->offset = htonl(offset >> 32);