• Tejun Heo's avatar
    libata: ignore EH scheduling during initialization · f4d6d004
    Tejun Heo authored
    libata enables SCSI host during ATA host activation which happens
    after IRQ handler is registered and IRQ is enabled.  All ATA ports are
    in frozen state when IRQ is enabled but frozen ports may raise limited
    number of IRQs after being frozen - IOW, ->freeze() is not responsible
    for clearing pending IRQs.  During normal operation, the IRQ handler
    is responsible for clearing spurious IRQs on frozen ports and it
    usually doesn't require any extra code.
    
    Unfortunately, during host initialization, the IRQ handler can end up
    scheduling EH for a port whose SCSI host isn't initialized yet.  This
    results in OOPS in the SCSI midlayer.  This is relatively short window
    and scheduling EH for probing is the first thing libata does after
    initialization, so ignoring EH scheduling until initialization is
    complete solves the problem nicely.
    
    This problem was spotted by Berck E. Nash in the following thread.
    
      http://thread.gmane.org/gmane.linux.kernel/519412Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
    Cc: Berck E. Nash <flyboy@gmail.com>
    Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
    f4d6d004
libata-eh.c 54.5 KB