SUNRPC: Push svcxdr_init_encode() into svc_process_common()
authorChuck Lever <chuck.lever@oracle.com>
Sun, 8 Jan 2023 16:29:44 +0000 (11:29 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 20 Feb 2023 14:20:27 +0000 (09:20 -0500)
Now that all vs_dispatch functions invoke svcxdr_init_encode(), it
is common code and can be pushed down into the generic RPC server.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/lockd/svc.c
fs/nfs/callback_xdr.c
fs/nfsd/nfscache.c
fs/nfsd/nfssvc.c
include/linux/sunrpc/xdr.h
net/sunrpc/svc.c

index e56d8533559902ecb0cf51397b00abd12a715cc5..642e394e7a2dfd99d9740eb27bbc1df7595bde5c 100644 (file)
@@ -704,7 +704,6 @@ static int nlmsvc_dispatch(struct svc_rqst *rqstp, __be32 *statp)
        if (*statp != rpc_success)
                return 1;
 
-       svcxdr_init_encode(rqstp);
        if (!procp->pc_encode(rqstp, &rqstp->rq_res_stream))
                goto out_encode_err;
 
index 46d3f5986b4e5a2b23a5a99b7c9ac80f2b2d000e..b4c3b71821982e597167bc9191b900a63a2daf78 100644 (file)
@@ -984,8 +984,6 @@ nfs_callback_dispatch(struct svc_rqst *rqstp, __be32 *statp)
 {
        const struct svc_procedure *procp = rqstp->rq_procinfo;
 
-       svcxdr_init_encode(rqstp);
-
        *statp = procp->pc_func(rqstp);
        return 1;
 }
index 3e64a3d50a1c526ab88850da5e460c8d18d8d86a..ef5ee548053b84e5c1249a929e0d2d257e81fbd5 100644 (file)
@@ -488,7 +488,7 @@ found_entry:
        case RC_NOCACHE:
                break;
        case RC_REPLSTAT:
-               svc_putu32(&rqstp->rq_res.head[0], rp->c_replstat);
+               xdr_stream_encode_be32(&rqstp->rq_res_stream, rp->c_replstat);
                rtn = RC_REPLY;
                break;
        case RC_REPLBUFF:
index 1ed29eac80ed50b8ae3218474b715b3c9c4e0280..dfa8ee6c04d5dc40d65ae1aee32b89d4191f7e82 100644 (file)
@@ -1052,12 +1052,6 @@ int nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
                goto out_dropit;
        }
 
-       /*
-        * Need to grab the location to store the status, as
-        * NFSv4 does some encoding while processing
-        */
-       svcxdr_init_encode(rqstp);
-
        *statp = proc->pc_func(rqstp);
        if (test_bit(RQ_DROPME, &rqstp->rq_flags))
                goto out_update_drop;
index f3b6eb9accd711f78eb656993c24a3f839463dad..72014c9216fc4688071e473081431bebe3b1e692 100644 (file)
@@ -474,6 +474,27 @@ xdr_stream_encode_u32(struct xdr_stream *xdr, __u32 n)
        return len;
 }
 
+/**
+ * xdr_stream_encode_be32 - Encode a big-endian 32-bit integer
+ * @xdr: pointer to xdr_stream
+ * @n: integer to encode
+ *
+ * Return values:
+ *   On success, returns length in bytes of XDR buffer consumed
+ *   %-EMSGSIZE on XDR buffer overflow
+ */
+static inline ssize_t
+xdr_stream_encode_be32(struct xdr_stream *xdr, __be32 n)
+{
+       const size_t len = sizeof(n);
+       __be32 *p = xdr_reserve_space(xdr, len);
+
+       if (unlikely(!p))
+               return -EMSGSIZE;
+       *p = n;
+       return len;
+}
+
 /**
  * xdr_stream_encode_u64 - Encode a 64-bit integer
  * @xdr: pointer to xdr_stream
index 7610e36e51e03e4a98c161cc17c352b023404a9f..ce75db5eb9bd6a69dac6fc3f48ffd1b42914c9a9 100644 (file)
@@ -1321,6 +1321,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *resv)
         */
        if (procp->pc_xdrressize)
                svc_reserve_auth(rqstp, procp->pc_xdrressize<<2);
+       svcxdr_init_encode(rqstp);
 
        /* Call the function that processes the request. */
        rc = process.dispatch(rqstp, statp);