Skip to contentSkip to conversation

3w-9xxx: kmap_atomic in twa_scsiop_execute_scsi

SCSI Vasily Averin 1 participant 1 message Jun 4, 2006

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hello Adam,

you have fixed recently potential memory corruption, kmap_atomic issue in 3w-9xxx driver, however it seems for me you have forgotten to fix the same issue in yet another similar place, in twa_scsiop_execute_scsi() function.

Thank you,
Vasily Averin

SWsoft Virtuozzo/OpenVZ Linux kernel team

drivers/scsi/3w-9xxx.c +5 -1
@@ -1864,9 +1864,13 @@ static int twa_scsiop_execute_scsi(TW_De
 			if ((tw_dev->srb[request_id]->use_sg == 1) && (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH)) {
 				if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL) {
 					struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
-					char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
+					unsigned long flags = 0;
+					char *buf;
+					local_irq_save(flags);
+					buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
 					memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length);
 					kunmap_atomic(buf - sg->offset, KM_IRQ0);
+					local_irq_restore(flags);
 				}
 				command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
 				command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH);