NFSD: Add helper to set up the pages where the dirlist is encoded
authorChuck Lever <chuck.lever@oracle.com>
Fri, 13 Nov 2020 22:03:49 +0000 (17:03 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 25 Jan 2021 14:36:25 +0000 (09:36 -0500)
Add a helper similar to nfsd3_init_dirlist_pages().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsproc.c
fs/nfsd/nfsxdr.c
fs/nfsd/xdr.h

index bdb4784..b2f8035 100644 (file)
@@ -553,6 +553,20 @@ nfsd_proc_rmdir(struct svc_rqst *rqstp)
        return rpc_success;
 }
 
+static void nfsd_init_dirlist_pages(struct svc_rqst *rqstp,
+                                   struct nfsd_readdirres *resp,
+                                   int count)
+{
+       count = min_t(u32, count, PAGE_SIZE);
+
+       /* Convert byte count to number of words (i.e. >> 2),
+        * and reserve room for the NULL ptr & eof flag (-2 words) */
+       resp->buflen = (count >> 2) - 2;
+
+       resp->buffer = page_address(*rqstp->rq_next_page);
+       rqstp->rq_next_page++;
+}
+
 /*
  * Read a portion of a directory.
  */
@@ -561,31 +575,24 @@ nfsd_proc_readdir(struct svc_rqst *rqstp)
 {
        struct nfsd_readdirargs *argp = rqstp->rq_argp;
        struct nfsd_readdirres *resp = rqstp->rq_resp;
-       int             count;
        loff_t          offset;
+       __be32          *buffer;
 
        dprintk("nfsd: READDIR  %s %d bytes at %d\n",
                SVCFH_fmt(&argp->fh),           
                argp->count, argp->cookie);
 
-       /* Shrink to the client read size */
-       count = (argp->count >> 2) - 2;
-
-       /* Make sure we've room for the NULL ptr & eof flag */
-       count -= 2;
-       if (count < 0)
-               count = 0;
+       nfsd_init_dirlist_pages(rqstp, resp, argp->count);
+       buffer = resp->buffer;
 
-       resp->buffer = argp->buffer;
        resp->offset = NULL;
-       resp->buflen = count;
        resp->common.err = nfs_ok;
        /* Read directory and encode entries on the fly */
        offset = argp->cookie;
        resp->status = nfsd_readdir(rqstp, &argp->fh, &offset,
                                    &resp->common, nfssvc_encode_entry);
 
-       resp->count = resp->buffer - argp->buffer;
+       resp->count = resp->buffer - buffer;
        if (resp->offset)
                *resp->offset = htonl(offset);
 
index 02dd988..3d72334 100644 (file)
@@ -388,8 +388,6 @@ nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
                return 0;
        args->cookie = ntohl(*p++);
        args->count  = ntohl(*p++);
-       args->count  = min_t(u32, args->count, PAGE_SIZE);
-       args->buffer = page_address(*(rqstp->rq_next_page++));
 
        return xdr_argsize_check(rqstp, p);
 }
index 288c29a..d700838 100644 (file)
@@ -73,7 +73,6 @@ struct nfsd_readdirargs {
        struct svc_fh           fh;
        __u32                   cookie;
        __u32                   count;
-       __be32 *                buffer;
 };
 
 struct nfsd_stat {