OSDN Git Service

am53c974: Fix crash during modprobe
authorHannes Reinecke <hare@suse.de>
Fri, 27 Mar 2015 13:31:12 +0000 (14:31 +0100)
committerJames Bottomley <JBottomley@Odin.com>
Fri, 17 Apr 2015 17:13:56 +0000 (10:13 -0700)
On systems with shared interrupts the interrupt routine might
be called as soon as the interrupt is enabled.
As this might happen before pci_set_drvdata() is called the
system would crash.

Reported-by: Andreas Brogle <anbro@ok.de>
Tested-by: Andreas Brogle <anbro@ok.de>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/am53c974.c

index a6f5ee8..beea30e 100644 (file)
@@ -476,6 +476,8 @@ static int pci_esp_probe_one(struct pci_dev *pdev,
                goto fail_unmap_regs;
        }
 
+       pci_set_drvdata(pdev, pep);
+
        err = request_irq(pdev->irq, scsi_esp_intr, IRQF_SHARED,
                          DRV_MODULE_NAME, esp);
        if (err < 0) {
@@ -496,8 +498,6 @@ static int pci_esp_probe_one(struct pci_dev *pdev,
        /* Assume 40MHz clock */
        esp->cfreq = 40000000;
 
-       pci_set_drvdata(pdev, pep);
-
        err = scsi_esp_register(esp, &pdev->dev);
        if (err)
                goto fail_free_irq;
@@ -507,6 +507,7 @@ static int pci_esp_probe_one(struct pci_dev *pdev,
 fail_free_irq:
        free_irq(pdev->irq, esp);
 fail_unmap_command_block:
+       pci_set_drvdata(pdev, NULL);
        pci_free_consistent(pdev, 16, esp->command_block,
                            esp->command_block_dma);
 fail_unmap_regs:
@@ -530,6 +531,7 @@ static void pci_esp_remove_one(struct pci_dev *pdev)
 
        scsi_esp_unregister(esp);
        free_irq(pdev->irq, esp);
+       pci_set_drvdata(pdev, NULL);
        pci_free_consistent(pdev, 16, esp->command_block,
                            esp->command_block_dma);
        pci_iounmap(pdev, esp->regs);