[SCSI] ps3rom: Simplify fill_from_dev_buffer()
authorGeert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Mon, 25 Feb 2008 13:24:31 +0000 (14:24 +0100)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 7 Apr 2008 17:15:41 +0000 (12:15 -0500)
As we no longer need to calculate the data length of the whole scatterlist,
we can abort the loop earlier and coalesce req_len and act_len into one
variable, making fill_from_dev_buffer() more similar to fetch_to_dev_buffer().

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/ps3rom.c

index fad6cb5cba283acc8410e9d8bed1e996062d03b8..0eed5ca1e032c636e4bf5ed8d27533602d835831 100644 (file)
@@ -95,7 +95,7 @@ static int ps3rom_slave_configure(struct scsi_device *scsi_dev)
  */
 static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf)
 {
-       int k, req_len, act_len, len, active;
+       int k, req_len, len, fin;
        void *kaddr;
        struct scatterlist *sgpnt;
        unsigned int buflen;
@@ -107,24 +107,22 @@ static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf)
        if (!scsi_sglist(cmd))
                return -1;
 
-       active = 1;
-       req_len = act_len = 0;
+       req_len = fin = 0;
        scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) {
-               if (active) {
-                       kaddr = kmap_atomic(sg_page(sgpnt), KM_IRQ0);
-                       len = sgpnt->length;
-                       if ((req_len + len) > buflen) {
-                               active = 0;
-                               len = buflen - req_len;
-                       }
-                       memcpy(kaddr + sgpnt->offset, buf + req_len, len);
-                       flush_kernel_dcache_page(sg_page(sgpnt));
-                       kunmap_atomic(kaddr, KM_IRQ0);
-                       act_len += len;
+               kaddr = kmap_atomic(sg_page(sgpnt), KM_IRQ0);
+               len = sgpnt->length;
+               if ((req_len + len) > buflen) {
+                       len = buflen - req_len;
+                       fin = 1;
                }
-               req_len += sgpnt->length;
+               memcpy(kaddr + sgpnt->offset, buf + req_len, len);
+               flush_kernel_dcache_page(sg_page(sgpnt));
+               kunmap_atomic(kaddr, KM_IRQ0);
+               req_len += len;
+               if (fin)
+                       break;
        }
-       scsi_set_resid(cmd, buflen - act_len);
+       scsi_set_resid(cmd, buflen - req_len);
        return 0;
 }