• Xiaofei Tan's avatar
    scsi: hisi_sas: fix the risk of freeing slot twice · 6ba0fbc3
    Xiaofei Tan authored
    The function hisi_sas_slot_task_free() is used to free the slot and do
    tidy-up of LLDD resources. The LLDD generally should know the state of
    a slot and decide when to free it, and it should only be done once.
    
    For some scenarios, we really don't know the state, like when TMF
    timeout. In this case, we check task->lldd_task before calling
    hisi_sas_slot_task_free().
    
    However, we may miss some scenarios when we should also check
    task->lldd_task, and it is not SMP safe to check task->lldd_task as we
    don't protect it within spin lock.
    
    This patch is to fix this risk of freeing slot twice, as follows:
    
      1. Check task->lldd_task in the hisi_sas_slot_task_free(), and give
         up freeing of this time if task->lldd_task is NULL.
    
      2. Set slot->buf to NULL after it is freed.
    Signed-off-by: default avatarXiaofei Tan <tanxiaofei@huawei.com>
    Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    6ba0fbc3
hisi_sas_main.c 54.2 KB