if (conn->conn_transport->iscsit_put_login_tx(conn, login,
                                        login->rsp_length + padding) < 0)
 -              return -1;
 +              goto err;
  
        login->rsp_length               = 0;
-       mutex_lock(&sess->cmdsn_mutex);
-       login_rsp->exp_cmdsn            = cpu_to_be32(sess->exp_cmd_sn);
-       login_rsp->max_cmdsn            = cpu_to_be32(sess->max_cmd_sn);
-       mutex_unlock(&sess->cmdsn_mutex);
  
        return 0;
 +
 +err:
 +      if (login->login_complete) {
 +              if (conn->rx_thread && conn->rx_thread_active) {
 +                      send_sig(SIGINT, conn->rx_thread, 1);
 +                      kthread_stop(conn->rx_thread);
 +              }
 +              if (conn->tx_thread && conn->tx_thread_active) {
 +                      send_sig(SIGINT, conn->tx_thread, 1);
 +                      kthread_stop(conn->tx_thread);
 +              }
 +              spin_lock(&iscsit_global->ts_bitmap_lock);
 +              bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id,
 +                                    get_order(1));
 +              spin_unlock(&iscsit_global->ts_bitmap_lock);
 +      }
 +      return -1;
  }
  
  static void iscsi_target_sk_data_ready(struct sock *sk)