rsxx: Kernel Panic caused by mapping Discards
authorPhilip J Kelleher <pjk1939@linux.vnet.ibm.com>
Sat, 28 Sep 2013 02:42:50 +0000 (20:42 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 8 Nov 2013 16:10:28 +0000 (09:10 -0700)
This fixes a kernel panic injected by commit id
8d26750143341831bc312f61c5ed141eeb75b8d0 where discards
are getting mapped through the pci_map_page function call.

The driver will now start verifying that a dma is not a
discard before issuing a the pci_map_page function call.

Also, we are updating the driver version.

Signed-off-by: Philip J Kelleher <pjk1939@linux.vnet.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rsxx/dma.c
drivers/block/rsxx/rsxx_priv.h

index 34fd101..4103601 100644 (file)
@@ -434,26 +434,29 @@ static void rsxx_issue_dmas(struct rsxx_dma_ctrl *ctrl)
                        continue;
                }
 
-               if (dma->cmd == HW_CMD_BLK_WRITE)
-                       dir = PCI_DMA_TODEVICE;
-               else
-                       dir = PCI_DMA_FROMDEVICE;
-
-               /*
-                * The function pci_map_page is placed here because we can
-                * only, by design, issue up to 255 commands to the hardware
-                * at one time per DMA channel. So the maximum amount of mapped
-                * memory would be 255 * 4 channels * 4096 Bytes which is less
-                * than 2GB, the limit of a x8 Non-HWWD PCIe slot. This way the
-                * pci_map_page function should never fail because of a
-                * lack of mappable memory.
-                */
-               dma->dma_addr = pci_map_page(ctrl->card->dev, dma->page,
-                                    dma->pg_off, dma->sub_page.cnt << 9, dir);
-               if (pci_dma_mapping_error(ctrl->card->dev, dma->dma_addr)) {
-                       push_tracker(ctrl->trackers, tag);
-                       rsxx_complete_dma(ctrl, dma, DMA_CANCELLED);
-                       continue;
+               if (dma->cmd != HW_CMD_BLK_DISCARD) {
+                       if (dma->cmd == HW_CMD_BLK_WRITE)
+                               dir = PCI_DMA_TODEVICE;
+                       else
+                               dir = PCI_DMA_FROMDEVICE;
+
+                       /*
+                        * The function pci_map_page is placed here because we
+                        * can only, by design, issue up to 255 commands to the
+                        * hardware at one time per DMA channel. So the maximum
+                        * amount of mapped memory would be 255 * 4 channels *
+                        * 4096 Bytes which is less than 2GB, the limit of a x8
+                        * Non-HWWD PCIe slot. This way the pci_map_page
+                        * function should never fail because of a lack of
+                        * mappable memory.
+                        */
+                       dma->dma_addr = pci_map_page(ctrl->card->dev, dma->page,
+                                       dma->pg_off, dma->sub_page.cnt << 9, dir);
+                       if (pci_dma_mapping_error(ctrl->card->dev, dma->dma_addr)) {
+                               push_tracker(ctrl->trackers, tag);
+                               rsxx_complete_dma(ctrl, dma, DMA_CANCELLED);
+                               continue;
+                       }
                }
 
                set_tracker_dma(ctrl->trackers, tag, dma);
index 8277905..913740e 100644 (file)
@@ -52,7 +52,7 @@ struct proc_cmd;
 #define RS70_PCI_REV_SUPPORTED 4
 
 #define DRIVER_NAME "rsxx"
-#define DRIVER_VERSION "4.0"
+#define DRIVER_VERSION "4.0.1.2498"
 
 /* Block size is 4096 */
 #define RSXX_HW_BLK_SHIFT              12