Lines Matching full:conn
476 int iscsit_queue_rsp(struct iscsit_conn *conn, struct iscsit_cmd *cmd) in iscsit_queue_rsp() argument
478 return iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); in iscsit_queue_rsp()
482 void iscsit_aborted_task(struct iscsit_conn *conn, struct iscsit_cmd *cmd) in iscsit_aborted_task() argument
484 spin_lock_bh(&conn->cmd_lock); in iscsit_aborted_task()
487 spin_unlock_bh(&conn->cmd_lock); in iscsit_aborted_task()
498 iscsit_xmit_nondatain_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_xmit_nondatain_pdu() argument
510 if (conn->conn_ops->HeaderDigest) { in iscsit_xmit_nondatain_pdu()
537 if (conn->conn_ops->DataDigest) { in iscsit_xmit_nondatain_pdu()
553 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_xmit_nondatain_pdu()
555 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_xmit_nondatain_pdu()
568 iscsit_xmit_datain_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_xmit_datain_pdu() argument
580 if (conn->conn_ops->HeaderDigest) { in iscsit_xmit_datain_pdu()
610 if (conn->conn_ops->DataDigest) { in iscsit_xmit_datain_pdu()
624 ret = iscsit_fe_sendpage_sg(cmd, conn); in iscsit_xmit_datain_pdu()
629 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_xmit_datain_pdu()
636 static int iscsit_xmit_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_xmit_pdu() argument
641 return iscsit_xmit_datain_pdu(conn, cmd, buf); in iscsit_xmit_pdu()
643 return iscsit_xmit_nondatain_pdu(conn, cmd, buf, buf_len); in iscsit_xmit_pdu()
646 static enum target_prot_op iscsit_get_sup_prot_ops(struct iscsit_conn *conn) in iscsit_get_sup_prot_ops() argument
788 struct iscsit_conn *conn, in iscsit_add_reject() argument
794 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsit_add_reject()
808 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject()
809 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject()
810 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject()
813 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject()
825 struct iscsit_conn *conn; in iscsit_add_reject_from_cmd() local
828 if (!cmd->conn) { in iscsit_add_reject_from_cmd()
829 pr_err("cmd->conn is NULL for ITT: 0x%08x\n", in iscsit_add_reject_from_cmd()
833 conn = cmd->conn; in iscsit_add_reject_from_cmd()
846 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
847 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject_from_cmd()
848 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
852 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject_from_cmd()
949 static void iscsit_ack_from_expstatsn(struct iscsit_conn *conn, u32 exp_statsn) in iscsit_ack_from_expstatsn() argument
954 conn->exp_statsn = exp_statsn; in iscsit_ack_from_expstatsn()
956 if (conn->sess->sess_ops->RDMAExtensions) in iscsit_ack_from_expstatsn()
959 spin_lock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
960 list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) { in iscsit_ack_from_expstatsn()
971 spin_unlock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
992 int iscsit_setup_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_setup_scsi_cmd() argument
1002 atomic_long_inc(&conn->sess->cmd_pdus); in iscsit_setup_scsi_cmd()
1060 if (payload_length && !conn->sess->sess_ops->ImmediateData) { in iscsit_setup_scsi_cmd()
1084 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_scsi_cmd()
1087 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_scsi_cmd()
1092 if (payload_length > conn->sess->sess_ops->FirstBurstLength) { in iscsit_setup_scsi_cmd()
1095 payload_length, conn->sess->sess_ops->FirstBurstLength); in iscsit_setup_scsi_cmd()
1154 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_scsi_cmd()
1156 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_setup_scsi_cmd()
1163 if (!conn->sess->sess_ops->RDMAExtensions && in iscsit_setup_scsi_cmd()
1182 conn->sess->se_sess, be32_to_cpu(hdr->data_length), in iscsit_setup_scsi_cmd()
1185 conn->cmd_cnt); in iscsit_setup_scsi_cmd()
1190 conn->cid); in iscsit_setup_scsi_cmd()
1224 spin_lock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1225 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_setup_scsi_cmd()
1226 spin_unlock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1236 iscsit_start_dataout_timer(cmd, cmd->conn); in iscsit_set_unsolicited_dataout()
1241 int iscsit_process_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_process_scsi_cmd() argument
1256 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_scsi_cmd()
1266 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_scsi_cmd()
1317 rc = iscsit_dump_data_payload(cmd->conn, length, 1); in iscsit_get_immediate_data()
1332 cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, in iscsit_get_immediate_data()
1357 iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, cmd->i_state); in iscsit_get_immediate_data()
1365 iscsit_handle_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_scsi_cmd() argument
1372 rc = iscsit_setup_scsi_cmd(conn, cmd, buf); in iscsit_handle_scsi_cmd()
1385 rc = iscsit_process_scsi_cmd(conn, cmd, hdr); in iscsit_handle_scsi_cmd()
1439 __iscsit_check_dataout_hdr(struct iscsit_conn *conn, void *buf, in __iscsit_check_dataout_hdr() argument
1448 atomic_long_add(payload_length, &conn->sess->rx_data_octets); in __iscsit_check_dataout_hdr()
1453 payload_length, conn->cid); in __iscsit_check_dataout_hdr()
1459 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1465 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1480 if (conn->sess->sess_ops->InitialR2T) { in __iscsit_check_dataout_hdr()
1507 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1525 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1543 iscsit_check_dataout_hdr(struct iscsit_conn *conn, void *buf, in iscsit_check_dataout_hdr() argument
1557 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_check_dataout_hdr()
1560 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_check_dataout_hdr()
1561 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, buf); in iscsit_check_dataout_hdr()
1564 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, payload_length); in iscsit_check_dataout_hdr()
1568 rc = __iscsit_check_dataout_hdr(conn, buf, cmd, payload_length, &success); in iscsit_check_dataout_hdr()
1578 iscsit_get_dataout(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_get_dataout() argument
1606 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1613 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_get_dataout()
1620 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1646 struct iscsit_conn *conn = cmd->conn; in iscsit_check_dataout_payload() local
1657 conn->conn_transport->iscsit_get_dataout(conn, cmd, false); in iscsit_check_dataout_payload()
1681 static int iscsit_handle_data_out(struct iscsit_conn *conn, unsigned char *buf) in iscsit_handle_data_out() argument
1688 rc = iscsit_check_dataout_hdr(conn, buf, &cmd); in iscsit_handle_data_out()
1694 rc = iscsit_get_dataout(conn, cmd, hdr); in iscsit_handle_data_out()
1703 int iscsit_setup_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_setup_nop_out() argument
1711 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1722 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1729 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_nop_out()
1733 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_nop_out()
1735 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1759 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_nop_out()
1770 int iscsit_process_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_process_nop_out() argument
1780 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_process_nop_out()
1783 spin_lock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1784 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_nop_out()
1785 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1787 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_nop_out()
1790 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_process_nop_out()
1795 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_nop_out()
1808 cmd_p = iscsit_find_cmd_from_ttt(conn, be32_to_cpu(hdr->ttt)); in iscsit_process_nop_out()
1812 iscsit_stop_nopin_response_timer(conn); in iscsit_process_nop_out()
1815 iscsit_add_cmd_to_immediate_queue(cmd_p, conn, cmd_p->i_state); in iscsit_process_nop_out()
1817 iscsit_start_nopin_timer(conn); in iscsit_process_nop_out()
1832 static int iscsit_handle_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_nop_out() argument
1841 ret = iscsit_setup_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1869 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1876 rx_got = rx_data(conn, &cmd->iov_misc[0], niov, rx_size); in iscsit_handle_nop_out()
1882 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1889 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_nop_out()
1925 return iscsit_process_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1957 iscsit_handle_task_mgt_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_task_mgt_cmd() argument
1973 hdr->rtt, hdr->refcmdsn, conn->cid); in iscsit_handle_task_mgt_cmd()
2003 conn->sess->se_sess, 0, DMA_NONE, in iscsit_handle_task_mgt_cmd()
2006 conn->cmd_cnt); in iscsit_handle_task_mgt_cmd()
2063 if (iscsit_tmr_task_warm_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
2069 if (iscsit_tmr_task_cold_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
2083 if (iscsit_check_task_reassign_expdatasn(tmr_req, conn) < 0) in iscsit_handle_task_mgt_cmd()
2098 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
2099 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_task_mgt_cmd()
2100 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
2103 int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_task_mgt_cmd()
2113 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_task_mgt_cmd()
2131 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_handle_task_mgt_cmd()
2139 iscsit_setup_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_setup_text_cmd() argument
2144 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_text_cmd()
2147 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_text_cmd()
2166 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_text_cmd()
2179 iscsit_process_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_process_text_cmd() argument
2213 spin_lock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2214 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_text_cmd()
2215 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2218 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_text_cmd()
2221 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_text_cmd()
2238 iscsit_handle_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_text_cmd() argument
2246 rc = iscsit_setup_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2272 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2279 rx_got = rx_data(conn, &iov[0], niov, rx_size); in iscsit_handle_text_cmd()
2283 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2289 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_text_cmd()
2316 return iscsit_process_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2324 int iscsit_logout_closesession(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_logout_closesession() argument
2327 struct iscsit_session *sess = conn->sess; in iscsit_logout_closesession()
2330 " for SID: %u.\n", conn->cid, conn->sess->sid); in iscsit_logout_closesession()
2333 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closesession()
2334 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_SESSION; in iscsit_logout_closesession()
2336 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closesession()
2349 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closesession()
2354 int iscsit_logout_closeconnection(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_logout_closeconnection() argument
2357 struct iscsit_session *sess = conn->sess; in iscsit_logout_closeconnection()
2360 " %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_closeconnection()
2366 if (conn->cid == cmd->logout_cid) { in iscsit_logout_closeconnection()
2367 spin_lock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2369 conn->conn_state = TARG_CONN_STATE_IN_LOGOUT; in iscsit_logout_closeconnection()
2371 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closeconnection()
2372 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_CONNECTION; in iscsit_logout_closeconnection()
2373 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closeconnection()
2375 spin_unlock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2389 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_logout_closeconnection()
2397 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closeconnection()
2402 int iscsit_logout_removeconnforrecovery(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_logout_removeconnforrecovery() argument
2404 struct iscsit_session *sess = conn->sess; in iscsit_logout_removeconnforrecovery()
2407 " CID: %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2413 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2417 if (conn->cid == cmd->logout_cid) { in iscsit_logout_removeconnforrecovery()
2420 cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2422 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2426 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2432 iscsit_handle_logout_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_logout_cmd() argument
2438 struct iscsi_tiqn *tiqn = iscsit_snmp_get_tiqn(conn); in iscsit_handle_logout_cmd()
2455 hdr->cid, conn->cid); in iscsit_handle_logout_cmd()
2457 if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) { in iscsit_handle_logout_cmd()
2467 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_handle_logout_cmd()
2481 be16_to_cpu(hdr->cid) == conn->cid)) in iscsit_handle_logout_cmd()
2484 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2485 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_logout_cmd()
2486 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2489 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_logout_cmd()
2501 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_logout_cmd()
2513 struct iscsit_conn *conn, in iscsit_handle_snack() argument
2524 hdr->begrun, hdr->runlength, conn->cid); in iscsit_handle_snack()
2526 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_snack()
2529 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2538 return iscsit_handle_recovery_datain_or_r2t(conn, buf, in iscsit_handle_snack()
2544 return iscsit_handle_status_snack(conn, hdr->itt, in iscsit_handle_snack()
2548 return iscsit_handle_data_ack(conn, be32_to_cpu(hdr->ttt), in iscsit_handle_snack()
2554 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2559 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2567 static void iscsit_rx_thread_wait_for_tcp(struct iscsit_conn *conn) in iscsit_rx_thread_wait_for_tcp() argument
2569 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_rx_thread_wait_for_tcp()
2570 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_rx_thread_wait_for_tcp()
2572 &conn->rx_half_close_comp, in iscsit_rx_thread_wait_for_tcp()
2584 struct iscsit_conn *conn = cmd->conn; in iscsit_handle_immediate_data() local
2622 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2629 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_handle_immediate_data()
2634 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_handle_immediate_data()
2638 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2648 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_immediate_data()
2683 static void iscsit_build_conn_drop_async_message(struct iscsit_conn *conn) in iscsit_build_conn_drop_async_message() argument
2689 lockdep_assert_held(&conn->sess->conn_lock); in iscsit_build_conn_drop_async_message()
2695 list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { in iscsit_build_conn_drop_async_message()
2712 cmd->logout_cid = conn->cid; in iscsit_build_conn_drop_async_message()
2726 struct iscsit_conn *conn) in iscsit_send_conn_drop_async_message() argument
2738 cmd->stat_sn = conn->stat_sn++; in iscsit_send_conn_drop_async_message()
2740 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_conn_drop_async_message()
2741 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_send_conn_drop_async_message()
2744 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait); in iscsit_send_conn_drop_async_message()
2745 hdr->param3 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Retain); in iscsit_send_conn_drop_async_message()
2749 cmd->logout_cid, conn->cid); in iscsit_send_conn_drop_async_message()
2751 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_conn_drop_async_message()
2754 static void iscsit_tx_thread_wait_for_tcp(struct iscsit_conn *conn) in iscsit_tx_thread_wait_for_tcp() argument
2756 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_tx_thread_wait_for_tcp()
2757 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_tx_thread_wait_for_tcp()
2759 &conn->tx_half_close_comp, in iscsit_tx_thread_wait_for_tcp()
2765 iscsit_build_datain_pdu(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_datain_pdu() argument
2798 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_datain_pdu()
2799 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_datain_pdu()
2806 ntohl(hdr->offset), datain->length, conn->cid); in iscsit_build_datain_pdu()
2810 static int iscsit_send_datain(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_datain() argument
2836 atomic_long_add(datain.length, &conn->sess->tx_data_octets); in iscsit_send_datain()
2847 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_send_datain()
2848 cmd->stat_sn = conn->stat_sn++; in iscsit_send_datain()
2855 iscsit_build_datain_pdu(cmd, conn, &datain, hdr, set_statsn); in iscsit_send_datain()
2857 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, dr, &datain, 0); in iscsit_send_datain()
2871 iscsit_build_logout_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_logout_rsp() argument
2876 struct iscsit_session *sess = conn->sess; in iscsit_build_logout_rsp()
2904 " successful.\n", cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2923 conn->sess, cmd->logout_cid); in iscsit_build_logout_rsp()
2936 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2949 cmd->stat_sn = conn->stat_sn++; in iscsit_build_logout_rsp()
2952 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_logout_rsp()
2953 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_logout_rsp()
2954 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_logout_rsp()
2959 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2966 iscsit_send_logout(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_logout() argument
2970 rc = iscsit_build_logout_rsp(cmd, conn, in iscsit_send_logout()
2975 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_logout()
2979 iscsit_build_nopin_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_nopin_rsp() argument
2989 cmd->stat_sn = (nopout_response) ? conn->stat_sn++ : in iscsit_build_nopin_rsp()
2990 conn->stat_sn; in iscsit_build_nopin_rsp()
2994 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_nopin_rsp()
2996 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_nopin_rsp()
2997 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_nopin_rsp()
3011 struct iscsit_conn *conn, in iscsit_send_unsolicited_nopin() argument
3017 iscsit_build_nopin_rsp(cmd, conn, hdr, false); in iscsit_send_unsolicited_nopin()
3020 " 0x%08x CID: %hu\n", hdr->ttt, cmd->stat_sn, conn->cid); in iscsit_send_unsolicited_nopin()
3022 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_unsolicited_nopin()
3035 iscsit_send_nopin(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_nopin() argument
3039 iscsit_build_nopin_rsp(cmd, conn, hdr, true); in iscsit_send_nopin()
3047 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_nopin()
3054 struct iscsit_conn *conn) in iscsit_send_r2t() argument
3071 if (conn->conn_transport->iscsit_get_r2t_ttt) in iscsit_send_r2t()
3072 conn->conn_transport->iscsit_get_r2t_ttt(conn, cmd, r2t); in iscsit_send_r2t()
3074 r2t->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_send_r2t()
3076 hdr->statsn = cpu_to_be32(conn->stat_sn); in iscsit_send_r2t()
3077 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_r2t()
3078 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_send_r2t()
3087 r2t->offset, r2t->xfer_len, conn->cid); in iscsit_send_r2t()
3093 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_r2t()
3099 iscsit_start_dataout_timer(cmd, conn); in iscsit_send_r2t()
3110 struct iscsit_conn *conn, in iscsit_build_r2ts_for_cmd() argument
3123 if (conn->sess->sess_ops->DataSequenceInOrder && in iscsit_build_r2ts_for_cmd()
3127 while (cmd->outstanding_r2ts < conn->sess->sess_ops->MaxOutstandingR2T) { in iscsit_build_r2ts_for_cmd()
3128 if (conn->sess->sess_ops->DataSequenceInOrder) { in iscsit_build_r2ts_for_cmd()
3133 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3140 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3144 conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3149 xfer_len = conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3193 void iscsit_build_rsp_pdu(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_rsp_pdu() argument
3197 cmd->stat_sn = conn->stat_sn++; in iscsit_build_rsp_pdu()
3199 atomic_long_inc(&conn->sess->rsp_pdus); in iscsit_build_rsp_pdu()
3216 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_rsp_pdu()
3217 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_rsp_pdu()
3218 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_rsp_pdu()
3223 cmd->se_cmd.scsi_status, conn->cid); in iscsit_build_rsp_pdu()
3227 static int iscsit_send_response(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_response() argument
3234 iscsit_build_rsp_pdu(cmd, conn, inc_stat_sn, hdr); in iscsit_send_response()
3262 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, data_buf, in iscsit_send_response()
3284 iscsit_build_task_mgt_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_task_mgt_rsp() argument
3293 cmd->stat_sn = conn->stat_sn++; in iscsit_build_task_mgt_rsp()
3296 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_task_mgt_rsp()
3297 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_task_mgt_rsp()
3298 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_task_mgt_rsp()
3302 cmd->init_task_tag, cmd->stat_sn, hdr->response, conn->cid); in iscsit_build_task_mgt_rsp()
3307 iscsit_send_task_mgt_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_task_mgt_rsp() argument
3311 iscsit_build_task_mgt_rsp(cmd, conn, hdr); in iscsit_send_task_mgt_rsp()
3313 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_task_mgt_rsp()
3324 struct iscsit_conn *conn = cmd->conn; in iscsit_build_sendtargets_response() local
3334 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength, in iscsit_build_sendtargets_response()
3379 cmd->conn->sess->sess_ops->InitiatorName))) { in iscsit_build_sendtargets_response()
3423 sockaddr = &conn->local_sockaddr; in iscsit_build_sendtargets_response()
3469 iscsit_build_text_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_text_rsp() argument
3488 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_build_text_rsp()
3495 cmd->stat_sn = conn->stat_sn++; in iscsit_build_text_rsp()
3498 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_text_rsp()
3505 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_text_rsp()
3506 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_text_rsp()
3510 cmd->targ_xfer_tag, cmd->stat_sn, text_length, conn->cid, in iscsit_build_text_rsp()
3520 struct iscsit_conn *conn) in iscsit_send_text_rsp() argument
3525 text_length = iscsit_build_text_rsp(cmd, conn, hdr, in iscsit_send_text_rsp()
3526 conn->conn_transport->transport_type); in iscsit_send_text_rsp()
3530 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_text_rsp()
3536 iscsit_build_reject(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_reject() argument
3544 cmd->stat_sn = conn->stat_sn++; in iscsit_build_reject()
3546 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_reject()
3547 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_reject()
3554 struct iscsit_conn *conn) in iscsit_send_reject() argument
3558 iscsit_build_reject(cmd, conn, hdr); in iscsit_send_reject()
3561 " CID: %hu\n", ntohl(hdr->statsn), hdr->reason, conn->cid); in iscsit_send_reject()
3563 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_reject()
3568 void iscsit_thread_get_cpumask(struct iscsit_conn *conn) in iscsit_thread_get_cpumask() argument
3582 ord = conn->bitmap_id % cpumask_weight(cpu_online_mask); in iscsit_thread_get_cpumask()
3585 cpumask_set_cpu(cpu, conn->conn_cpumask); in iscsit_thread_get_cpumask()
3593 cpumask_clear(conn->conn_cpumask); in iscsit_thread_get_cpumask()
3594 ord = conn->bitmap_id % cpumask_weight(conn_allowed_cpumask); in iscsit_thread_get_cpumask()
3597 cpumask_set_cpu(cpu, conn->conn_cpumask); in iscsit_thread_get_cpumask()
3608 cpumask_setall(conn->conn_cpumask); in iscsit_thread_get_cpumask()
3611 static void iscsit_thread_reschedule(struct iscsit_conn *conn) in iscsit_thread_reschedule() argument
3615 * connection's RX/TX threads update conn->allowed_cpumask. in iscsit_thread_reschedule()
3618 conn->allowed_cpumask)) { in iscsit_thread_reschedule()
3619 iscsit_thread_get_cpumask(conn); in iscsit_thread_reschedule()
3620 conn->conn_tx_reset_cpumask = 1; in iscsit_thread_reschedule()
3621 conn->conn_rx_reset_cpumask = 1; in iscsit_thread_reschedule()
3622 cpumask_copy(conn->allowed_cpumask, in iscsit_thread_reschedule()
3628 struct iscsit_conn *conn, in iscsit_thread_check_cpumask() argument
3640 iscsit_thread_reschedule(conn); in iscsit_thread_check_cpumask()
3647 if (!conn->conn_tx_reset_cpumask) in iscsit_thread_check_cpumask()
3650 if (!conn->conn_rx_reset_cpumask) in iscsit_thread_check_cpumask()
3659 set_cpus_allowed_ptr(p, conn->conn_cpumask); in iscsit_thread_check_cpumask()
3661 conn->conn_tx_reset_cpumask = 0; in iscsit_thread_check_cpumask()
3663 conn->conn_rx_reset_cpumask = 0; in iscsit_thread_check_cpumask()
3668 iscsit_immediate_queue(struct iscsit_conn *conn, struct iscsit_cmd *cmd, int state) in iscsit_immediate_queue() argument
3674 ret = iscsit_send_r2t(cmd, conn); in iscsit_immediate_queue()
3679 spin_lock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3681 spin_unlock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3686 iscsit_mod_nopin_response_timer(conn); in iscsit_immediate_queue()
3687 ret = iscsit_send_unsolicited_nopin(cmd, conn, 1); in iscsit_immediate_queue()
3692 ret = iscsit_send_unsolicited_nopin(cmd, conn, 0); in iscsit_immediate_queue()
3700 conn->cid); in iscsit_immediate_queue()
3712 iscsit_handle_immediate_queue(struct iscsit_conn *conn) in iscsit_handle_immediate_queue() argument
3714 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_immediate_queue()
3720 while ((qr = iscsit_get_cmd_from_immediate_queue(conn))) { in iscsit_handle_immediate_queue()
3721 atomic_set(&conn->check_immediate_queue, 0); in iscsit_handle_immediate_queue()
3726 ret = t->iscsit_immediate_queue(conn, cmd, state); in iscsit_handle_immediate_queue()
3735 iscsit_response_queue(struct iscsit_conn *conn, struct iscsit_cmd *cmd, int state) in iscsit_response_queue() argument
3742 ret = iscsit_send_datain(cmd, conn); in iscsit_response_queue()
3754 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3771 ret = iscsit_send_response(cmd, conn); in iscsit_response_queue()
3774 ret = iscsit_send_logout(cmd, conn); in iscsit_response_queue()
3778 cmd, conn); in iscsit_response_queue()
3781 ret = iscsit_send_nopin(cmd, conn); in iscsit_response_queue()
3784 ret = iscsit_send_reject(cmd, conn); in iscsit_response_queue()
3787 ret = iscsit_send_task_mgt_rsp(cmd, conn); in iscsit_response_queue()
3790 ret = iscsit_tmr_post_handler(cmd, conn); in iscsit_response_queue()
3792 iscsit_fall_back_to_erl0(conn->sess); in iscsit_response_queue()
3795 ret = iscsit_send_text_rsp(cmd, conn); in iscsit_response_queue()
3801 state, conn->cid); in iscsit_response_queue()
3809 if (!iscsit_logout_post_handler(cmd, conn)) in iscsit_response_queue()
3827 cmd->i_state, conn->cid); in iscsit_response_queue()
3831 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3841 static int iscsit_handle_response_queue(struct iscsit_conn *conn) in iscsit_handle_response_queue() argument
3843 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_response_queue()
3849 while ((qr = iscsit_get_cmd_from_response_queue(conn))) { in iscsit_handle_response_queue()
3854 ret = t->iscsit_response_queue(conn, cmd, state); in iscsit_handle_response_queue()
3865 struct iscsit_conn *conn = arg; in iscsi_target_tx_thread() local
3879 iscsit_thread_check_cpumask(conn, current, 1); in iscsi_target_tx_thread()
3881 wait_event_interruptible(conn->queues_wq, in iscsi_target_tx_thread()
3882 !iscsit_conn_all_queues_empty(conn)); in iscsi_target_tx_thread()
3888 ret = iscsit_handle_immediate_queue(conn); in iscsi_target_tx_thread()
3892 ret = iscsit_handle_response_queue(conn); in iscsi_target_tx_thread()
3909 if (conn->conn_state != TARG_CONN_STATE_IN_LOGIN) in iscsi_target_tx_thread()
3910 iscsit_take_action_for_connection_exit(conn, &conn_freed); in iscsi_target_tx_thread()
3920 static int iscsi_target_rx_opcode(struct iscsit_conn *conn, unsigned char *buf) in iscsi_target_rx_opcode() argument
3928 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3932 ret = iscsit_handle_scsi_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3935 ret = iscsit_handle_data_out(conn, buf); in iscsi_target_rx_opcode()
3940 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3944 ret = iscsit_handle_nop_out(conn, cmd, buf); in iscsi_target_rx_opcode()
3947 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3951 ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3955 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt); in iscsi_target_rx_opcode()
3959 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3964 ret = iscsit_handle_text_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3967 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3971 ret = iscsit_handle_logout_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3973 wait_for_completion_timeout(&conn->conn_logout_comp, in iscsi_target_rx_opcode()
3977 ret = iscsit_handle_snack(conn, buf); in iscsi_target_rx_opcode()
3981 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsi_target_rx_opcode()
3994 return iscsit_add_reject(conn, ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); in iscsi_target_rx_opcode()
3997 static bool iscsi_target_check_conn_state(struct iscsit_conn *conn) in iscsi_target_check_conn_state() argument
4001 spin_lock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
4002 ret = (conn->conn_state != TARG_CONN_STATE_LOGGED_IN); in iscsi_target_check_conn_state()
4003 spin_unlock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
4008 static void iscsit_get_rx_pdu(struct iscsit_conn *conn) in iscsit_get_rx_pdu() argument
4025 iscsit_thread_check_cpumask(conn, current, 0); in iscsit_get_rx_pdu()
4032 ret = rx_data(conn, &iov, 1, ISCSI_HDR_LEN); in iscsit_get_rx_pdu()
4034 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_get_rx_pdu()
4050 ret = rx_data(conn, &iov, 1, iov.iov_len); in iscsit_get_rx_pdu()
4052 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_get_rx_pdu()
4057 if (conn->conn_ops->HeaderDigest) { in iscsit_get_rx_pdu()
4061 ret = rx_data(conn, &iov, 1, ISCSI_CRC_LEN); in iscsit_get_rx_pdu()
4063 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_get_rx_pdu()
4078 atomic_long_inc(&conn->sess->conn_digest_errors); in iscsit_get_rx_pdu()
4085 if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT) in iscsit_get_rx_pdu()
4090 if (conn->sess->sess_ops->SessionType && in iscsit_get_rx_pdu()
4095 iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_get_rx_pdu()
4100 ret = iscsi_target_rx_opcode(conn, buffer); in iscsit_get_rx_pdu()
4111 struct iscsit_conn *conn = arg; in iscsi_target_rx_thread() local
4123 rc = wait_for_completion_interruptible(&conn->rx_login_comp); in iscsi_target_rx_thread()
4124 if (rc < 0 || iscsi_target_check_conn_state(conn)) in iscsi_target_rx_thread()
4127 if (!conn->conn_transport->iscsit_get_rx_pdu) in iscsi_target_rx_thread()
4130 conn->conn_transport->iscsit_get_rx_pdu(conn); in iscsi_target_rx_thread()
4133 atomic_set(&conn->transport_failed, 1); in iscsi_target_rx_thread()
4134 iscsit_take_action_for_connection_exit(conn, &conn_freed); in iscsi_target_rx_thread()
4146 static void iscsit_release_commands_from_conn(struct iscsit_conn *conn) in iscsit_release_commands_from_conn() argument
4150 struct iscsit_session *sess = conn->sess; in iscsit_release_commands_from_conn()
4156 spin_lock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4157 list_splice_init(&conn->conn_cmd_list, &tmp_list); in iscsit_release_commands_from_conn()
4174 &conn->conn_cmd_list); in iscsit_release_commands_from_conn()
4190 spin_unlock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4205 if (!conn->conn_transport->iscsit_wait_conn) { in iscsit_release_commands_from_conn()
4206 target_stop_cmd_counter(conn->cmd_cnt); in iscsit_release_commands_from_conn()
4207 target_wait_for_cmds(conn->cmd_cnt); in iscsit_release_commands_from_conn()
4212 struct iscsit_conn *conn) in iscsit_stop_timers_for_cmds() argument
4216 spin_lock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4217 list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) { in iscsit_stop_timers_for_cmds()
4221 spin_unlock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4225 struct iscsit_conn *conn) in iscsit_close_connection() argument
4227 int conn_logout = (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT); in iscsit_close_connection()
4228 struct iscsit_session *sess = conn->sess; in iscsit_close_connection()
4231 " %u\n", conn->cid, sess->sid); in iscsit_close_connection()
4243 if (!conn->conn_transport->rdma_shutdown) in iscsit_close_connection()
4244 complete(&conn->conn_logout_comp); in iscsit_close_connection()
4247 if (conn->tx_thread && in iscsit_close_connection()
4248 cmpxchg(&conn->tx_thread_active, true, false)) { in iscsit_close_connection()
4249 send_sig(SIGINT, conn->tx_thread, 1); in iscsit_close_connection()
4250 kthread_stop(conn->tx_thread); in iscsit_close_connection()
4253 if (conn->rx_thread && in iscsit_close_connection()
4254 cmpxchg(&conn->rx_thread_active, true, false)) { in iscsit_close_connection()
4255 send_sig(SIGINT, conn->rx_thread, 1); in iscsit_close_connection()
4256 kthread_stop(conn->rx_thread); in iscsit_close_connection()
4261 bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, in iscsit_close_connection()
4265 iscsit_stop_timers_for_cmds(conn); in iscsit_close_connection()
4266 iscsit_stop_nopin_response_timer(conn); in iscsit_close_connection()
4267 iscsit_stop_nopin_timer(conn); in iscsit_close_connection()
4269 if (conn->conn_transport->iscsit_wait_conn) in iscsit_close_connection()
4270 conn->conn_transport->iscsit_wait_conn(conn); in iscsit_close_connection()
4281 if (atomic_read(&conn->connection_recovery)) { in iscsit_close_connection()
4282 iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4283 iscsit_prepare_cmds_for_reallegiance(conn); in iscsit_close_connection()
4285 iscsit_clear_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4286 iscsit_release_commands_from_conn(conn); in iscsit_close_connection()
4288 iscsit_free_queue_reqs_for_conn(conn); in iscsit_close_connection()
4295 if (atomic_read(&conn->conn_logout_remove)) { in iscsit_close_connection()
4296 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_SESSION) { in iscsit_close_connection()
4297 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4300 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_CONNECTION) in iscsit_close_connection()
4301 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4303 atomic_set(&conn->conn_logout_remove, 0); in iscsit_close_connection()
4309 list_del(&conn->conn_list); in iscsit_close_connection()
4316 if (atomic_read(&conn->connection_recovery)) in iscsit_close_connection()
4317 iscsit_build_conn_drop_async_message(conn); in iscsit_close_connection()
4326 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4327 if (atomic_read(&conn->sleep_on_conn_wait_comp)) { in iscsit_close_connection()
4328 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4329 complete(&conn->conn_wait_comp); in iscsit_close_connection()
4330 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4331 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4340 if (atomic_read(&conn->connection_wait_rcfr)) { in iscsit_close_connection()
4341 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4342 complete(&conn->conn_wait_rcfr_comp); in iscsit_close_connection()
4343 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4344 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4346 atomic_set(&conn->connection_reinstatement, 1); in iscsit_close_connection()
4347 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4353 iscsit_check_conn_usage_count(conn); in iscsit_close_connection()
4355 if (conn->sock) in iscsit_close_connection()
4356 sock_release(conn->sock); in iscsit_close_connection()
4358 if (conn->conn_transport->iscsit_free_conn) in iscsit_close_connection()
4359 conn->conn_transport->iscsit_free_conn(conn); in iscsit_close_connection()
4362 conn->conn_state = TARG_CONN_STATE_FREE; in iscsit_close_connection()
4363 iscsit_free_conn(conn); in iscsit_close_connection()
4524 struct iscsit_conn *conn) in iscsit_logout_post_handler_closesession() argument
4526 struct iscsit_session *sess = conn->sess; in iscsit_logout_post_handler_closesession()
4537 if (!conn->conn_transport->rdma_shutdown) { in iscsit_logout_post_handler_closesession()
4538 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_closesession()
4543 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_closesession()
4544 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_closesession()
4546 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_closesession()
4553 struct iscsit_conn *conn) in iscsit_logout_post_handler_samecid() argument
4557 if (!conn->conn_transport->rdma_shutdown) { in iscsit_logout_post_handler_samecid()
4558 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_samecid()
4563 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_samecid()
4564 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_samecid()
4566 iscsit_cause_connection_reinstatement(conn, sleep); in iscsit_logout_post_handler_samecid()
4567 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_samecid()
4571 struct iscsit_conn *conn, in iscsit_logout_post_handler_diffcid() argument
4575 struct iscsit_session *sess = conn->sess; in iscsit_logout_post_handler_diffcid()
4611 struct iscsit_conn *conn) in iscsit_logout_post_handler() argument
4621 iscsit_logout_post_handler_closesession(conn); in iscsit_logout_post_handler()
4626 if (conn->cid == cmd->logout_cid) { in iscsit_logout_post_handler()
4631 iscsit_logout_post_handler_samecid(conn); in iscsit_logout_post_handler()
4637 iscsit_logout_post_handler_diffcid(conn, in iscsit_logout_post_handler()
4673 struct iscsit_conn *conn, *conn_tmp = NULL; in iscsit_stop_session() local
4679 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, in iscsit_stop_session()
4684 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { in iscsit_stop_session()
4690 iscsit_inc_conn_usage_count(conn); in iscsit_stop_session()
4693 iscsit_cause_connection_reinstatement(conn, 1); in iscsit_stop_session()
4696 iscsit_dec_conn_usage_count(conn); in iscsit_stop_session()
4702 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) in iscsit_stop_session()
4703 iscsit_cause_connection_reinstatement(conn, 0); in iscsit_stop_session()