• Maurizio Lombardi's avatar
    scsi: target: iscsi: Fix hang in the iSCSI login code · 13247018
    Maurizio Lombardi authored
    If the initiator suddenly stops sending data during a login while keeping
    the TCP connection open, the login_work won't be scheduled and will never
    release the login semaphore; concurrent login operations will therefore get
    stuck and fail.
    
    The bug is due to the inability of the login timeout code to properly
    handle this particular case.
    
    Fix the problem by replacing the old per-NP login timer with a new
    per-connection timer.
    
    The timer is started when an initiator connects to the target; if it
    expires, it sends a SIGINT signal to the thread pointed at by the
    conn->login_kworker pointer.
    
    conn->login_kworker is set by calling the iscsit_set_login_timer_kworker()
    helper, initially it will point to the np thread; When the login
    operation's control is in the process of being passed from the NP-thread to
    login_work, the conn->login_worker pointer is set to NULL.  Finally,
    login_kworker will be changed to point to the worker thread executing the
    login_work job.
    
    If conn->login_kworker is NULL when the timer expires, it means that the
    login operation hasn't been completed yet but login_work isn't running, in
    this case the timer will mark the login process as failed and will schedule
    login_work so the latter will be forced to free the resources it holds.
    Signed-off-by: default avatarMaurizio Lombardi <mlombard@redhat.com>
    Link: https://lore.kernel.org/r/20230508162219.1731964-2-mlombard@redhat.comReviewed-by: default avatarMike Christie <michael.christie@oracle.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    13247018
iscsi_target_util.c 35.4 KB