Lines Matching refs:conn
484 static int iscsit_queue_rsp(struct iscsi_conn *conn, struct iscsi_cmd *cmd) in iscsit_queue_rsp() argument
486 iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); in iscsit_queue_rsp()
490 static void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd) in iscsit_aborted_task() argument
494 spin_lock_bh(&conn->cmd_lock); in iscsit_aborted_task()
497 spin_unlock_bh(&conn->cmd_lock); in iscsit_aborted_task()
502 static enum target_prot_op iscsit_get_sup_prot_ops(struct iscsi_conn *conn) in iscsit_get_sup_prot_ops() argument
638 struct iscsi_conn *conn, in iscsit_add_reject() argument
644 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsit_add_reject()
658 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject()
659 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject()
660 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject()
663 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject()
674 struct iscsi_conn *conn; in iscsit_add_reject_from_cmd() local
676 if (!cmd->conn) { in iscsit_add_reject_from_cmd()
681 conn = cmd->conn; in iscsit_add_reject_from_cmd()
694 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
695 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject_from_cmd()
696 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
700 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject_from_cmd()
774 static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn) in iscsit_ack_from_expstatsn() argument
779 conn->exp_statsn = exp_statsn; in iscsit_ack_from_expstatsn()
781 if (conn->sess->sess_ops->RDMAExtensions) in iscsit_ack_from_expstatsn()
784 spin_lock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
785 list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) { in iscsit_ack_from_expstatsn()
796 spin_unlock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
820 int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_scsi_cmd() argument
828 atomic_long_inc(&conn->sess->cmd_pdus); in iscsit_setup_scsi_cmd()
886 if (payload_length && !conn->sess->sess_ops->ImmediateData) { in iscsit_setup_scsi_cmd()
910 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_scsi_cmd()
913 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_scsi_cmd()
918 if (payload_length > conn->sess->sess_ops->FirstBurstLength) { in iscsit_setup_scsi_cmd()
921 payload_length, conn->sess->sess_ops->FirstBurstLength); in iscsit_setup_scsi_cmd()
959 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_scsi_cmd()
961 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_setup_scsi_cmd()
968 if (!conn->sess->sess_ops->RDMAExtensions && in iscsit_setup_scsi_cmd()
984 conn->sess->se_sess, be32_to_cpu(hdr->data_length), in iscsit_setup_scsi_cmd()
991 conn->cid); in iscsit_setup_scsi_cmd()
1018 spin_lock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1019 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_setup_scsi_cmd()
1020 spin_unlock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1036 iscsit_start_dataout_timer(cmd, cmd->conn); in iscsit_set_unsoliticed_dataout()
1041 int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_scsi_cmd() argument
1056 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_scsi_cmd()
1066 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_scsi_cmd()
1124 cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, in iscsit_get_immediate_data()
1132 rc = iscsit_dump_data_payload(cmd->conn, in iscsit_get_immediate_data()
1152 iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, cmd->i_state); in iscsit_get_immediate_data()
1160 iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_scsi_cmd() argument
1167 rc = iscsit_setup_scsi_cmd(conn, cmd, buf); in iscsit_handle_scsi_cmd()
1180 rc = iscsit_process_scsi_cmd(conn, cmd, hdr); in iscsit_handle_scsi_cmd()
1254 iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf, in iscsit_check_dataout_hdr() argument
1269 atomic_long_add(payload_length, &conn->sess->rx_data_octets); in iscsit_check_dataout_hdr()
1271 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_check_dataout_hdr()
1274 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_check_dataout_hdr()
1275 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_check_dataout_hdr()
1279 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, in iscsit_check_dataout_hdr()
1287 payload_length, conn->cid); in iscsit_check_dataout_hdr()
1293 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1299 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1314 if (conn->sess->sess_ops->InitialR2T) { in iscsit_check_dataout_hdr()
1343 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1364 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1383 iscsit_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_get_dataout() argument
1409 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1415 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_get_dataout()
1422 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1425 data_crc = iscsit_do_crypto_hash_sg(&conn->conn_rx_hash, cmd, in iscsit_get_dataout()
1451 struct iscsi_conn *conn = cmd->conn; in iscsit_check_dataout_payload() local
1462 conn->conn_transport->iscsit_get_dataout(conn, cmd, false); in iscsit_check_dataout_payload()
1486 static int iscsit_handle_data_out(struct iscsi_conn *conn, unsigned char *buf) in iscsit_handle_data_out() argument
1493 rc = iscsit_check_dataout_hdr(conn, buf, &cmd); in iscsit_handle_data_out()
1499 rc = iscsit_get_dataout(conn, cmd, hdr); in iscsit_handle_data_out()
1508 int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_nop_out() argument
1516 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1527 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1534 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_nop_out()
1538 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_nop_out()
1540 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1564 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_nop_out()
1575 int iscsit_process_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_nop_out() argument
1585 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_process_nop_out()
1588 spin_lock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1589 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_nop_out()
1590 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1592 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_nop_out()
1595 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_process_nop_out()
1600 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_nop_out()
1613 cmd_p = iscsit_find_cmd_from_ttt(conn, be32_to_cpu(hdr->ttt)); in iscsit_process_nop_out()
1617 iscsit_stop_nopin_response_timer(conn); in iscsit_process_nop_out()
1620 iscsit_add_cmd_to_immediate_queue(cmd_p, conn, cmd_p->i_state); in iscsit_process_nop_out()
1622 iscsit_start_nopin_timer(conn); in iscsit_process_nop_out()
1633 static int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_nop_out() argument
1642 ret = iscsit_setup_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1672 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1678 rx_got = rx_data(conn, &cmd->iov_misc[0], niov, rx_size); in iscsit_handle_nop_out()
1684 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1685 iscsit_do_crypto_hash_buf(&conn->conn_rx_hash, in iscsit_handle_nop_out()
1694 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_nop_out()
1730 return iscsit_process_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1740 iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_task_mgt_cmd() argument
1757 hdr->rtt, hdr->refcmdsn, conn->cid); in iscsit_handle_task_mgt_cmd()
1799 conn->sess->se_sess, 0, DMA_NONE, in iscsit_handle_task_mgt_cmd()
1876 if (iscsit_tmr_task_warm_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
1882 if (iscsit_tmr_task_cold_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
1896 if (iscsit_check_task_reassign_expdatasn(tmr_req, conn) < 0) in iscsit_handle_task_mgt_cmd()
1911 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
1912 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_task_mgt_cmd()
1913 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
1916 int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_task_mgt_cmd()
1924 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_task_mgt_cmd()
1947 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_handle_task_mgt_cmd()
1954 iscsit_setup_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_text_cmd() argument
1959 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_text_cmd()
1962 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_text_cmd()
1981 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_text_cmd()
1993 iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_text_cmd() argument
2029 spin_lock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2030 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_text_cmd()
2031 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2034 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_text_cmd()
2037 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_text_cmd()
2054 iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_text_cmd() argument
2062 rc = iscsit_setup_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2093 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2099 rx_got = rx_data(conn, &iov[0], niov, rx_size); in iscsit_handle_text_cmd()
2103 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2104 iscsit_do_crypto_hash_buf(&conn->conn_rx_hash, in iscsit_handle_text_cmd()
2113 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_text_cmd()
2140 return iscsit_process_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2148 int iscsit_logout_closesession(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_closesession() argument
2151 struct iscsi_session *sess = conn->sess; in iscsit_logout_closesession()
2154 " for SID: %u.\n", conn->cid, conn->sess->sid); in iscsit_logout_closesession()
2157 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closesession()
2158 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_SESSION; in iscsit_logout_closesession()
2160 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closesession()
2173 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closesession()
2178 int iscsit_logout_closeconnection(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_closeconnection() argument
2181 struct iscsi_session *sess = conn->sess; in iscsit_logout_closeconnection()
2184 " %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_closeconnection()
2190 if (conn->cid == cmd->logout_cid) { in iscsit_logout_closeconnection()
2191 spin_lock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2193 conn->conn_state = TARG_CONN_STATE_IN_LOGOUT; in iscsit_logout_closeconnection()
2195 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closeconnection()
2196 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_CONNECTION; in iscsit_logout_closeconnection()
2197 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closeconnection()
2199 spin_unlock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2213 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_logout_closeconnection()
2221 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closeconnection()
2226 int iscsit_logout_removeconnforrecovery(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_removeconnforrecovery() argument
2228 struct iscsi_session *sess = conn->sess; in iscsit_logout_removeconnforrecovery()
2231 " CID: %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2237 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2241 if (conn->cid == cmd->logout_cid) { in iscsit_logout_removeconnforrecovery()
2244 cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2246 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2250 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2256 iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_logout_cmd() argument
2262 struct iscsi_tiqn *tiqn = iscsit_snmp_get_tiqn(conn); in iscsit_handle_logout_cmd()
2279 hdr->cid, conn->cid); in iscsit_handle_logout_cmd()
2281 if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) { in iscsit_handle_logout_cmd()
2291 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_handle_logout_cmd()
2305 be16_to_cpu(hdr->cid) == conn->cid)) in iscsit_handle_logout_cmd()
2308 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2309 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_logout_cmd()
2310 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2313 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_logout_cmd()
2325 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_logout_cmd()
2337 struct iscsi_conn *conn, in iscsit_handle_snack() argument
2348 hdr->begrun, hdr->runlength, conn->cid); in iscsit_handle_snack()
2350 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_snack()
2353 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2362 return iscsit_handle_recovery_datain_or_r2t(conn, buf, in iscsit_handle_snack()
2368 return iscsit_handle_status_snack(conn, hdr->itt, in iscsit_handle_snack()
2372 return iscsit_handle_data_ack(conn, be32_to_cpu(hdr->ttt), in iscsit_handle_snack()
2378 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2383 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2390 static void iscsit_rx_thread_wait_for_tcp(struct iscsi_conn *conn) in iscsit_rx_thread_wait_for_tcp() argument
2392 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_rx_thread_wait_for_tcp()
2393 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_rx_thread_wait_for_tcp()
2395 &conn->rx_half_close_comp, in iscsit_rx_thread_wait_for_tcp()
2407 struct iscsi_conn *conn = cmd->conn; in iscsit_handle_immediate_data() local
2425 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2431 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_handle_immediate_data()
2436 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_handle_immediate_data()
2440 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2443 data_crc = iscsit_do_crypto_hash_sg(&conn->conn_rx_hash, cmd, in iscsit_handle_immediate_data()
2452 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_immediate_data()
2490 static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) in iscsit_build_conn_drop_async_message() argument
2500 list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { in iscsit_build_conn_drop_async_message()
2517 cmd->logout_cid = conn->cid; in iscsit_build_conn_drop_async_message()
2531 struct iscsi_conn *conn) in iscsit_send_conn_drop_async_message() argument
2544 cmd->stat_sn = conn->stat_sn++; in iscsit_send_conn_drop_async_message()
2546 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_conn_drop_async_message()
2547 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_send_conn_drop_async_message()
2550 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait); in iscsit_send_conn_drop_async_message()
2551 hdr->param3 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Retain); in iscsit_send_conn_drop_async_message()
2553 if (conn->conn_ops->HeaderDigest) { in iscsit_send_conn_drop_async_message()
2556 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_conn_drop_async_message()
2570 cmd->logout_cid, conn->cid); in iscsit_send_conn_drop_async_message()
2574 static void iscsit_tx_thread_wait_for_tcp(struct iscsi_conn *conn) in iscsit_tx_thread_wait_for_tcp() argument
2576 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_tx_thread_wait_for_tcp()
2577 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_tx_thread_wait_for_tcp()
2579 &conn->tx_half_close_comp, in iscsit_tx_thread_wait_for_tcp()
2585 iscsit_build_datain_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_datain_pdu() argument
2618 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_datain_pdu()
2619 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_datain_pdu()
2626 ntohl(hdr->offset), datain->length, conn->cid); in iscsit_build_datain_pdu()
2629 static int iscsit_send_datain(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_datain() argument
2657 atomic_long_add(datain.length, &conn->sess->tx_data_octets); in iscsit_send_datain()
2668 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_send_datain()
2669 cmd->stat_sn = conn->stat_sn++; in iscsit_send_datain()
2676 iscsit_build_datain_pdu(cmd, conn, &datain, hdr, set_statsn); in iscsit_send_datain()
2683 if (conn->conn_ops->HeaderDigest) { in iscsit_send_datain()
2686 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, cmd->pdu, in iscsit_send_datain()
2713 if (conn->conn_ops->DataDigest) { in iscsit_send_datain()
2714 cmd->data_crc = iscsit_do_crypto_hash_sg(&conn->conn_tx_hash, cmd, in iscsit_send_datain()
2728 ret = iscsit_fe_sendpage_sg(cmd, conn); in iscsit_send_datain()
2733 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_send_datain()
2747 iscsit_build_logout_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_logout_rsp() argument
2752 struct iscsi_session *sess = conn->sess; in iscsit_build_logout_rsp()
2780 " successful.\n", cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2799 conn->sess, cmd->logout_cid); in iscsit_build_logout_rsp()
2812 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2825 cmd->stat_sn = conn->stat_sn++; in iscsit_build_logout_rsp()
2828 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_logout_rsp()
2829 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_logout_rsp()
2830 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_logout_rsp()
2835 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2842 iscsit_send_logout(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_logout() argument
2847 rc = iscsit_build_logout_rsp(cmd, conn, in iscsit_send_logout()
2857 if (conn->conn_ops->HeaderDigest) { in iscsit_send_logout()
2860 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, &cmd->pdu[0], in iscsit_send_logout()
2875 iscsit_build_nopin_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_nopin_rsp() argument
2885 cmd->stat_sn = (nopout_response) ? conn->stat_sn++ : in iscsit_build_nopin_rsp()
2886 conn->stat_sn; in iscsit_build_nopin_rsp()
2890 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_nopin_rsp()
2892 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_nopin_rsp()
2893 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_nopin_rsp()
2907 struct iscsi_conn *conn, in iscsit_send_unsolicited_nopin() argument
2913 iscsit_build_nopin_rsp(cmd, conn, hdr, false); in iscsit_send_unsolicited_nopin()
2915 if (conn->conn_ops->HeaderDigest) { in iscsit_send_unsolicited_nopin()
2918 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_unsolicited_nopin()
2932 " 0x%08x CID: %hu\n", hdr->ttt, cmd->stat_sn, conn->cid); in iscsit_send_unsolicited_nopin()
2934 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_send_unsolicited_nopin()
2936 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_send_unsolicited_nopin()
2949 iscsit_send_nopin(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_nopin() argument
2956 iscsit_build_nopin_rsp(cmd, conn, hdr, true); in iscsit_send_nopin()
2963 if (conn->conn_ops->HeaderDigest) { in iscsit_send_nopin()
2966 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_nopin()
2995 if (conn->conn_ops->DataDigest) { in iscsit_send_nopin()
2996 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, in iscsit_send_nopin()
3018 struct iscsi_conn *conn) in iscsit_send_r2t() argument
3036 r2t->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_send_r2t()
3038 hdr->statsn = cpu_to_be32(conn->stat_sn); in iscsit_send_r2t()
3039 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_r2t()
3040 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_send_r2t()
3049 if (conn->conn_ops->HeaderDigest) { in iscsit_send_r2t()
3052 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_r2t()
3065 r2t->offset, r2t->xfer_len, conn->cid); in iscsit_send_r2t()
3074 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_send_r2t()
3076 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_send_r2t()
3081 iscsit_start_dataout_timer(cmd, conn); in iscsit_send_r2t()
3092 struct iscsi_conn *conn, in iscsit_build_r2ts_for_cmd() argument
3105 if (conn->sess->sess_ops->DataSequenceInOrder && in iscsit_build_r2ts_for_cmd()
3109 while (cmd->outstanding_r2ts < conn->sess->sess_ops->MaxOutstandingR2T) { in iscsit_build_r2ts_for_cmd()
3110 if (conn->sess->sess_ops->DataSequenceInOrder) { in iscsit_build_r2ts_for_cmd()
3115 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3122 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3126 conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3131 xfer_len = conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3168 void iscsit_build_rsp_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_rsp_pdu() argument
3172 cmd->stat_sn = conn->stat_sn++; in iscsit_build_rsp_pdu()
3174 atomic_long_inc(&conn->sess->rsp_pdus); in iscsit_build_rsp_pdu()
3191 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_rsp_pdu()
3192 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_rsp_pdu()
3193 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_rsp_pdu()
3198 cmd->se_cmd.scsi_status, conn->cid); in iscsit_build_rsp_pdu()
3202 static int iscsit_send_response(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_response() argument
3210 iscsit_build_rsp_pdu(cmd, conn, inc_stat_sn, hdr); in iscsit_send_response()
3241 if (conn->conn_ops->DataDigest) { in iscsit_send_response()
3242 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, in iscsit_send_response()
3262 if (conn->conn_ops->HeaderDigest) { in iscsit_send_response()
3265 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, cmd->pdu, in iscsit_send_response()
3298 iscsit_build_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_task_mgt_rsp() argument
3307 cmd->stat_sn = conn->stat_sn++; in iscsit_build_task_mgt_rsp()
3310 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_task_mgt_rsp()
3311 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_task_mgt_rsp()
3312 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_task_mgt_rsp()
3316 cmd->init_task_tag, cmd->stat_sn, hdr->response, conn->cid); in iscsit_build_task_mgt_rsp()
3321 iscsit_send_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_task_mgt_rsp() argument
3326 iscsit_build_task_mgt_rsp(cmd, conn, hdr); in iscsit_send_task_mgt_rsp()
3332 if (conn->conn_ops->HeaderDigest) { in iscsit_send_task_mgt_rsp()
3335 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_task_mgt_rsp()
3382 struct iscsi_conn *conn = cmd->conn; in iscsit_build_sendtargets_response() local
3392 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength, in iscsit_build_sendtargets_response()
3439 cmd->conn->sess->sess_ops->InitiatorName))) { in iscsit_build_sendtargets_response()
3484 sockaddr = &conn->local_sockaddr; in iscsit_build_sendtargets_response()
3530 iscsit_build_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_text_rsp() argument
3549 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_build_text_rsp()
3556 cmd->stat_sn = conn->stat_sn++; in iscsit_build_text_rsp()
3559 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_text_rsp()
3566 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_text_rsp()
3567 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_text_rsp()
3571 cmd->targ_xfer_tag, cmd->stat_sn, text_length, conn->cid, in iscsit_build_text_rsp()
3581 struct iscsi_conn *conn) in iscsit_send_text_rsp() argument
3588 rc = iscsit_build_text_rsp(cmd, conn, hdr, ISCSI_TCP); in iscsit_send_text_rsp()
3601 if (conn->conn_ops->HeaderDigest) { in iscsit_send_text_rsp()
3604 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_text_rsp()
3613 if (conn->conn_ops->DataDigest) { in iscsit_send_text_rsp()
3614 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, in iscsit_send_text_rsp()
3634 iscsit_build_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_reject() argument
3642 cmd->stat_sn = conn->stat_sn++; in iscsit_build_reject()
3644 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_reject()
3645 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn)); in iscsit_build_reject()
3652 struct iscsi_conn *conn) in iscsit_send_reject() argument
3658 iscsit_build_reject(cmd, conn, hdr); in iscsit_send_reject()
3668 if (conn->conn_ops->HeaderDigest) { in iscsit_send_reject()
3671 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_reject()
3680 if (conn->conn_ops->DataDigest) { in iscsit_send_reject()
3681 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, cmd->buf_ptr, in iscsit_send_reject()
3695 " CID: %hu\n", ntohl(hdr->statsn), hdr->reason, conn->cid); in iscsit_send_reject()
3700 void iscsit_thread_get_cpumask(struct iscsi_conn *conn) in iscsit_thread_get_cpumask() argument
3711 ord = conn->bitmap_id % cpumask_weight(cpu_online_mask); in iscsit_thread_get_cpumask()
3714 cpumask_set_cpu(cpu, conn->conn_cpumask); in iscsit_thread_get_cpumask()
3722 cpumask_setall(conn->conn_cpumask); in iscsit_thread_get_cpumask()
3726 struct iscsi_conn *conn, in iscsit_thread_check_cpumask() argument
3735 if (!conn->conn_tx_reset_cpumask) in iscsit_thread_check_cpumask()
3737 conn->conn_tx_reset_cpumask = 0; in iscsit_thread_check_cpumask()
3739 if (!conn->conn_rx_reset_cpumask) in iscsit_thread_check_cpumask()
3741 conn->conn_rx_reset_cpumask = 0; in iscsit_thread_check_cpumask()
3748 set_cpus_allowed_ptr(p, conn->conn_cpumask); in iscsit_thread_check_cpumask()
3752 iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) in iscsit_immediate_queue() argument
3758 ret = iscsit_send_r2t(cmd, conn); in iscsit_immediate_queue()
3763 spin_lock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3765 spin_unlock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3770 iscsit_mod_nopin_response_timer(conn); in iscsit_immediate_queue()
3771 ret = iscsit_send_unsolicited_nopin(cmd, conn, 1); in iscsit_immediate_queue()
3776 ret = iscsit_send_unsolicited_nopin(cmd, conn, 0); in iscsit_immediate_queue()
3784 conn->cid); in iscsit_immediate_queue()
3795 iscsit_handle_immediate_queue(struct iscsi_conn *conn) in iscsit_handle_immediate_queue() argument
3797 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_immediate_queue()
3803 while ((qr = iscsit_get_cmd_from_immediate_queue(conn))) { in iscsit_handle_immediate_queue()
3804 atomic_set(&conn->check_immediate_queue, 0); in iscsit_handle_immediate_queue()
3809 ret = t->iscsit_immediate_queue(conn, cmd, state); in iscsit_handle_immediate_queue()
3818 iscsit_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) in iscsit_response_queue() argument
3825 ret = iscsit_send_datain(cmd, conn); in iscsit_response_queue()
3837 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3854 ret = iscsit_send_response(cmd, conn); in iscsit_response_queue()
3857 ret = iscsit_send_logout(cmd, conn); in iscsit_response_queue()
3861 cmd, conn); in iscsit_response_queue()
3864 ret = iscsit_send_nopin(cmd, conn); in iscsit_response_queue()
3867 ret = iscsit_send_reject(cmd, conn); in iscsit_response_queue()
3870 ret = iscsit_send_task_mgt_rsp(cmd, conn); in iscsit_response_queue()
3873 ret = iscsit_tmr_post_handler(cmd, conn); in iscsit_response_queue()
3875 iscsit_fall_back_to_erl0(conn->sess); in iscsit_response_queue()
3878 ret = iscsit_send_text_rsp(cmd, conn); in iscsit_response_queue()
3884 state, conn->cid); in iscsit_response_queue()
3890 if (iscsit_send_tx_data(cmd, conn, 1) < 0) { in iscsit_response_queue()
3891 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_response_queue()
3899 if (!iscsit_logout_post_handler(cmd, conn)) in iscsit_response_queue()
3917 cmd->i_state, conn->cid); in iscsit_response_queue()
3921 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3930 static int iscsit_handle_response_queue(struct iscsi_conn *conn) in iscsit_handle_response_queue() argument
3932 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_response_queue()
3938 while ((qr = iscsit_get_cmd_from_response_queue(conn))) { in iscsit_handle_response_queue()
3943 ret = t->iscsit_response_queue(conn, cmd, state); in iscsit_handle_response_queue()
3954 struct iscsi_conn *conn = arg; in iscsi_target_tx_thread() local
3966 iscsit_thread_check_cpumask(conn, current, 1); in iscsi_target_tx_thread()
3968 wait_event_interruptible(conn->queues_wq, in iscsi_target_tx_thread()
3969 !iscsit_conn_all_queues_empty(conn)); in iscsi_target_tx_thread()
3975 ret = iscsit_handle_immediate_queue(conn); in iscsi_target_tx_thread()
3979 ret = iscsit_handle_response_queue(conn); in iscsi_target_tx_thread()
3994 if (conn->conn_state != TARG_CONN_STATE_IN_LOGIN) in iscsi_target_tx_thread()
3995 iscsit_take_action_for_connection_exit(conn); in iscsi_target_tx_thread()
4000 static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) in iscsi_target_rx_opcode() argument
4008 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4012 ret = iscsit_handle_scsi_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4015 ret = iscsit_handle_data_out(conn, buf); in iscsi_target_rx_opcode()
4020 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4024 ret = iscsit_handle_nop_out(conn, cmd, buf); in iscsi_target_rx_opcode()
4027 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4031 ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4035 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt); in iscsi_target_rx_opcode()
4039 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4044 ret = iscsit_handle_text_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4047 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4051 ret = iscsit_handle_logout_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4053 wait_for_completion_timeout(&conn->conn_logout_comp, in iscsi_target_rx_opcode()
4057 ret = iscsit_handle_snack(conn, buf); in iscsi_target_rx_opcode()
4061 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsi_target_rx_opcode()
4074 return iscsit_add_reject(conn, ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); in iscsi_target_rx_opcode()
4077 static bool iscsi_target_check_conn_state(struct iscsi_conn *conn) in iscsi_target_check_conn_state() argument
4081 spin_lock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
4082 ret = (conn->conn_state != TARG_CONN_STATE_LOGGED_IN); in iscsi_target_check_conn_state()
4083 spin_unlock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
4093 struct iscsi_conn *conn = arg; in iscsi_target_rx_thread() local
4104 rc = wait_for_completion_interruptible(&conn->rx_login_comp); in iscsi_target_rx_thread()
4105 if (rc < 0 || iscsi_target_check_conn_state(conn)) in iscsi_target_rx_thread()
4108 if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) { in iscsi_target_rx_thread()
4124 iscsit_thread_check_cpumask(conn, current, 0); in iscsi_target_rx_thread()
4132 ret = rx_data(conn, &iov, 1, ISCSI_HDR_LEN); in iscsi_target_rx_thread()
4134 iscsit_rx_thread_wait_for_tcp(conn); in iscsi_target_rx_thread()
4138 if (conn->conn_ops->HeaderDigest) { in iscsi_target_rx_thread()
4142 ret = rx_data(conn, &iov, 1, ISCSI_CRC_LEN); in iscsi_target_rx_thread()
4144 iscsit_rx_thread_wait_for_tcp(conn); in iscsi_target_rx_thread()
4148 iscsit_do_crypto_hash_buf(&conn->conn_rx_hash, in iscsi_target_rx_thread()
4161 atomic_long_inc(&conn->sess->conn_digest_errors); in iscsi_target_rx_thread()
4168 if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT) in iscsi_target_rx_thread()
4173 if (conn->sess->sess_ops->SessionType && in iscsi_target_rx_thread()
4178 iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsi_target_rx_thread()
4183 ret = iscsi_target_rx_opcode(conn, buffer); in iscsi_target_rx_thread()
4190 atomic_set(&conn->transport_failed, 1); in iscsi_target_rx_thread()
4191 iscsit_take_action_for_connection_exit(conn); in iscsi_target_rx_thread()
4195 static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) in iscsit_release_commands_from_conn() argument
4198 struct iscsi_session *sess = conn->sess; in iscsit_release_commands_from_conn()
4204 spin_lock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4205 list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { in iscsit_release_commands_from_conn()
4208 spin_unlock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4214 spin_lock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4216 spin_unlock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4220 struct iscsi_conn *conn) in iscsit_stop_timers_for_cmds() argument
4224 spin_lock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4225 list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) { in iscsit_stop_timers_for_cmds()
4229 spin_unlock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4233 struct iscsi_conn *conn) in iscsit_close_connection() argument
4235 int conn_logout = (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT); in iscsit_close_connection()
4236 struct iscsi_session *sess = conn->sess; in iscsit_close_connection()
4239 " %u\n", conn->cid, sess->sid); in iscsit_close_connection()
4250 if (conn->conn_transport->transport_type == ISCSI_TCP) in iscsit_close_connection()
4251 complete(&conn->conn_logout_comp); in iscsit_close_connection()
4254 if (conn->tx_thread && in iscsit_close_connection()
4255 cmpxchg(&conn->tx_thread_active, true, false)) { in iscsit_close_connection()
4256 send_sig(SIGINT, conn->tx_thread, 1); in iscsit_close_connection()
4257 kthread_stop(conn->tx_thread); in iscsit_close_connection()
4260 if (conn->rx_thread && in iscsit_close_connection()
4261 cmpxchg(&conn->rx_thread_active, true, false)) { in iscsit_close_connection()
4262 send_sig(SIGINT, conn->rx_thread, 1); in iscsit_close_connection()
4263 kthread_stop(conn->rx_thread); in iscsit_close_connection()
4268 bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, in iscsit_close_connection()
4272 iscsit_stop_timers_for_cmds(conn); in iscsit_close_connection()
4273 iscsit_stop_nopin_response_timer(conn); in iscsit_close_connection()
4274 iscsit_stop_nopin_timer(conn); in iscsit_close_connection()
4276 if (conn->conn_transport->iscsit_wait_conn) in iscsit_close_connection()
4277 conn->conn_transport->iscsit_wait_conn(conn); in iscsit_close_connection()
4288 if (atomic_read(&conn->connection_recovery)) { in iscsit_close_connection()
4289 iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4290 iscsit_prepare_cmds_for_realligance(conn); in iscsit_close_connection()
4292 iscsit_clear_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4293 iscsit_release_commands_from_conn(conn); in iscsit_close_connection()
4295 iscsit_free_queue_reqs_for_conn(conn); in iscsit_close_connection()
4302 if (atomic_read(&conn->conn_logout_remove)) { in iscsit_close_connection()
4303 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_SESSION) { in iscsit_close_connection()
4304 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4307 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_CONNECTION) in iscsit_close_connection()
4308 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4310 atomic_set(&conn->conn_logout_remove, 0); in iscsit_close_connection()
4316 list_del(&conn->conn_list); in iscsit_close_connection()
4323 if (atomic_read(&conn->connection_recovery)) in iscsit_close_connection()
4324 iscsit_build_conn_drop_async_message(conn); in iscsit_close_connection()
4333 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4334 if (atomic_read(&conn->sleep_on_conn_wait_comp)) { in iscsit_close_connection()
4335 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4336 complete(&conn->conn_wait_comp); in iscsit_close_connection()
4337 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4338 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4347 if (atomic_read(&conn->connection_wait_rcfr)) { in iscsit_close_connection()
4348 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4349 complete(&conn->conn_wait_rcfr_comp); in iscsit_close_connection()
4350 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4351 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4353 atomic_set(&conn->connection_reinstatement, 1); in iscsit_close_connection()
4354 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4360 iscsit_check_conn_usage_count(conn); in iscsit_close_connection()
4362 if (conn->conn_rx_hash.tfm) in iscsit_close_connection()
4363 crypto_free_hash(conn->conn_rx_hash.tfm); in iscsit_close_connection()
4364 if (conn->conn_tx_hash.tfm) in iscsit_close_connection()
4365 crypto_free_hash(conn->conn_tx_hash.tfm); in iscsit_close_connection()
4367 free_cpumask_var(conn->conn_cpumask); in iscsit_close_connection()
4369 kfree(conn->conn_ops); in iscsit_close_connection()
4370 conn->conn_ops = NULL; in iscsit_close_connection()
4372 if (conn->sock) in iscsit_close_connection()
4373 sock_release(conn->sock); in iscsit_close_connection()
4375 if (conn->conn_transport->iscsit_free_conn) in iscsit_close_connection()
4376 conn->conn_transport->iscsit_free_conn(conn); in iscsit_close_connection()
4378 iscsit_put_transport(conn->conn_transport); in iscsit_close_connection()
4381 conn->conn_state = TARG_CONN_STATE_FREE; in iscsit_close_connection()
4382 kfree(conn); in iscsit_close_connection()
4543 struct iscsi_conn *conn) in iscsit_logout_post_handler_closesession() argument
4545 struct iscsi_session *sess = conn->sess; in iscsit_logout_post_handler_closesession()
4556 if (conn->conn_transport->transport_type == ISCSI_TCP) in iscsit_logout_post_handler_closesession()
4557 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_closesession()
4559 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_closesession()
4560 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_closesession()
4562 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_closesession()
4569 struct iscsi_conn *conn) in iscsit_logout_post_handler_samecid() argument
4573 if (conn->conn_transport->transport_type == ISCSI_TCP) in iscsit_logout_post_handler_samecid()
4574 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_samecid()
4576 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_samecid()
4577 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_samecid()
4579 iscsit_cause_connection_reinstatement(conn, sleep); in iscsit_logout_post_handler_samecid()
4580 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_samecid()
4584 struct iscsi_conn *conn, in iscsit_logout_post_handler_diffcid() argument
4588 struct iscsi_session *sess = conn->sess; in iscsit_logout_post_handler_diffcid()
4624 struct iscsi_conn *conn) in iscsit_logout_post_handler() argument
4634 iscsit_logout_post_handler_closesession(conn); in iscsit_logout_post_handler()
4640 if (conn->cid == cmd->logout_cid) { in iscsit_logout_post_handler()
4645 iscsit_logout_post_handler_samecid(conn); in iscsit_logout_post_handler()
4652 iscsit_logout_post_handler_diffcid(conn, in iscsit_logout_post_handler()
4684 struct iscsi_conn *conn; in iscsit_fail_session() local
4687 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) { in iscsit_fail_session()
4689 conn->conn_state = TARG_CONN_STATE_CLEANUP_WAIT; in iscsit_fail_session()
4700 struct iscsi_conn *conn, *conn_tmp = NULL; in iscsit_free_session() local
4706 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, in iscsit_free_session()
4711 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { in iscsit_free_session()
4717 iscsit_inc_conn_usage_count(conn); in iscsit_free_session()
4720 iscsit_cause_connection_reinstatement(conn, 1); in iscsit_free_session()
4723 iscsit_dec_conn_usage_count(conn); in iscsit_free_session()
4746 struct iscsi_conn *conn, *conn_tmp = NULL; in iscsit_stop_session() local
4754 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, in iscsit_stop_session()
4759 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { in iscsit_stop_session()
4765 iscsit_inc_conn_usage_count(conn); in iscsit_stop_session()
4768 iscsit_cause_connection_reinstatement(conn, 1); in iscsit_stop_session()
4771 iscsit_dec_conn_usage_count(conn); in iscsit_stop_session()
4777 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) in iscsit_stop_session()
4778 iscsit_cause_connection_reinstatement(conn, 0); in iscsit_stop_session()