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: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Chuck Lever 2020-11-10 10:24:39 -05:00
parent 224c1c894e
commit 0a8f37fb34
1 changed files with 4 additions and 3 deletions

View File

@ -444,6 +444,7 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
struct nfsd3_readdirargs *argp = rqstp->rq_argp; struct nfsd3_readdirargs *argp = rqstp->rq_argp;
struct nfsd3_readdirres *resp = rqstp->rq_resp; struct nfsd3_readdirres *resp = rqstp->rq_resp;
int count = 0; int count = 0;
loff_t offset;
struct page **p; struct page **p;
caddr_t page_addr = NULL; caddr_t page_addr = NULL;
@ -462,7 +463,9 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
resp->common.err = nfs_ok; resp->common.err = nfs_ok;
resp->buffer = argp->buffer; resp->buffer = argp->buffer;
resp->rqstp = rqstp; 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); &resp->common, nfs3svc_encode_entry);
memcpy(resp->verf, argp->verf, 8); memcpy(resp->verf, argp->verf, 8);
count = 0; count = 0;
@ -478,8 +481,6 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
} }
resp->count = count >> 2; resp->count = count >> 2;
if (resp->offset) { if (resp->offset) {
loff_t offset = argp->cookie;
if (unlikely(resp->offset1)) { if (unlikely(resp->offset1)) {
/* we ended up with offset on a page boundary */ /* we ended up with offset on a page boundary */
*resp->offset = htonl(offset >> 32); *resp->offset = htonl(offset >> 32);