Use the scatterlist iterators and remove direct indexing of the
scatterlist array.

This way allows us to pre-allocate one small scatterlist, which can be
chained with one runtime allocated scatterlist if the pre-allocated one
isn't enough for the whole request.

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

diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 6d053e220153..383603973937 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -3915,22 +3915,22 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist 
*sglist,
                                 u8 *buffer, u32 len)
 {
        int bsize_elem, i, result = 0;
-       struct scatterlist *scatterlist;
+       struct scatterlist *sg;
        void *kaddr;
 
        /* Determine the actual number of bytes per element */
        bsize_elem = PAGE_SIZE * (1 << sglist->order);
 
-       scatterlist = sglist->scatterlist;
+       sg = sglist->scatterlist;
 
-       for (i = 0; i < (len / bsize_elem); i++, buffer += bsize_elem) {
-               struct page *page = sg_page(&scatterlist[i]);
+       for (i = 0; i < (len / bsize_elem); i++, sg = sg_next(sg), buffer += 
bsize_elem) {
+               struct page *page = sg_page(sg);
 
                kaddr = kmap(page);
                memcpy(kaddr, buffer, bsize_elem);
                kunmap(page);
 
-               scatterlist[i].length = bsize_elem;
+               sg->length = bsize_elem;
 
                if (result != 0) {
                        ipr_trace;
@@ -3939,13 +3939,13 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist 
*sglist,
        }
 
        if (len % bsize_elem) {
-               struct page *page = sg_page(&scatterlist[i]);
+               struct page *page = sg_page(sg);
 
                kaddr = kmap(page);
                memcpy(kaddr, buffer, len % bsize_elem);
                kunmap(page);
 
-               scatterlist[i].length = len % bsize_elem;
+               sg->length = len % bsize_elem;
        }
 
        sglist->buffer_len = len;
@@ -3966,6 +3966,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;
@@ -3974,10 +3975,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);
@@ -3997,6 +3998,7 @@ static void ipr_build_ucode_ioadl(struct ipr_cmnd 
*ipr_cmd,
        struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
        struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
        struct scatterlist *scatterlist = sglist->scatterlist;
+       struct scatterlist *sg;
        int i;
 
        ipr_cmd->dma_use_sg = sglist->num_dma_sg;
@@ -4006,11 +4008,11 @@ static void ipr_build_ucode_ioadl(struct ipr_cmnd 
*ipr_cmd,
        ioarcb->ioadl_len =
                cpu_to_be32(sizeof(struct ipr_ioadl_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) {
                ioadl[i].flags_and_data_len =
-                       cpu_to_be32(IPR_IOADL_FLAGS_WRITE | 
sg_dma_len(&scatterlist[i]));
+                       cpu_to_be32(IPR_IOADL_FLAGS_WRITE | sg_dma_len(sg));
                ioadl[i].address =
-                       cpu_to_be32(sg_dma_address(&scatterlist[i]));
+                       cpu_to_be32(sg_dma_address(sg));
        }
 
        ioadl[i-1].flags_and_data_len |=
-- 
2.20.1

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to