• Andrew Vasquez's avatar
    [SCSI] qla2xxx: Defer enablement of RISC interrupts until ISP initialization completes. · 048feec5
    Andrew Vasquez authored
    Josip Rodin noted
    (http://article.gmane.org/gmane.linux.ports.sparc/10152) the
    driver oopsing during registration of an rport to the
    FC-transport layer with a backtrace indicating a dereferencing of
    an shost->shost_data equal to NULL.  David Miller identified a
    small window in driver logic where this could happen:
    
        > Look at how the driver registers the IRQ handler before the host has
        > been registered with the SCSI layer.
        >
        > That leads to a window of time where the shost hasn't been setup
        > fully, yet ISRs can come in and trigger DPC thread events, such as
        > loop resyncs, which expect the transport area to be setup.
        >
        > But it won't be setup, because scsi_add_host() hasn't finished yet.
        >
        > Note that in Josip's crash log, we don't even see the
        >
        >         qla_printk(KERN_INFO, ha, "\n"
        >             " QLogic Fibre Channel HBA Driver: %s\n"
        >             "  QLogic %s - %s\n"
        >             "  ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n",
        >  ...
        >
        > message yet.
        >
        > Which means that the crash occurs between qla2x00_request_irqs()
        > and printing that message.
    
    Close this window by enabling RISC interrupts after the host has
    been registered with the SCSI midlayer.
    Reported-by: default avatarJosip Rodin <joy@entuzijast.net>
    Cc: Stable Tree <stable@kernel.org>
    Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
    048feec5
qla_isr.c 48.2 KB