[PATCH] cciss: fix scsi_dma_map failure handiling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This fixes the scsi_dma_map failure path, which could lead to data
corruption.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx>
---
 drivers/block/cciss_scsi.c |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c
index 4aca7dd..9d9aa53 100644
--- a/drivers/block/cciss_scsi.c
+++ b/drivers/block/cciss_scsi.c
@@ -1185,7 +1185,7 @@ cciss_scsi_proc_info(struct Scsi_Host *sh,
    dma mapping  and fills in the scatter gather entries of the 
    cciss command, cp. */
 
-static void
+static int
 cciss_scatter_gather(struct pci_dev *pdev, 
 		CommandList_struct *cp,	
 		struct scsi_cmnd *cmd)
@@ -1198,7 +1198,9 @@ cciss_scatter_gather(struct pci_dev *pdev,
 	BUG_ON(scsi_sg_count(cmd) > MAXSGENTRIES);
 
 	use_sg = scsi_dma_map(cmd);
-	if (use_sg) {	/* not too many addrs? */
+	if (use_sg < 0)
+		return use_sg;
+	else if (use_sg) {	/* not too many addrs? */
 		scsi_for_each_sg(cmd, sg, use_sg, i) {
 			addr64 = (__u64) sg_dma_address(sg);
 			len  = sg_dma_len(sg);
@@ -1213,7 +1215,7 @@ cciss_scatter_gather(struct pci_dev *pdev,
 
 	cp->Header.SGList = (__u8) use_sg;   /* no. SGs contig in this cmd */
 	cp->Header.SGTotal = (__u16) use_sg; /* total sgs in this cmd list */
-	return;
+	return 0;
 }
 
 
@@ -1311,7 +1313,14 @@ cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd
 		break;
 	}
 
-	cciss_scatter_gather((*c)->pdev, cp, cmd); // Fill the SG list
+	rc = cciss_scatter_gather((*c)->pdev, cp, cmd); // Fill the SG list
+	if (rc < 0) {
+		spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
+		scsi_cmd_free(*c, cp);
+		spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
+
+		return SCSI_MLQUEUE_HOST_BUSY;
+	}
 
 	/* Put the request on the tail of the request queue */
 
-- 
1.5.2.4

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux