• J
    scsi: ata: Fix a race condition between scsi error handler and ahci interrupt · 02e500a0
    Jason Yan 提交于
    euler inclusion
    category: bugfix
    bugzilla: NA
    CVE: NA
    
    ---------------------------
    
       interrupt                                          scsi_eh
    
    ahci_error_intr
      =>ata_port_freeze
        =>__ata_port_freeze
          =>ahci_freeze (turn IRQ off)
        =>ata_port_abort
          =>ata_port_schedule_eh
            =>shost->host_eh_scheduled++;
    	host_eh_scheduled = 1
                                                     scsi_error_handler
    						   =>ata_scsi_error
    						     =>ata_scsi_port_error_handler
    						       =>ahci_error_handler
    						       . =>sata_pmp_error_handler
    						       .   =>ata_eh_thaw_port
    						       .     =>ahci_thaw (turn IRQ on)
    ahci_error_intr                                        .
      =>ata_port_freeze                                    .
        =>__ata_port_freeze                                .
          =>ahci_freeze (turn IRQ off)                     .
        =>ata_port_abort                                   .
          =>ata_port_schedule_eh                           .
            =>shost->host_eh_scheduled++;                  .
    	host_eh_scheduled = 2                          .
    						       =>ata_std_end_eh
    						         =>host->host_eh_scheduled = 0;
    
    host_eh_scheduled is 0 and scsi eh thread will not be scheduled again,
    and the ata port remain freeze and will never be enabled.
    Reported-by: Nluojian <luojian5@huawei.com>
    Signed-off-by: NJason Yan <yanaijie@huawei.com>
    Reviewed-by: Nzhengbin <zhengbin13@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    02e500a0
scsi_lib.c 94.9 KB