diff options
| -rw-r--r-- | drivers/scsi/ps3rom.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c index fad6cb5cba28..0eed5ca1e032 100644 --- a/drivers/scsi/ps3rom.c +++ b/drivers/scsi/ps3rom.c | |||
| @@ -95,7 +95,7 @@ static int ps3rom_slave_configure(struct scsi_device *scsi_dev) | |||
| 95 | */ | 95 | */ |
| 96 | static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf) | 96 | static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf) |
| 97 | { | 97 | { |
| 98 | int k, req_len, act_len, len, active; | 98 | int k, req_len, len, fin; |
| 99 | void *kaddr; | 99 | void *kaddr; |
| 100 | struct scatterlist *sgpnt; | 100 | struct scatterlist *sgpnt; |
| 101 | unsigned int buflen; | 101 | unsigned int buflen; |
| @@ -107,24 +107,22 @@ static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf) | |||
| 107 | if (!scsi_sglist(cmd)) | 107 | if (!scsi_sglist(cmd)) |
| 108 | return -1; | 108 | return -1; |
| 109 | 109 | ||
| 110 | active = 1; | 110 | req_len = fin = 0; |
| 111 | req_len = act_len = 0; | ||
| 112 | scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) { | 111 | scsi_for_each_sg(cmd, sgpnt, scsi_sg_count(cmd), k) { |
| 113 | if (active) { | 112 | kaddr = kmap_atomic(sg_page(sgpnt), KM_IRQ0); |
| 114 | kaddr = kmap_atomic(sg_page(sgpnt), KM_IRQ0); | 113 | len = sgpnt->length; |
| 115 | len = sgpnt->length; | 114 | if ((req_len + len) > buflen) { |
| 116 | if ((req_len + len) > buflen) { | 115 | len = buflen - req_len; |
| 117 | active = 0; | 116 | fin = 1; |
| 118 | len = buflen - req_len; | ||
| 119 | } | ||
| 120 | memcpy(kaddr + sgpnt->offset, buf + req_len, len); | ||
| 121 | flush_kernel_dcache_page(sg_page(sgpnt)); | ||
| 122 | kunmap_atomic(kaddr, KM_IRQ0); | ||
| 123 | act_len += len; | ||
| 124 | } | 117 | } |
| 125 | req_len += sgpnt->length; | 118 | memcpy(kaddr + sgpnt->offset, buf + req_len, len); |
| 119 | flush_kernel_dcache_page(sg_page(sgpnt)); | ||
| 120 | kunmap_atomic(kaddr, KM_IRQ0); | ||
| 121 | req_len += len; | ||
| 122 | if (fin) | ||
| 123 | break; | ||
| 126 | } | 124 | } |
| 127 | scsi_set_resid(cmd, buflen - act_len); | 125 | scsi_set_resid(cmd, buflen - req_len); |
| 128 | return 0; | 126 | return 0; |
| 129 | } | 127 | } |
| 130 | 128 | ||
