Commit 77347ff7 authored by Zach Brown's avatar Zach Brown Committed by James Bottomley

[SCSI] qla2xxx: only free_irq() after request_irq() succeeds

If qla2x00_probe_one() fails before calling request_irq() but gets to
qla2x00_free_device() then it will mistakenly try to free an irq it didn't
request.  It's chosing to free based on ha->pdev->irq which is always set.

host->irq is set after request_irq() succeeds so let's use that to decide
to free or not.

This was observed and tested when a silly set of circumstances lead to
firmware loading failing on a 2100.
Signed-off-by: default avatarZach Brown <zach.brown@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 1a34456b
...@@ -1700,8 +1700,8 @@ qla2x00_free_device(scsi_qla_host_t *ha) ...@@ -1700,8 +1700,8 @@ qla2x00_free_device(scsi_qla_host_t *ha)
ha->flags.online = 0; ha->flags.online = 0;
/* Detach interrupts */ /* Detach interrupts */
if (ha->pdev->irq) if (ha->host->irq)
free_irq(ha->pdev->irq, ha); free_irq(ha->host->irq, ha);
/* release io space registers */ /* release io space registers */
if (ha->iobase) if (ha->iobase)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment