• Jie Zhan's avatar
    scsi: hisi_sas: Fix SATA devices missing issue during I_T nexus reset · 3c2673a0
    Jie Zhan authored
    SATA devices on an expander may be removed and not be found again when I_T
    nexus reset and revalidation are processed simultaneously.
    
    The issue comes from:
    
     - Revalidation can remove SATA devices in link reset, e.g. in
       hisi_sas_clear_nexus_ha().
    
     - However, hisi_sas_debug_I_T_nexus_reset() polls the state of a SATA
       device on an expander after sending link_reset, where it calls:
        hisi_sas_debug_I_T_nexus_reset
         sas_ata_wait_after_reset
          ata_wait_after_reset
           ata_wait_ready
            smp_ata_check_ready
             sas_ex_phy_discover
              sas_ex_phy_discover_helper
               sas_set_ex_phy
    
       The ex_phy's change count is updated in sas_set_ex_phy(), so SATA
       devices after a link reset may not be found later through revalidation.
    
    A similar issue was reported in:
    commit 0f3fce5c ("[SCSI] libsas: fix ata_eh clobbering ex_phys via
    smp_ata_check_ready")
    commit 87c8331f ("[SCSI] libsas: prevent domain rediscovery competing
    with ata error handling").
    
    To address this issue, in hisi_sas_debug_I_T_nexus_reset(), we now call
    smp_ata_check_ready_type() that only polls the device type while not
    updating the ex_phy's data of libsas.
    
    Fixes: 71453bd9 ("scsi: hisi_sas: Use sas_ata_wait_after_reset() in IT nexus reset")
    Signed-off-by: default avatarJie Zhan <zhanjie9@hisilicon.com>
    Link: https://lore.kernel.org/r/20221118083714.4034612-5-zhanjie9@hisilicon.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    3c2673a0
hisi_sas_main.c 65.3 KB