• Hou Pu's avatar
    scsi: target: iscsi: Fix hang in iscsit_access_np() when getting tpg->np_login_sem · 42753cc4
    Hou Pu authored
    commit ed43ffea upstream.
    
    The iSCSI target login thread might get stuck with the following stack:
    
    cat /proc/`pidof iscsi_np`/stack
    [<0>] down_interruptible+0x42/0x50
    [<0>] iscsit_access_np+0xe3/0x167
    [<0>] iscsi_target_locate_portal+0x695/0x8ac
    [<0>] __iscsi_target_login_thread+0x855/0xb82
    [<0>] iscsi_target_login_thread+0x2f/0x5a
    [<0>] kthread+0xfa/0x130
    [<0>] ret_from_fork+0x1f/0x30
    
    This can be reproduced via the following steps:
    
    1. Initiator A tries to log in to iqn1-tpg1 on port 3260. After finishing
       PDU exchange in the login thread and before the negotiation is finished
       the the network link goes down. At this point A has not finished login
       and tpg->np_login_sem is held.
    
    2. Initiator B tries to log in to iqn2-tpg1 on port 3260. After finishing
       PDU exchange in the login thread the target expects to process remaining
       login PDUs in workqueue context.
    
    3. Initiator A' tries to log in to iqn1-tpg1 on port 3260 from a new
       socket. A' will wait for tpg->np_login_sem with np->np_login_timer
       loaded to wait for at most 15 seconds. The lock is held by A so A'
       eventually times out.
    
    4. Before A' got timeout initiator B gets negotiation failed and calls
       iscsi_target_login_drop()->iscsi_target_login_sess_out().  The
       np->np_login_timer is canceled and initiator A' will hang forever.
       Because A' is now in the login thread, no new login requests can be
       serviced.
    
    Fix this by moving iscsi_stop_login_thread_timer() out of
    iscsi_target_login_sess_out(). Also remove iscsi_np parameter from
    iscsi_target_login_sess_out().
    
    Link: https://lore.kernel.org/r/20200729130343.24976-1-houpu@bytedance.com
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarMike Christie <michael.christie@oracle.com>
    Signed-off-by: default avatarHou Pu <houpu@bytedance.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    42753cc4
iscsi_target_nego.c 36 KB