• Mike Christie's avatar
    scsi: iscsi: Remove unneeded task state check · 533ac412
    Mike Christie authored
    Commit 5923d64b ("scsi: libiscsi: Drop taskqueuelock") added an extra
    task->state because for commit 6f8830f5 ("scsi: libiscsi: add lock
    around task lists to fix list corruption regression") we didn't know why we
    ended up with cmds on the list and thought it might have been a bad target
    sending a response while we were still sending the cmd. We were never able
    to get a target to send us a response early, because it turns out the bug
    was just a race in libiscsi/libiscsi_tcp where:
    
     1. iscsi_tcp_r2t_rsp() queues a r2t to tcp_task->r2tqueue.
    
     2. iscsi_tcp_task_xmit() runs iscsi_tcp_get_curr_r2t() and sees we have a
        r2t. It dequeues it and iscsi_tcp_task_xmit() starts to process it.
    
     3. iscsi_tcp_r2t_rsp() runs iscsi_requeue_task() and puts the task on the
        requeue list.
    
     4. iscsi_tcp_task_xmit() sends the data for r2t. This is the final chunk
        of data, so the cmd is done.
    
     5. target sends the response.
    
     6. On a different CPU from #3, iscsi_complete_task() processes the
        response.  Since there was no common lock for the list, the lists/tasks
        pointers are not fully in sync, so could end up with list corruption.
    
    Since it was just a race on our side, remove the extra check and fix up the
    comments.
    
    Link: https://lore.kernel.org/r/20220616224557.115234-7-michael.christie@oracle.comReviewed-by: default avatarWu Bo <wubo40@huawei.com>
    Reviewed-by: default avatarLee Duncan <lduncan@suse.com>
    Signed-off-by: default avatarMike Christie <michael.christie@oracle.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    533ac412
libiscsi.c 103 KB