diff options
author | Zach Brown <zach.brown@oracle.com> | 2006-04-19 06:09:22 +0200 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-04-20 02:52:13 +0200 |
commit | 77347ff7554b317a0120cb774b3bd6258a2c4bb4 (patch) | |
tree | 772b973546b20e6251f57914ad40af8d6e62492f /drivers/scsi/qla2xxx | |
parent | [SCSI] Overrun in drivers/scsi/sim710.c (diff) | |
download | linux-77347ff7554b317a0120cb774b3bd6258a2c4bb4.tar.xz linux-77347ff7554b317a0120cb774b3bd6258a2c4bb4.zip |
[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: Zach Brown <zach.brown@oracle.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 017729c59a49..bef84966d7ad 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -1700,8 +1700,8 @@ qla2x00_free_device(scsi_qla_host_t *ha) ha->flags.online = 0; /* Detach interrupts */ - if (ha->pdev->irq) - free_irq(ha->pdev->irq, ha); + if (ha->host->irq) + free_irq(ha->host->irq, ha); /* release io space registers */ if (ha->iobase) |