From f0f814c8cad7a56affb3775bdb81a4fa1e022ff4 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 29 Sep 2010 17:43:31 +0000 Subject: [PATCH] ibmvstgt: fixed residual handling. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@2305 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- ibmvstgt/src/ibmvstgt.c | 2 +- ibmvstgt/src/libsrpnew.c | 30 +++++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/ibmvstgt/src/ibmvstgt.c b/ibmvstgt/src/ibmvstgt.c index 984ebd1c7..129a31c13 100644 --- a/ibmvstgt/src/ibmvstgt.c +++ b/ibmvstgt/src/ibmvstgt.c @@ -408,7 +408,7 @@ static int ibmvstgt_xmit_response(struct scst_cmd *sc) WARN_ON(dir != DMA_FROM_DEVICE && dir != DMA_TO_DEVICE); /* For read commands, transfer the data to the initiator. */ - if (dir == DMA_FROM_DEVICE && scst_cmd_get_resp_data_len(sc)) { + if (dir == DMA_FROM_DEVICE && scst_cmd_get_adjusted_resp_data_len(sc)) { ret = srp_transfer_data(sc, &vio_iu(iue)->srp.cmd, ibmvstgt_rdma, 1, 1); scst_rx_data(sc, ret ? SCST_RX_STATUS_ERROR diff --git a/ibmvstgt/src/libsrpnew.c b/ibmvstgt/src/libsrpnew.c index 09904e2fb..8f1d77aca 100644 --- a/ibmvstgt/src/libsrpnew.c +++ b/ibmvstgt/src/libsrpnew.c @@ -192,20 +192,24 @@ static int srp_direct_data(struct scst_cmd *sc, struct srp_direct_buf *md, { struct iu_entry *iue = NULL; struct scatterlist *sg = NULL; - int err, nsg = 0, len; + int err, nsg = 0, len, sg_cnt; if (dma_map) { iue = scst_cmd_get_tgt_priv(sc); - sg = scst_cmd_get_sg(sc); + if (dir == DMA_TO_DEVICE) { + scst_cmd_get_write_fields(sc, &sg, &sg_cnt); + } else { + sg = scst_cmd_get_sg(sc); + sg_cnt = scst_cmd_get_sg_cnt(sc); + } dprintk("%p %u %u %d\n", iue, scsi_bufflen(sc), - md->len, scst_cmd_get_sg_cnt(sc)); + md->len, sg_cnt); - nsg = dma_map_sg(iue->target->dev, sg, scst_cmd_get_sg_cnt(sc), + nsg = dma_map_sg(iue->target->dev, sg, sg_cnt, DMA_BIDIRECTIONAL); if (!nsg) { - printk(KERN_ERR "fail to map %p %d\n", iue, - scst_cmd_get_sg_cnt(sc)); + printk(KERN_ERR "fail to map %p %d\n", iue, sg_cnt); return 0; } len = min_t(unsigned, scst_cmd_get_expected_transfer_len(sc), @@ -231,11 +235,16 @@ static int srp_indirect_data(struct scst_cmd *sc, struct srp_cmd *cmd, struct scatterlist dummy, *sg = NULL; dma_addr_t token = 0; int err = 0; - int nmd, nsg = 0, len; + int nmd, nsg = 0, len, sg_cnt; if (dma_map || ext_desc) { iue = scst_cmd_get_tgt_priv(sc); - sg = scst_cmd_get_sg(sc); + if (dir == DMA_TO_DEVICE) { + scst_cmd_get_write_fields(sc, &sg, &sg_cnt); + } else { + sg = scst_cmd_get_sg(sc); + sg_cnt = scst_cmd_get_sg_cnt(sc); + } dprintk("%p %u %u %d %d\n", iue, scsi_bufflen(sc), id->len, @@ -274,11 +283,10 @@ static int srp_indirect_data(struct scst_cmd *sc, struct srp_cmd *cmd, rdma: if (dma_map) { - nsg = dma_map_sg(iue->target->dev, sg, scst_cmd_get_sg_cnt(sc), + nsg = dma_map_sg(iue->target->dev, sg, sg_cnt, DMA_BIDIRECTIONAL); if (!nsg) { - eprintk("fail to map %p %d\n", iue, - scst_cmd_get_sg_cnt(sc)); + eprintk("fail to map %p %d\n", iue, sg_cnt); err = -EIO; goto free_mem; }