Lines Matching refs:conn

477 int iscsit_queue_rsp(struct iscsi_conn *conn, struct iscsi_cmd *cmd)  in iscsit_queue_rsp()  argument
479 return iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); in iscsit_queue_rsp()
483 void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd) in iscsit_aborted_task() argument
485 spin_lock_bh(&conn->cmd_lock); in iscsit_aborted_task()
488 spin_unlock_bh(&conn->cmd_lock); in iscsit_aborted_task()
499 iscsit_xmit_nondatain_pdu(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_xmit_nondatain_pdu() argument
511 if (conn->conn_ops->HeaderDigest) { in iscsit_xmit_nondatain_pdu()
514 iscsit_do_crypto_hash_buf(conn->conn_tx_hash, hdr, in iscsit_xmit_nondatain_pdu()
540 if (conn->conn_ops->DataDigest) { in iscsit_xmit_nondatain_pdu()
541 iscsit_do_crypto_hash_buf(conn->conn_tx_hash, in iscsit_xmit_nondatain_pdu()
558 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_xmit_nondatain_pdu()
560 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_xmit_nondatain_pdu()
573 iscsit_xmit_datain_pdu(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_xmit_datain_pdu() argument
585 if (conn->conn_ops->HeaderDigest) { in iscsit_xmit_datain_pdu()
588 iscsit_do_crypto_hash_buf(conn->conn_tx_hash, cmd->pdu, in iscsit_xmit_datain_pdu()
617 if (conn->conn_ops->DataDigest) { in iscsit_xmit_datain_pdu()
618 cmd->data_crc = iscsit_do_crypto_hash_sg(conn->conn_tx_hash, in iscsit_xmit_datain_pdu()
635 ret = iscsit_fe_sendpage_sg(cmd, conn); in iscsit_xmit_datain_pdu()
640 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_xmit_datain_pdu()
647 static int iscsit_xmit_pdu(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_xmit_pdu() argument
652 return iscsit_xmit_datain_pdu(conn, cmd, buf); in iscsit_xmit_pdu()
654 return iscsit_xmit_nondatain_pdu(conn, cmd, buf, buf_len); in iscsit_xmit_pdu()
657 static enum target_prot_op iscsit_get_sup_prot_ops(struct iscsi_conn *conn) in iscsit_get_sup_prot_ops() argument
790 struct iscsi_conn *conn, in iscsit_add_reject() argument
796 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsit_add_reject()
810 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject()
811 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject()
812 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject()
815 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject()
827 struct iscsi_conn *conn; in iscsit_add_reject_from_cmd() local
830 if (!cmd->conn) { in iscsit_add_reject_from_cmd()
835 conn = cmd->conn; in iscsit_add_reject_from_cmd()
848 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
849 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject_from_cmd()
850 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
854 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject_from_cmd()
951 static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn) in iscsit_ack_from_expstatsn() argument
956 conn->exp_statsn = exp_statsn; in iscsit_ack_from_expstatsn()
958 if (conn->sess->sess_ops->RDMAExtensions) in iscsit_ack_from_expstatsn()
961 spin_lock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
962 list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) { in iscsit_ack_from_expstatsn()
973 spin_unlock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
994 int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_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()
1133 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_scsi_cmd()
1135 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_setup_scsi_cmd()
1142 if (!conn->sess->sess_ops->RDMAExtensions && in iscsit_setup_scsi_cmd()
1158 conn->sess->se_sess, be32_to_cpu(hdr->data_length), in iscsit_setup_scsi_cmd()
1165 conn->cid); in iscsit_setup_scsi_cmd()
1194 spin_lock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1195 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_setup_scsi_cmd()
1196 spin_unlock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1212 iscsit_start_dataout_timer(cmd, cmd->conn); in iscsit_set_unsolicited_dataout()
1217 int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_scsi_cmd() argument
1232 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_scsi_cmd()
1242 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_scsi_cmd()
1293 rc = iscsit_dump_data_payload(cmd->conn, length, 1); in iscsit_get_immediate_data()
1308 cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, in iscsit_get_immediate_data()
1333 iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, cmd->i_state); in iscsit_get_immediate_data()
1341 iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_scsi_cmd() argument
1348 rc = iscsit_setup_scsi_cmd(conn, cmd, buf); in iscsit_handle_scsi_cmd()
1361 rc = iscsit_process_scsi_cmd(conn, cmd, hdr); in iscsit_handle_scsi_cmd()
1447 __iscsit_check_dataout_hdr(struct iscsi_conn *conn, void *buf, in __iscsit_check_dataout_hdr() argument
1456 atomic_long_add(payload_length, &conn->sess->rx_data_octets); in __iscsit_check_dataout_hdr()
1461 payload_length, conn->cid); in __iscsit_check_dataout_hdr()
1467 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1473 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1488 if (conn->sess->sess_ops->InitialR2T) { in __iscsit_check_dataout_hdr()
1515 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1533 return iscsit_dump_data_payload(conn, payload_length, 1); in __iscsit_check_dataout_hdr()
1551 iscsit_check_dataout_hdr(struct iscsi_conn *conn, void *buf, in iscsit_check_dataout_hdr() argument
1565 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_check_dataout_hdr()
1568 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_check_dataout_hdr()
1569 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, buf); in iscsit_check_dataout_hdr()
1572 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, payload_length); in iscsit_check_dataout_hdr()
1576 rc = __iscsit_check_dataout_hdr(conn, buf, cmd, payload_length, &success); in iscsit_check_dataout_hdr()
1586 iscsit_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_get_dataout() argument
1614 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1621 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_get_dataout()
1628 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1631 data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd, in iscsit_get_dataout()
1657 struct iscsi_conn *conn = cmd->conn; in iscsit_check_dataout_payload() local
1668 conn->conn_transport->iscsit_get_dataout(conn, cmd, false); in iscsit_check_dataout_payload()
1692 static int iscsit_handle_data_out(struct iscsi_conn *conn, unsigned char *buf) in iscsit_handle_data_out() argument
1699 rc = iscsit_check_dataout_hdr(conn, buf, &cmd); in iscsit_handle_data_out()
1705 rc = iscsit_get_dataout(conn, cmd, hdr); in iscsit_handle_data_out()
1714 int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_nop_out() argument
1722 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1733 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1740 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_nop_out()
1744 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_nop_out()
1746 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1770 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_nop_out()
1781 int iscsit_process_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_nop_out() argument
1791 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_process_nop_out()
1794 spin_lock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1795 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_nop_out()
1796 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1798 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_nop_out()
1801 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_process_nop_out()
1806 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_nop_out()
1819 cmd_p = iscsit_find_cmd_from_ttt(conn, be32_to_cpu(hdr->ttt)); in iscsit_process_nop_out()
1823 iscsit_stop_nopin_response_timer(conn); in iscsit_process_nop_out()
1826 iscsit_add_cmd_to_immediate_queue(cmd_p, conn, cmd_p->i_state); in iscsit_process_nop_out()
1828 iscsit_start_nopin_timer(conn); in iscsit_process_nop_out()
1843 static int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_nop_out() argument
1852 ret = iscsit_setup_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1880 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1887 rx_got = rx_data(conn, &cmd->iov_misc[0], niov, rx_size); in iscsit_handle_nop_out()
1893 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1894 iscsit_do_crypto_hash_buf(conn->conn_rx_hash, ping_data, in iscsit_handle_nop_out()
1902 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_nop_out()
1938 return iscsit_process_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1970 iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_task_mgt_cmd() argument
1986 hdr->rtt, hdr->refcmdsn, conn->cid); in iscsit_handle_task_mgt_cmd()
2016 conn->sess->se_sess, 0, DMA_NONE, in iscsit_handle_task_mgt_cmd()
2075 if (iscsit_tmr_task_warm_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
2081 if (iscsit_tmr_task_cold_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
2095 if (iscsit_check_task_reassign_expdatasn(tmr_req, conn) < 0) in iscsit_handle_task_mgt_cmd()
2110 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
2111 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_task_mgt_cmd()
2112 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
2115 int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_task_mgt_cmd()
2125 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_task_mgt_cmd()
2143 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_handle_task_mgt_cmd()
2151 iscsit_setup_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_text_cmd() argument
2156 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_text_cmd()
2159 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_text_cmd()
2178 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_text_cmd()
2191 iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_text_cmd() argument
2225 spin_lock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2226 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_text_cmd()
2227 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2230 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_text_cmd()
2233 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_text_cmd()
2250 iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_text_cmd() argument
2258 rc = iscsit_setup_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2284 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2291 rx_got = rx_data(conn, &iov[0], niov, rx_size); in iscsit_handle_text_cmd()
2295 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2296 iscsit_do_crypto_hash_buf(conn->conn_rx_hash, in iscsit_handle_text_cmd()
2304 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_text_cmd()
2331 return iscsit_process_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2339 int iscsit_logout_closesession(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_closesession() argument
2342 struct iscsi_session *sess = conn->sess; in iscsit_logout_closesession()
2345 " for SID: %u.\n", conn->cid, conn->sess->sid); in iscsit_logout_closesession()
2348 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closesession()
2349 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_SESSION; in iscsit_logout_closesession()
2351 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closesession()
2364 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closesession()
2369 int iscsit_logout_closeconnection(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_closeconnection() argument
2372 struct iscsi_session *sess = conn->sess; in iscsit_logout_closeconnection()
2375 " %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_closeconnection()
2381 if (conn->cid == cmd->logout_cid) { in iscsit_logout_closeconnection()
2382 spin_lock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2384 conn->conn_state = TARG_CONN_STATE_IN_LOGOUT; in iscsit_logout_closeconnection()
2386 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closeconnection()
2387 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_CONNECTION; in iscsit_logout_closeconnection()
2388 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closeconnection()
2390 spin_unlock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2404 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_logout_closeconnection()
2412 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closeconnection()
2417 int iscsit_logout_removeconnforrecovery(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_removeconnforrecovery() argument
2419 struct iscsi_session *sess = conn->sess; in iscsit_logout_removeconnforrecovery()
2422 " CID: %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2428 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2432 if (conn->cid == cmd->logout_cid) { in iscsit_logout_removeconnforrecovery()
2435 cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2437 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2441 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2447 iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_logout_cmd() argument
2453 struct iscsi_tiqn *tiqn = iscsit_snmp_get_tiqn(conn); in iscsit_handle_logout_cmd()
2470 hdr->cid, conn->cid); in iscsit_handle_logout_cmd()
2472 if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) { in iscsit_handle_logout_cmd()
2482 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_handle_logout_cmd()
2496 be16_to_cpu(hdr->cid) == conn->cid)) in iscsit_handle_logout_cmd()
2499 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2500 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_logout_cmd()
2501 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2504 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_logout_cmd()
2516 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_logout_cmd()
2528 struct iscsi_conn *conn, in iscsit_handle_snack() argument
2539 hdr->begrun, hdr->runlength, conn->cid); in iscsit_handle_snack()
2541 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_snack()
2544 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2553 return iscsit_handle_recovery_datain_or_r2t(conn, buf, in iscsit_handle_snack()
2559 return iscsit_handle_status_snack(conn, hdr->itt, in iscsit_handle_snack()
2563 return iscsit_handle_data_ack(conn, be32_to_cpu(hdr->ttt), in iscsit_handle_snack()
2569 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2574 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2582 static void iscsit_rx_thread_wait_for_tcp(struct iscsi_conn *conn) in iscsit_rx_thread_wait_for_tcp() argument
2584 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_rx_thread_wait_for_tcp()
2585 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_rx_thread_wait_for_tcp()
2587 &conn->rx_half_close_comp, in iscsit_rx_thread_wait_for_tcp()
2599 struct iscsi_conn *conn = cmd->conn; in iscsit_handle_immediate_data() local
2637 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2644 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_handle_immediate_data()
2649 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_handle_immediate_data()
2653 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2656 data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd, in iscsit_handle_immediate_data()
2665 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_immediate_data()
2700 static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) in iscsit_build_conn_drop_async_message() argument
2706 lockdep_assert_held(&conn->sess->conn_lock); in iscsit_build_conn_drop_async_message()
2712 list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { in iscsit_build_conn_drop_async_message()
2729 cmd->logout_cid = conn->cid; in iscsit_build_conn_drop_async_message()
2743 struct iscsi_conn *conn) in iscsit_send_conn_drop_async_message() argument
2755 cmd->stat_sn = conn->stat_sn++; in iscsit_send_conn_drop_async_message()
2757 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_conn_drop_async_message()
2758 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_send_conn_drop_async_message()
2761 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait); in iscsit_send_conn_drop_async_message()
2762 hdr->param3 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Retain); in iscsit_send_conn_drop_async_message()
2766 cmd->logout_cid, conn->cid); in iscsit_send_conn_drop_async_message()
2768 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_conn_drop_async_message()
2771 static void iscsit_tx_thread_wait_for_tcp(struct iscsi_conn *conn) in iscsit_tx_thread_wait_for_tcp() argument
2773 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_tx_thread_wait_for_tcp()
2774 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_tx_thread_wait_for_tcp()
2776 &conn->tx_half_close_comp, in iscsit_tx_thread_wait_for_tcp()
2782 iscsit_build_datain_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_datain_pdu() argument
2815 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_datain_pdu()
2816 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_datain_pdu()
2823 ntohl(hdr->offset), datain->length, conn->cid); in iscsit_build_datain_pdu()
2827 static int iscsit_send_datain(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_datain() argument
2853 atomic_long_add(datain.length, &conn->sess->tx_data_octets); in iscsit_send_datain()
2864 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_send_datain()
2865 cmd->stat_sn = conn->stat_sn++; in iscsit_send_datain()
2872 iscsit_build_datain_pdu(cmd, conn, &datain, hdr, set_statsn); in iscsit_send_datain()
2874 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, dr, &datain, 0); in iscsit_send_datain()
2888 iscsit_build_logout_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_logout_rsp() argument
2893 struct iscsi_session *sess = conn->sess; in iscsit_build_logout_rsp()
2921 " successful.\n", cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2940 conn->sess, cmd->logout_cid); in iscsit_build_logout_rsp()
2953 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2966 cmd->stat_sn = conn->stat_sn++; in iscsit_build_logout_rsp()
2969 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_logout_rsp()
2970 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_logout_rsp()
2971 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_logout_rsp()
2976 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2983 iscsit_send_logout(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_logout() argument
2987 rc = iscsit_build_logout_rsp(cmd, conn, in iscsit_send_logout()
2992 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_logout()
2996 iscsit_build_nopin_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_nopin_rsp() argument
3006 cmd->stat_sn = (nopout_response) ? conn->stat_sn++ : in iscsit_build_nopin_rsp()
3007 conn->stat_sn; in iscsit_build_nopin_rsp()
3011 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_nopin_rsp()
3013 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_nopin_rsp()
3014 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_nopin_rsp()
3028 struct iscsi_conn *conn, in iscsit_send_unsolicited_nopin() argument
3034 iscsit_build_nopin_rsp(cmd, conn, hdr, false); in iscsit_send_unsolicited_nopin()
3037 " 0x%08x CID: %hu\n", hdr->ttt, cmd->stat_sn, conn->cid); in iscsit_send_unsolicited_nopin()
3039 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_unsolicited_nopin()
3052 iscsit_send_nopin(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_nopin() argument
3056 iscsit_build_nopin_rsp(cmd, conn, hdr, true); in iscsit_send_nopin()
3064 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_nopin()
3071 struct iscsi_conn *conn) in iscsit_send_r2t() argument
3088 if (conn->conn_transport->iscsit_get_r2t_ttt) in iscsit_send_r2t()
3089 conn->conn_transport->iscsit_get_r2t_ttt(conn, cmd, r2t); in iscsit_send_r2t()
3091 r2t->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_send_r2t()
3093 hdr->statsn = cpu_to_be32(conn->stat_sn); in iscsit_send_r2t()
3094 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_r2t()
3095 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_send_r2t()
3104 r2t->offset, r2t->xfer_len, conn->cid); in iscsit_send_r2t()
3110 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_r2t()
3116 iscsit_start_dataout_timer(cmd, conn); in iscsit_send_r2t()
3127 struct iscsi_conn *conn, in iscsit_build_r2ts_for_cmd() argument
3140 if (conn->sess->sess_ops->DataSequenceInOrder && in iscsit_build_r2ts_for_cmd()
3144 while (cmd->outstanding_r2ts < conn->sess->sess_ops->MaxOutstandingR2T) { in iscsit_build_r2ts_for_cmd()
3145 if (conn->sess->sess_ops->DataSequenceInOrder) { in iscsit_build_r2ts_for_cmd()
3150 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3157 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3161 conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3166 xfer_len = conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3210 void iscsit_build_rsp_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_rsp_pdu() argument
3214 cmd->stat_sn = conn->stat_sn++; in iscsit_build_rsp_pdu()
3216 atomic_long_inc(&conn->sess->rsp_pdus); in iscsit_build_rsp_pdu()
3233 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_rsp_pdu()
3234 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_rsp_pdu()
3235 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_rsp_pdu()
3240 cmd->se_cmd.scsi_status, conn->cid); in iscsit_build_rsp_pdu()
3244 static int iscsit_send_response(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_response() argument
3251 iscsit_build_rsp_pdu(cmd, conn, inc_stat_sn, hdr); in iscsit_send_response()
3279 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, data_buf, in iscsit_send_response()
3301 iscsit_build_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_task_mgt_rsp() argument
3310 cmd->stat_sn = conn->stat_sn++; in iscsit_build_task_mgt_rsp()
3313 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_task_mgt_rsp()
3314 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_task_mgt_rsp()
3315 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_task_mgt_rsp()
3319 cmd->init_task_tag, cmd->stat_sn, hdr->response, conn->cid); in iscsit_build_task_mgt_rsp()
3324 iscsit_send_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_task_mgt_rsp() argument
3328 iscsit_build_task_mgt_rsp(cmd, conn, hdr); in iscsit_send_task_mgt_rsp()
3330 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_task_mgt_rsp()
3341 struct iscsi_conn *conn = cmd->conn; in iscsit_build_sendtargets_response() local
3351 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength, in iscsit_build_sendtargets_response()
3396 cmd->conn->sess->sess_ops->InitiatorName))) { in iscsit_build_sendtargets_response()
3440 sockaddr = &conn->local_sockaddr; in iscsit_build_sendtargets_response()
3486 iscsit_build_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_text_rsp() argument
3505 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_build_text_rsp()
3512 cmd->stat_sn = conn->stat_sn++; in iscsit_build_text_rsp()
3515 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_text_rsp()
3522 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_text_rsp()
3523 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_text_rsp()
3527 cmd->targ_xfer_tag, cmd->stat_sn, text_length, conn->cid, in iscsit_build_text_rsp()
3537 struct iscsi_conn *conn) in iscsit_send_text_rsp() argument
3542 text_length = iscsit_build_text_rsp(cmd, conn, hdr, in iscsit_send_text_rsp()
3543 conn->conn_transport->transport_type); in iscsit_send_text_rsp()
3547 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_text_rsp()
3553 iscsit_build_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_reject() argument
3561 cmd->stat_sn = conn->stat_sn++; in iscsit_build_reject()
3563 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_reject()
3564 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_reject()
3571 struct iscsi_conn *conn) in iscsit_send_reject() argument
3575 iscsit_build_reject(cmd, conn, hdr); in iscsit_send_reject()
3578 " CID: %hu\n", ntohl(hdr->statsn), hdr->reason, conn->cid); in iscsit_send_reject()
3580 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_reject()
3585 void iscsit_thread_get_cpumask(struct iscsi_conn *conn) in iscsit_thread_get_cpumask() argument
3596 ord = conn->bitmap_id % cpumask_weight(cpu_online_mask); in iscsit_thread_get_cpumask()
3599 cpumask_set_cpu(cpu, conn->conn_cpumask); in iscsit_thread_get_cpumask()
3607 cpumask_setall(conn->conn_cpumask); in iscsit_thread_get_cpumask()
3611 iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) in iscsit_immediate_queue() argument
3617 ret = iscsit_send_r2t(cmd, conn); in iscsit_immediate_queue()
3622 spin_lock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3624 spin_unlock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3629 iscsit_mod_nopin_response_timer(conn); in iscsit_immediate_queue()
3630 ret = iscsit_send_unsolicited_nopin(cmd, conn, 1); in iscsit_immediate_queue()
3635 ret = iscsit_send_unsolicited_nopin(cmd, conn, 0); in iscsit_immediate_queue()
3643 conn->cid); in iscsit_immediate_queue()
3655 iscsit_handle_immediate_queue(struct iscsi_conn *conn) in iscsit_handle_immediate_queue() argument
3657 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_immediate_queue()
3663 while ((qr = iscsit_get_cmd_from_immediate_queue(conn))) { in iscsit_handle_immediate_queue()
3664 atomic_set(&conn->check_immediate_queue, 0); in iscsit_handle_immediate_queue()
3669 ret = t->iscsit_immediate_queue(conn, cmd, state); in iscsit_handle_immediate_queue()
3678 iscsit_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) in iscsit_response_queue() argument
3685 ret = iscsit_send_datain(cmd, conn); in iscsit_response_queue()
3697 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3714 ret = iscsit_send_response(cmd, conn); in iscsit_response_queue()
3717 ret = iscsit_send_logout(cmd, conn); in iscsit_response_queue()
3721 cmd, conn); in iscsit_response_queue()
3724 ret = iscsit_send_nopin(cmd, conn); in iscsit_response_queue()
3727 ret = iscsit_send_reject(cmd, conn); in iscsit_response_queue()
3730 ret = iscsit_send_task_mgt_rsp(cmd, conn); in iscsit_response_queue()
3733 ret = iscsit_tmr_post_handler(cmd, conn); in iscsit_response_queue()
3735 iscsit_fall_back_to_erl0(conn->sess); in iscsit_response_queue()
3738 ret = iscsit_send_text_rsp(cmd, conn); in iscsit_response_queue()
3744 state, conn->cid); in iscsit_response_queue()
3752 if (!iscsit_logout_post_handler(cmd, conn)) in iscsit_response_queue()
3770 cmd->i_state, conn->cid); in iscsit_response_queue()
3774 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3784 static int iscsit_handle_response_queue(struct iscsi_conn *conn) in iscsit_handle_response_queue() argument
3786 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_response_queue()
3792 while ((qr = iscsit_get_cmd_from_response_queue(conn))) { in iscsit_handle_response_queue()
3797 ret = t->iscsit_response_queue(conn, cmd, state); in iscsit_handle_response_queue()
3808 struct iscsi_conn *conn = arg; in iscsi_target_tx_thread() local
3822 iscsit_thread_check_cpumask(conn, current, 1); in iscsi_target_tx_thread()
3824 wait_event_interruptible(conn->queues_wq, in iscsi_target_tx_thread()
3825 !iscsit_conn_all_queues_empty(conn)); in iscsi_target_tx_thread()
3831 ret = iscsit_handle_immediate_queue(conn); in iscsi_target_tx_thread()
3835 ret = iscsit_handle_response_queue(conn); in iscsi_target_tx_thread()
3852 if (conn->conn_state != TARG_CONN_STATE_IN_LOGIN) in iscsi_target_tx_thread()
3853 iscsit_take_action_for_connection_exit(conn, &conn_freed); in iscsi_target_tx_thread()
3863 static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) in iscsi_target_rx_opcode() argument
3871 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3875 ret = iscsit_handle_scsi_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3878 ret = iscsit_handle_data_out(conn, buf); in iscsi_target_rx_opcode()
3883 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3887 ret = iscsit_handle_nop_out(conn, cmd, buf); in iscsi_target_rx_opcode()
3890 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3894 ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3898 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt); in iscsi_target_rx_opcode()
3902 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3907 ret = iscsit_handle_text_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3910 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3914 ret = iscsit_handle_logout_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3916 wait_for_completion_timeout(&conn->conn_logout_comp, in iscsi_target_rx_opcode()
3920 ret = iscsit_handle_snack(conn, buf); in iscsi_target_rx_opcode()
3924 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsi_target_rx_opcode()
3937 return iscsit_add_reject(conn, ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); in iscsi_target_rx_opcode()
3940 static bool iscsi_target_check_conn_state(struct iscsi_conn *conn) in iscsi_target_check_conn_state() argument
3944 spin_lock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
3945 ret = (conn->conn_state != TARG_CONN_STATE_LOGGED_IN); in iscsi_target_check_conn_state()
3946 spin_unlock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
3951 static void iscsit_get_rx_pdu(struct iscsi_conn *conn) in iscsit_get_rx_pdu() argument
3967 iscsit_thread_check_cpumask(conn, current, 0); in iscsit_get_rx_pdu()
3974 ret = rx_data(conn, &iov, 1, ISCSI_HDR_LEN); in iscsit_get_rx_pdu()
3976 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_get_rx_pdu()
3980 if (conn->conn_ops->HeaderDigest) { in iscsit_get_rx_pdu()
3984 ret = rx_data(conn, &iov, 1, ISCSI_CRC_LEN); in iscsit_get_rx_pdu()
3986 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_get_rx_pdu()
3990 iscsit_do_crypto_hash_buf(conn->conn_rx_hash, buffer, in iscsit_get_rx_pdu()
4003 atomic_long_inc(&conn->sess->conn_digest_errors); in iscsit_get_rx_pdu()
4010 if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT) in iscsit_get_rx_pdu()
4015 if (conn->sess->sess_ops->SessionType && in iscsit_get_rx_pdu()
4020 iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_get_rx_pdu()
4025 ret = iscsi_target_rx_opcode(conn, buffer); in iscsit_get_rx_pdu()
4036 struct iscsi_conn *conn = arg; in iscsi_target_rx_thread() local
4048 rc = wait_for_completion_interruptible(&conn->rx_login_comp); in iscsi_target_rx_thread()
4049 if (rc < 0 || iscsi_target_check_conn_state(conn)) in iscsi_target_rx_thread()
4052 if (!conn->conn_transport->iscsit_get_rx_pdu) in iscsi_target_rx_thread()
4055 conn->conn_transport->iscsit_get_rx_pdu(conn); in iscsi_target_rx_thread()
4058 atomic_set(&conn->transport_failed, 1); in iscsi_target_rx_thread()
4059 iscsit_take_action_for_connection_exit(conn, &conn_freed); in iscsi_target_rx_thread()
4071 static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) in iscsit_release_commands_from_conn() argument
4075 struct iscsi_session *sess = conn->sess; in iscsit_release_commands_from_conn()
4081 spin_lock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4082 list_splice_init(&conn->conn_cmd_list, &tmp_list); in iscsit_release_commands_from_conn()
4096 &conn->conn_cmd_list); in iscsit_release_commands_from_conn()
4103 spin_unlock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4115 struct iscsi_conn *conn) in iscsit_stop_timers_for_cmds() argument
4119 spin_lock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4120 list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) { in iscsit_stop_timers_for_cmds()
4124 spin_unlock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4128 struct iscsi_conn *conn) in iscsit_close_connection() argument
4130 int conn_logout = (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT); in iscsit_close_connection()
4131 struct iscsi_session *sess = conn->sess; in iscsit_close_connection()
4134 " %u\n", conn->cid, sess->sid); in iscsit_close_connection()
4146 if (!conn->conn_transport->rdma_shutdown) in iscsit_close_connection()
4147 complete(&conn->conn_logout_comp); in iscsit_close_connection()
4150 if (conn->tx_thread && in iscsit_close_connection()
4151 cmpxchg(&conn->tx_thread_active, true, false)) { in iscsit_close_connection()
4152 send_sig(SIGINT, conn->tx_thread, 1); in iscsit_close_connection()
4153 kthread_stop(conn->tx_thread); in iscsit_close_connection()
4156 if (conn->rx_thread && in iscsit_close_connection()
4157 cmpxchg(&conn->rx_thread_active, true, false)) { in iscsit_close_connection()
4158 send_sig(SIGINT, conn->rx_thread, 1); in iscsit_close_connection()
4159 kthread_stop(conn->rx_thread); in iscsit_close_connection()
4164 bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, in iscsit_close_connection()
4168 iscsit_stop_timers_for_cmds(conn); in iscsit_close_connection()
4169 iscsit_stop_nopin_response_timer(conn); in iscsit_close_connection()
4170 iscsit_stop_nopin_timer(conn); in iscsit_close_connection()
4172 if (conn->conn_transport->iscsit_wait_conn) in iscsit_close_connection()
4173 conn->conn_transport->iscsit_wait_conn(conn); in iscsit_close_connection()
4184 if (atomic_read(&conn->connection_recovery)) { in iscsit_close_connection()
4185 iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4186 iscsit_prepare_cmds_for_reallegiance(conn); in iscsit_close_connection()
4188 iscsit_clear_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4189 iscsit_release_commands_from_conn(conn); in iscsit_close_connection()
4191 iscsit_free_queue_reqs_for_conn(conn); in iscsit_close_connection()
4198 if (atomic_read(&conn->conn_logout_remove)) { in iscsit_close_connection()
4199 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_SESSION) { in iscsit_close_connection()
4200 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4203 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_CONNECTION) in iscsit_close_connection()
4204 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4206 atomic_set(&conn->conn_logout_remove, 0); in iscsit_close_connection()
4212 list_del(&conn->conn_list); in iscsit_close_connection()
4219 if (atomic_read(&conn->connection_recovery)) in iscsit_close_connection()
4220 iscsit_build_conn_drop_async_message(conn); in iscsit_close_connection()
4229 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4230 if (atomic_read(&conn->sleep_on_conn_wait_comp)) { in iscsit_close_connection()
4231 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4232 complete(&conn->conn_wait_comp); in iscsit_close_connection()
4233 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4234 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4243 if (atomic_read(&conn->connection_wait_rcfr)) { in iscsit_close_connection()
4244 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4245 complete(&conn->conn_wait_rcfr_comp); in iscsit_close_connection()
4246 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4247 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4249 atomic_set(&conn->connection_reinstatement, 1); in iscsit_close_connection()
4250 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4256 iscsit_check_conn_usage_count(conn); in iscsit_close_connection()
4258 ahash_request_free(conn->conn_tx_hash); in iscsit_close_connection()
4259 if (conn->conn_rx_hash) { in iscsit_close_connection()
4262 tfm = crypto_ahash_reqtfm(conn->conn_rx_hash); in iscsit_close_connection()
4263 ahash_request_free(conn->conn_rx_hash); in iscsit_close_connection()
4267 if (conn->sock) in iscsit_close_connection()
4268 sock_release(conn->sock); in iscsit_close_connection()
4270 if (conn->conn_transport->iscsit_free_conn) in iscsit_close_connection()
4271 conn->conn_transport->iscsit_free_conn(conn); in iscsit_close_connection()
4274 conn->conn_state = TARG_CONN_STATE_FREE; in iscsit_close_connection()
4275 iscsit_free_conn(conn); in iscsit_close_connection()
4440 struct iscsi_conn *conn) in iscsit_logout_post_handler_closesession() argument
4442 struct iscsi_session *sess = conn->sess; in iscsit_logout_post_handler_closesession()
4453 if (!conn->conn_transport->rdma_shutdown) { in iscsit_logout_post_handler_closesession()
4454 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_closesession()
4459 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_closesession()
4460 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_closesession()
4462 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_closesession()
4469 struct iscsi_conn *conn) in iscsit_logout_post_handler_samecid() argument
4473 if (!conn->conn_transport->rdma_shutdown) { in iscsit_logout_post_handler_samecid()
4474 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_samecid()
4479 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_samecid()
4480 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_samecid()
4482 iscsit_cause_connection_reinstatement(conn, sleep); in iscsit_logout_post_handler_samecid()
4483 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_samecid()
4487 struct iscsi_conn *conn, in iscsit_logout_post_handler_diffcid() argument
4491 struct iscsi_session *sess = conn->sess; in iscsit_logout_post_handler_diffcid()
4527 struct iscsi_conn *conn) in iscsit_logout_post_handler() argument
4537 iscsit_logout_post_handler_closesession(conn); in iscsit_logout_post_handler()
4542 if (conn->cid == cmd->logout_cid) { in iscsit_logout_post_handler()
4547 iscsit_logout_post_handler_samecid(conn); in iscsit_logout_post_handler()
4553 iscsit_logout_post_handler_diffcid(conn, in iscsit_logout_post_handler()
4585 struct iscsi_conn *conn; in iscsit_fail_session() local
4588 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) { in iscsit_fail_session()
4590 conn->conn_state = TARG_CONN_STATE_CLEANUP_WAIT; in iscsit_fail_session()
4604 struct iscsi_conn *conn, *conn_tmp = NULL; in iscsit_stop_session() local
4610 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, in iscsit_stop_session()
4615 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { in iscsit_stop_session()
4621 iscsit_inc_conn_usage_count(conn); in iscsit_stop_session()
4624 iscsit_cause_connection_reinstatement(conn, 1); in iscsit_stop_session()
4627 iscsit_dec_conn_usage_count(conn); in iscsit_stop_session()
4633 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) in iscsit_stop_session()
4634 iscsit_cause_connection_reinstatement(conn, 0); in iscsit_stop_session()