forked from Minki/linux
am53c974: Fix crash during modprobe
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>
This commit is contained in:
parent
16b8528d20
commit
8041708ed4
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user