]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
svcrdma: Clean up svc_rdma_get_inv_rkey()
authorChuck Lever <chuck.lever@oracle.com>
Sun, 9 Apr 2017 17:06:08 +0000 (13:06 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 25 Apr 2017 21:25:54 +0000 (17:25 -0400)
Replace C structure-based XDR decoding with more portable code that
instead uses pointer arithmetic.

This is a refactoring change only.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
net/sunrpc/xprtrdma/svc_rdma_sendto.c

index 2798f3ea0020d8e2aa7e29999238eaeaf0d0db64..2eb3df698e11b880fc715a6d712b9e187655fb90 100644 (file)
@@ -189,32 +189,25 @@ static void svc_rdma_get_write_arrays(struct rpcrdma_msg *rmsgp,
  * Invalidate, and responder chooses one rkey to invalidate.
  *
  * Find a candidate rkey to invalidate when sending a reply.  Picks the
- * first rkey it finds in the chunks lists.
+ * first R_key it finds in the chunk lists.
  *
  * Returns zero if RPC's chunk lists are empty.
  */
-static u32 svc_rdma_get_inv_rkey(struct rpcrdma_msg *rdma_argp,
-                                struct rpcrdma_write_array *wr_ary,
-                                struct rpcrdma_write_array *rp_ary)
+static u32 svc_rdma_get_inv_rkey(__be32 *rdma_argp,
+                                __be32 *wr_lst, __be32 *rp_ch)
 {
-       struct rpcrdma_read_chunk *rd_ary;
-       struct rpcrdma_segment *arg_ch;
-
-       rd_ary = (struct rpcrdma_read_chunk *)&rdma_argp->rm_body.rm_chunks[0];
-       if (rd_ary->rc_discrim != xdr_zero)
-               return be32_to_cpu(rd_ary->rc_target.rs_handle);
-
-       if (wr_ary && be32_to_cpu(wr_ary->wc_nchunks)) {
-               arg_ch = &wr_ary->wc_array[0].wc_target;
-               return be32_to_cpu(arg_ch->rs_handle);
-       }
-
-       if (rp_ary && be32_to_cpu(rp_ary->wc_nchunks)) {
-               arg_ch = &rp_ary->wc_array[0].wc_target;
-               return be32_to_cpu(arg_ch->rs_handle);
-       }
+       __be32 *p;
 
-       return 0;
+       p = rdma_argp + rpcrdma_fixed_maxsz;
+       if (*p != xdr_zero)
+               p += 2;
+       else if (wr_lst && be32_to_cpup(wr_lst + 1))
+               p = wr_lst + 2;
+       else if (rp_ch && be32_to_cpup(rp_ch + 1))
+               p = rp_ch + 2;
+       else
+               return 0;
+       return be32_to_cpup(p);
 }
 
 static int svc_rdma_dma_map_page(struct svcxprt_rdma *rdma,
@@ -650,7 +643,9 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
 
        inv_rkey = 0;
        if (rdma->sc_snd_w_inv)
-               inv_rkey = svc_rdma_get_inv_rkey(rdma_argp, wr_ary, rp_ary);
+               inv_rkey = svc_rdma_get_inv_rkey(&rdma_argp->rm_xid,
+                                                (__be32 *)wr_ary,
+                                                (__be32 *)rp_ary);
 
        /* Build an req vec for the XDR */
        vec = svc_rdma_get_req_map(rdma);