The current way isn't safe for chained sgl, so use sg helper to
operate sgl.

Signed-off-by: Ming Lei <ming....@redhat.com>
---
 drivers/scsi/ipr.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index d06bc1a817a1..028db6bd0280 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -3952,6 +3952,7 @@ static void ipr_build_ucode_ioadl64(struct ipr_cmnd 
*ipr_cmd,
        struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
        struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
        struct scatterlist *scatterlist = sglist->scatterlist;
+       struct scatterlist *sg;
        int i;
 
        ipr_cmd->dma_use_sg = sglist->num_dma_sg;
@@ -3960,10 +3961,10 @@ static void ipr_build_ucode_ioadl64(struct ipr_cmnd 
*ipr_cmd,
 
        ioarcb->ioadl_len =
                cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * 
ipr_cmd->dma_use_sg);
-       for (i = 0; i < ipr_cmd->dma_use_sg; i++) {
+       for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
                ioadl64[i].flags = cpu_to_be32(IPR_IOADL_FLAGS_WRITE);
-               ioadl64[i].data_len = cpu_to_be32(sg_dma_len(&scatterlist[i]));
-               ioadl64[i].address = 
cpu_to_be64(sg_dma_address(&scatterlist[i]));
+               ioadl64[i].data_len = cpu_to_be32(sg_dma_len(sg));
+               ioadl64[i].address = cpu_to_be64(sg_dma_address(sg));
        }
 
        ioadl64[i-1].flags |= cpu_to_be32(IPR_IOADL_FLAGS_LAST);
-- 
2.20.1

Reply via email to