NFSD: Update READ3arg decoder to use struct xdr_stream
authorChuck Lever <chuck.lever@oracle.com>
Tue, 20 Oct 2020 18:34:40 +0000 (14:34 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 25 Jan 2021 14:36:24 +0000 (09:36 -0500)
The code that sets up rq_vec is refactored so that it is now
adjacent to the nfsd_read() call site where it is used.

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

index 4b66f05..acdf471 100644 (file)
@@ -144,25 +144,38 @@ nfsd3_proc_read(struct svc_rqst *rqstp)
 {
        struct nfsd3_readargs *argp = rqstp->rq_argp;
        struct nfsd3_readres *resp = rqstp->rq_resp;
-       u32     max_blocksize = svc_max_payload(rqstp);
-       unsigned long cnt = min(argp->count, max_blocksize);
+       u32 max_blocksize = svc_max_payload(rqstp);
+       unsigned int len;
+       int v;
+
+       argp->count = min_t(u32, argp->count, max_blocksize);
 
        dprintk("nfsd: READ(3) %s %lu bytes at %Lu\n",
                                SVCFH_fmt(&argp->fh),
                                (unsigned long) argp->count,
                                (unsigned long long) argp->offset);
 
+       v = 0;
+       len = argp->count;
+       while (len > 0) {
+               struct page *page = *(rqstp->rq_next_page++);
+
+               rqstp->rq_vec[v].iov_base = page_address(page);
+               rqstp->rq_vec[v].iov_len = min_t(unsigned int, len, PAGE_SIZE);
+               len -= rqstp->rq_vec[v].iov_len;
+               v++;
+       }
+
        /* Obtain buffer pointer for payload.
         * 1 (status) + 22 (post_op_attr) + 1 (count) + 1 (eof)
         * + 1 (xdr opaque byte count) = 26
         */
-       resp->count = cnt;
+       resp->count = argp->count;
        svc_reserve_auth(rqstp, ((1 + NFS3_POST_OP_ATTR_WORDS + 3)<<2) + resp->count +4);
 
        fh_copy(&resp->fh, &argp->fh);
        resp->status = nfsd_read(rqstp, &resp->fh, argp->offset,
-                                rqstp->rq_vec, argp->vlen, &resp->count,
-                                &resp->eof);
+                                rqstp->rq_vec, v, &resp->count, &resp->eof);
        return rpc_success;
 }
 
index e07cebd..2f32df1 100644 (file)
@@ -389,31 +389,17 @@ nfs3svc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
 int
 nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct xdr_stream *xdr = &rqstp->rq_arg_stream;
        struct nfsd3_readargs *args = rqstp->rq_argp;
-       unsigned int len;
-       int v;
-       u32 max_blocksize = svc_max_payload(rqstp);
 
-       p = decode_fh(p, &args->fh);
-       if (!p)
+       if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
+               return 0;
+       if (xdr_stream_decode_u64(xdr, &args->offset) < 0)
+               return 0;
+       if (xdr_stream_decode_u32(xdr, &args->count) < 0)
                return 0;
-       p = xdr_decode_hyper(p, &args->offset);
-
-       args->count = ntohl(*p++);
-       len = min(args->count, max_blocksize);
-
-       /* set up the kvec */
-       v=0;
-       while (len > 0) {
-               struct page *p = *(rqstp->rq_next_page++);
 
-               rqstp->rq_vec[v].iov_base = page_address(p);
-               rqstp->rq_vec[v].iov_len = min_t(unsigned int, len, PAGE_SIZE);
-               len -= rqstp->rq_vec[v].iov_len;
-               v++;
-       }
-       args->vlen = v;
-       return xdr_argsize_check(rqstp, p);
+       return 1;
 }
 
 int
index a4dce4b..7dfeeaa 100644 (file)
@@ -32,7 +32,6 @@ struct nfsd3_readargs {
        struct svc_fh           fh;
        __u64                   offset;
        __u32                   count;
-       int                     vlen;
 };
 
 struct nfsd3_writeargs {