[SCSI] qla2xxx: only free_irq() after request_irq() succeeds
authorZach Brown <zach.brown@oracle.com>
Wed, 19 Apr 2006 04:09:22 +0000 (21:09 -0700)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Thu, 20 Apr 2006 00:52:13 +0000 (20:52 -0400)
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>
drivers/scsi/qla2xxx/qla_os.c

index 017729c59a49957d93b150fe80a85319a9fb5cff..bef84966d7ad52bfa8b1a9d856e514b4db7ccee2 100644 (file)
@@ -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)