OSDN Git Service

xprtrdma: Refactor chunk encoding
authorChuck Lever <chuck.lever@oracle.com>
Wed, 19 Jun 2019 14:33:31 +0000 (10:33 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 9 Jul 2019 14:30:25 +0000 (10:30 -0400)
Clean up.

Move the "not present" case into the individual chunk encoders. This
improves code organization and readability.

The reason for the original organization was to optimize for the
case where there there are no chunks. The optimization turned out to
be inconsequential, so let's err on the side of code readability.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/rpc_rdma.c

index caf0b19..d3515d3 100644 (file)
@@ -366,6 +366,9 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
        unsigned int pos;
        int nsegs;
 
+       if (rtype == rpcrdma_noch)
+               goto done;
+
        pos = rqst->rq_snd_buf.head[0].iov_len;
        if (rtype == rpcrdma_areadch)
                pos = 0;
@@ -389,7 +392,8 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
                nsegs -= mr->mr_nents;
        } while (nsegs);
 
-       return 0;
+done:
+       return encode_item_not_present(xdr);
 }
 
 /* Register and XDR encode the Write list. Supports encoding a list
@@ -417,6 +421,9 @@ rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
        int nsegs, nchunks;
        __be32 *segcount;
 
+       if (wtype != rpcrdma_writech)
+               goto done;
+
        seg = req->rl_segments;
        nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf,
                                     rqst->rq_rcv_buf.head[0].iov_len,
@@ -451,7 +458,8 @@ rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
        /* Update count of segments in this Write chunk */
        *segcount = cpu_to_be32(nchunks);
 
-       return 0;
+done:
+       return encode_item_not_present(xdr);
 }
 
 /* Register and XDR encode the Reply chunk. Supports encoding an array
@@ -476,6 +484,9 @@ rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
        int nsegs, nchunks;
        __be32 *segcount;
 
+       if (wtype != rpcrdma_replych)
+               return encode_item_not_present(xdr);
+
        seg = req->rl_segments;
        nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, 0, wtype, seg);
        if (nsegs < 0)
@@ -859,28 +870,13 @@ rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst)
         * send a Call message with a Position Zero Read chunk and a
         * regular Read chunk at the same time.
         */
-       if (rtype != rpcrdma_noch) {
-               ret = rpcrdma_encode_read_list(r_xprt, req, rqst, rtype);
-               if (ret)
-                       goto out_err;
-       }
-       ret = encode_item_not_present(xdr);
+       ret = rpcrdma_encode_read_list(r_xprt, req, rqst, rtype);
        if (ret)
                goto out_err;
-
-       if (wtype == rpcrdma_writech) {
-               ret = rpcrdma_encode_write_list(r_xprt, req, rqst, wtype);
-               if (ret)
-                       goto out_err;
-       }
-       ret = encode_item_not_present(xdr);
+       ret = rpcrdma_encode_write_list(r_xprt, req, rqst, wtype);
        if (ret)
                goto out_err;
-
-       if (wtype != rpcrdma_replych)
-               ret = encode_item_not_present(xdr);
-       else
-               ret = rpcrdma_encode_reply_chunk(r_xprt, req, rqst, wtype);
+       ret = rpcrdma_encode_reply_chunk(r_xprt, req, rqst, wtype);
        if (ret)
                goto out_err;