• Hou Pu's avatar
    scsi: target: iscsi: Fix login error when receiving · 4e108d4f
    Hou Pu authored
    iscsi_target_sk_data_ready() could be invoked indirectly by
    iscsi_target_do_login_rx() from the workqueue like this:
    
    iscsi_target_do_login_rx()
      iscsi_target_do_login()
        iscsi_target_do_tx_login_io()
          iscsit_put_login_tx()
            iscsi_login_tx_data()
              tx_data()
                sock_sendmsg_nosec()
                  tcp_sendmsg()
                    release_sock()
                      sk_backlog_rcv()
                        tcp_v4_do_rcv()
                          tcp_data_ready()
                            iscsi_target_sk_data_ready()
    
    At that time LOGIN_FLAGS_READ_ACTIVE is not cleared and
    iscsi_target_sk_data_ready will not read data from the socket. Some iscsi
    initiators (libiscsi) will wait forever for a reply.
    
    LOGIN_FLAGS_READ_ACTIVE should be cleared early just after doing the
    receive and before writing to the socket in iscsi_target_do_login_rx.
    
    Unfortunately, LOGIN_FLAGS_READ_ACTIVE is also used by sk_state_change to
    do login cleanup if a socket was closed at login time. It is supposed to be
    cleared after the login PDU is successfully processed and replied.
    
    Introduce another flag, LOGIN_FLAGS_WRITE_ACTIVE, to cover the transmit
    part.
    
    Link: https://lore.kernel.org/r/20200716100212.4237-2-houpu@bytedance.comReviewed-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>
    4e108d4f
iscsi_target_core.h 26.5 KB