NFSD: Count bytes instead of pages in the NFSv3 READDIR encoder
authorChuck Lever <chuck.lever@oracle.com>
Mon, 9 Nov 2020 18:13:21 +0000 (13:13 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 22 Mar 2021 14:18:55 +0000 (10:18 -0400)
Clean up: Counting the bytes used by each returned directory entry
seems less brittle to me than trying to measure consumed pages after
the fact.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs3proc.c
fs/nfsd/nfs3xdr.c

index 90566cd01bdca6eb49701873494d8c474338fb1d..791d77363acd7fbccdab721b1b3180e99d9dd50e 100644 (file)
@@ -462,10 +462,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;
 
        dprintk("nfsd: READDIR(3)  %s %d bytes at %d\n",
                                SVCFH_fmt(&argp->fh),
@@ -476,6 +473,7 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
        /* Read directory and encode entries on the fly */
        fh_copy(&resp->fh, &argp->fh);
 
+       resp->count = 0;
        resp->common.err = nfs_ok;
        resp->rqstp = rqstp;
        offset = argp->cookie;
@@ -483,18 +481,6 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
        resp->status = nfsd_readdir(rqstp, &resp->fh, &offset,
                                    &resp->common, nfs3svc_encode_entry);
        memcpy(resp->verf, argp->verf, 8);
-       count = 0;
-       for (p = rqstp->rq_respages + 1; p < rqstp->rq_next_page; p++) {
-               page_addr = page_address(*p);
-
-               if (((caddr_t)resp->buffer >= page_addr) &&
-                   ((caddr_t)resp->buffer < page_addr + PAGE_SIZE)) {
-                       count += (caddr_t)resp->buffer - page_addr;
-                       break;
-               }
-               count += PAGE_SIZE;
-       }
-       resp->count = count >> 2;
        nfs3svc_encode_cookie3(resp, offset);
 
        return rpc_success;
@@ -509,10 +495,7 @@ nfsd3_proc_readdirplus(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;
 
        dprintk("nfsd: READDIR+(3) %s %d bytes at %d\n",
                                SVCFH_fmt(&argp->fh),
@@ -523,6 +506,7 @@ nfsd3_proc_readdirplus(struct svc_rqst *rqstp)
        /* Read directory and encode entries on the fly */
        fh_copy(&resp->fh, &argp->fh);
 
+       resp->count = 0;
        resp->common.err = nfs_ok;
        resp->rqstp = rqstp;
        offset = argp->cookie;
@@ -539,17 +523,6 @@ nfsd3_proc_readdirplus(struct svc_rqst *rqstp)
        resp->status = nfsd_readdir(rqstp, &resp->fh, &offset,
                                    &resp->common, nfs3svc_encode_entry_plus);
        memcpy(resp->verf, argp->verf, 8);
-       for (p = rqstp->rq_respages + 1; p < rqstp->rq_next_page; p++) {
-               page_addr = page_address(*p);
-
-               if (((caddr_t)resp->buffer >= page_addr) &&
-                   ((caddr_t)resp->buffer < page_addr + PAGE_SIZE)) {
-                       count += (caddr_t)resp->buffer - page_addr;
-                       break;
-               }
-               count += PAGE_SIZE;
-       }
-       resp->count = count >> 2;
        nfs3svc_encode_cookie3(resp, offset);
 
 out:
index e334a1454edbbcef32fbbcca0b5c69335fcd20e7..523b2dca049440349dfd7f0d3c9bb9aedbd42e92 100644 (file)
@@ -1364,6 +1364,7 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
                return -EINVAL;
        }
 
+       cd->count += num_entry_words;
        cd->buflen -= num_entry_words;
        cd->buffer = p;
        cd->common.err = nfs_ok;