xprtrdma: Chunk list encoders must not return zero
authorChuck Lever <chuck.lever@oracle.com>
Wed, 29 Jun 2016 17:53:52 +0000 (13:53 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 11 Jul 2016 19:50:43 +0000 (15:50 -0400)
Clean up, based on code audit: Remove the possibility that the
chunk list XDR encoders can return zero, which would be interpreted
as a NULL.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/fmr_ops.c
net/sunrpc/xprtrdma/frwr_ops.c
net/sunrpc/xprtrdma/rpc_rdma.c

index aae4c37..bc5f4a1 100644 (file)
@@ -246,6 +246,8 @@ fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
        }
        mw->mw_nents = i;
        mw->mw_dir = rpcrdma_data_dir(writing);
+       if (i == 0)
+               goto out_dmamap_err;
 
        if (!ib_dma_map_sg(r_xprt->rx_ia.ri_device,
                           mw->mw_sg, mw->mw_nents, mw->mw_dir))
index d7613db..f3a06fa 100644 (file)
@@ -411,6 +411,8 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
        }
        mw->mw_nents = i;
        mw->mw_dir = rpcrdma_data_dir(writing);
+       if (i == 0)
+               goto out_dmamap_err;
 
        dma_nents = ib_dma_map_sg(ia->ri_device,
                                  mw->mw_sg, mw->mw_nents, mw->mw_dir);
index 77e002f..8fde0ab 100644 (file)
@@ -329,7 +329,7 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt,
 
        do {
                n = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs, false);
-               if (n <= 0)
+               if (n < 0)
                        return ERR_PTR(n);
 
                *iptr++ = xdr_one;      /* item present */
@@ -397,7 +397,7 @@ rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req,
        nchunks = 0;
        do {
                n = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs, true);
-               if (n <= 0)
+               if (n < 0)
                        return ERR_PTR(n);
 
                iptr = xdr_encode_rdma_segment(iptr, seg);
@@ -462,7 +462,7 @@ rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt,
        nchunks = 0;
        do {
                n = r_xprt->rx_ia.ri_ops->ro_map(r_xprt, seg, nsegs, true);
-               if (n <= 0)
+               if (n < 0)
                        return ERR_PTR(n);
 
                iptr = xdr_encode_rdma_segment(iptr, seg);