Lines Matching refs:conn

492 static int iscsit_queue_rsp(struct iscsi_conn *conn, struct iscsi_cmd *cmd)  in iscsit_queue_rsp()  argument
494 iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); in iscsit_queue_rsp()
498 static void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd) in iscsit_aborted_task() argument
502 spin_lock_bh(&conn->cmd_lock); in iscsit_aborted_task()
505 spin_unlock_bh(&conn->cmd_lock); in iscsit_aborted_task()
510 static enum target_prot_op iscsit_get_sup_prot_ops(struct iscsi_conn *conn) in iscsit_get_sup_prot_ops() argument
646 struct iscsi_conn *conn, in iscsit_add_reject() argument
652 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsit_add_reject()
666 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject()
667 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject()
668 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject()
671 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject()
682 struct iscsi_conn *conn; in iscsit_add_reject_from_cmd() local
684 if (!cmd->conn) { in iscsit_add_reject_from_cmd()
689 conn = cmd->conn; in iscsit_add_reject_from_cmd()
702 spin_lock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
703 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject_from_cmd()
704 spin_unlock_bh(&conn->cmd_lock); in iscsit_add_reject_from_cmd()
708 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject_from_cmd()
782 static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn) in iscsit_ack_from_expstatsn() argument
787 conn->exp_statsn = exp_statsn; in iscsit_ack_from_expstatsn()
789 if (conn->sess->sess_ops->RDMAExtensions) in iscsit_ack_from_expstatsn()
792 spin_lock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
793 list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) { in iscsit_ack_from_expstatsn()
804 spin_unlock_bh(&conn->cmd_lock); in iscsit_ack_from_expstatsn()
828 int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_scsi_cmd() argument
836 atomic_long_inc(&conn->sess->cmd_pdus); in iscsit_setup_scsi_cmd()
894 if (payload_length && !conn->sess->sess_ops->ImmediateData) { in iscsit_setup_scsi_cmd()
918 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_scsi_cmd()
921 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_scsi_cmd()
926 if (payload_length > conn->sess->sess_ops->FirstBurstLength) { in iscsit_setup_scsi_cmd()
929 payload_length, conn->sess->sess_ops->FirstBurstLength); in iscsit_setup_scsi_cmd()
967 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_scsi_cmd()
969 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_setup_scsi_cmd()
976 if (!conn->sess->sess_ops->RDMAExtensions && in iscsit_setup_scsi_cmd()
992 conn->sess->se_sess, be32_to_cpu(hdr->data_length), in iscsit_setup_scsi_cmd()
999 conn->cid); in iscsit_setup_scsi_cmd()
1024 spin_lock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1025 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_setup_scsi_cmd()
1026 spin_unlock_bh(&conn->cmd_lock); in iscsit_setup_scsi_cmd()
1042 iscsit_start_dataout_timer(cmd, cmd->conn); in iscsit_set_unsoliticed_dataout()
1047 int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_scsi_cmd() argument
1062 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_scsi_cmd()
1072 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_scsi_cmd()
1130 cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, in iscsit_get_immediate_data()
1138 rc = iscsit_dump_data_payload(cmd->conn, in iscsit_get_immediate_data()
1158 iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, cmd->i_state); in iscsit_get_immediate_data()
1166 iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_scsi_cmd() argument
1173 rc = iscsit_setup_scsi_cmd(conn, cmd, buf); in iscsit_handle_scsi_cmd()
1186 rc = iscsit_process_scsi_cmd(conn, cmd, hdr); in iscsit_handle_scsi_cmd()
1261 iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf, in iscsit_check_dataout_hdr() argument
1276 atomic_long_add(payload_length, &conn->sess->rx_data_octets); in iscsit_check_dataout_hdr()
1278 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_check_dataout_hdr()
1281 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_check_dataout_hdr()
1282 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_check_dataout_hdr()
1286 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, in iscsit_check_dataout_hdr()
1294 payload_length, conn->cid); in iscsit_check_dataout_hdr()
1300 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1306 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1321 if (conn->sess->sess_ops->InitialR2T) { in iscsit_check_dataout_hdr()
1350 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1371 return iscsit_dump_data_payload(conn, payload_length, 1); in iscsit_check_dataout_hdr()
1390 iscsit_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_get_dataout() argument
1416 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1422 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_get_dataout()
1429 if (conn->conn_ops->DataDigest) { in iscsit_get_dataout()
1432 data_crc = iscsit_do_crypto_hash_sg(&conn->conn_rx_hash, cmd, in iscsit_get_dataout()
1458 struct iscsi_conn *conn = cmd->conn; in iscsit_check_dataout_payload() local
1469 conn->conn_transport->iscsit_get_dataout(conn, cmd, false); in iscsit_check_dataout_payload()
1493 static int iscsit_handle_data_out(struct iscsi_conn *conn, unsigned char *buf) in iscsit_handle_data_out() argument
1500 rc = iscsit_check_dataout_hdr(conn, buf, &cmd); in iscsit_handle_data_out()
1506 rc = iscsit_get_dataout(conn, cmd, hdr); in iscsit_handle_data_out()
1515 int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_nop_out() argument
1523 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1534 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1541 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_nop_out()
1545 conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_nop_out()
1547 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1571 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_nop_out()
1582 int iscsit_process_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_nop_out() argument
1592 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_process_nop_out()
1595 spin_lock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1596 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_nop_out()
1597 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_nop_out()
1599 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_nop_out()
1602 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_process_nop_out()
1607 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_nop_out()
1620 cmd_p = iscsit_find_cmd_from_ttt(conn, be32_to_cpu(hdr->ttt)); in iscsit_process_nop_out()
1624 iscsit_stop_nopin_response_timer(conn); in iscsit_process_nop_out()
1627 iscsit_add_cmd_to_immediate_queue(cmd_p, conn, cmd_p->i_state); in iscsit_process_nop_out()
1629 iscsit_start_nopin_timer(conn); in iscsit_process_nop_out()
1640 static int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_nop_out() argument
1649 ret = iscsit_setup_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1679 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1685 rx_got = rx_data(conn, &cmd->iov_misc[0], niov, rx_size); in iscsit_handle_nop_out()
1691 if (conn->conn_ops->DataDigest) { in iscsit_handle_nop_out()
1692 iscsit_do_crypto_hash_buf(&conn->conn_rx_hash, in iscsit_handle_nop_out()
1701 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_nop_out()
1737 return iscsit_process_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1747 iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_task_mgt_cmd() argument
1764 hdr->rtt, hdr->refcmdsn, conn->cid); in iscsit_handle_task_mgt_cmd()
1806 conn->sess->se_sess, 0, DMA_NONE, in iscsit_handle_task_mgt_cmd()
1883 if (iscsit_tmr_task_warm_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
1889 if (iscsit_tmr_task_cold_reset(conn, tmr_req, buf) < 0) { in iscsit_handle_task_mgt_cmd()
1903 if (iscsit_check_task_reassign_expdatasn(tmr_req, conn) < 0) in iscsit_handle_task_mgt_cmd()
1918 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
1919 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_task_mgt_cmd()
1920 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_task_mgt_cmd()
1923 int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_task_mgt_cmd()
1931 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_task_mgt_cmd()
1954 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_handle_task_mgt_cmd()
1961 iscsit_setup_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_setup_text_cmd() argument
1966 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { in iscsit_setup_text_cmd()
1969 payload_length, conn->conn_ops->MaxXmitDataSegmentLength); in iscsit_setup_text_cmd()
1988 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_text_cmd()
2000 iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_process_text_cmd() argument
2036 spin_lock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2037 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_text_cmd()
2038 spin_unlock_bh(&conn->cmd_lock); in iscsit_process_text_cmd()
2041 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_process_text_cmd()
2044 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_text_cmd()
2061 iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_text_cmd() argument
2069 rc = iscsit_setup_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2100 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2106 rx_got = rx_data(conn, &iov[0], niov, rx_size); in iscsit_handle_text_cmd()
2110 if (conn->conn_ops->DataDigest) { in iscsit_handle_text_cmd()
2111 iscsit_do_crypto_hash_buf(&conn->conn_rx_hash, in iscsit_handle_text_cmd()
2120 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_text_cmd()
2147 return iscsit_process_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2155 int iscsit_logout_closesession(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_closesession() argument
2158 struct iscsi_session *sess = conn->sess; in iscsit_logout_closesession()
2161 " for SID: %u.\n", conn->cid, conn->sess->sid); in iscsit_logout_closesession()
2164 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closesession()
2165 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_SESSION; in iscsit_logout_closesession()
2167 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closesession()
2180 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closesession()
2185 int iscsit_logout_closeconnection(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_closeconnection() argument
2188 struct iscsi_session *sess = conn->sess; in iscsit_logout_closeconnection()
2191 " %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_closeconnection()
2197 if (conn->cid == cmd->logout_cid) { in iscsit_logout_closeconnection()
2198 spin_lock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2200 conn->conn_state = TARG_CONN_STATE_IN_LOGOUT; in iscsit_logout_closeconnection()
2202 atomic_set(&conn->conn_logout_remove, 1); in iscsit_logout_closeconnection()
2203 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_CONNECTION; in iscsit_logout_closeconnection()
2204 iscsit_inc_conn_usage_count(conn); in iscsit_logout_closeconnection()
2206 spin_unlock_bh(&conn->state_lock); in iscsit_logout_closeconnection()
2220 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_logout_closeconnection()
2228 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closeconnection()
2233 int iscsit_logout_removeconnforrecovery(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_logout_removeconnforrecovery() argument
2235 struct iscsi_session *sess = conn->sess; in iscsit_logout_removeconnforrecovery()
2238 " CID: %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2244 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2248 if (conn->cid == cmd->logout_cid) { in iscsit_logout_removeconnforrecovery()
2251 cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2253 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2257 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2263 iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, in iscsit_handle_logout_cmd() argument
2269 struct iscsi_tiqn *tiqn = iscsit_snmp_get_tiqn(conn); in iscsit_handle_logout_cmd()
2286 hdr->cid, conn->cid); in iscsit_handle_logout_cmd()
2288 if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) { in iscsit_handle_logout_cmd()
2298 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_handle_logout_cmd()
2312 be16_to_cpu(hdr->cid) == conn->cid)) in iscsit_handle_logout_cmd()
2315 spin_lock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2316 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_logout_cmd()
2317 spin_unlock_bh(&conn->cmd_lock); in iscsit_handle_logout_cmd()
2320 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); in iscsit_handle_logout_cmd()
2332 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_logout_cmd()
2344 struct iscsi_conn *conn, in iscsit_handle_snack() argument
2355 hdr->begrun, hdr->runlength, conn->cid); in iscsit_handle_snack()
2357 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_snack()
2360 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2369 return iscsit_handle_recovery_datain_or_r2t(conn, buf, in iscsit_handle_snack()
2375 return iscsit_handle_status_snack(conn, hdr->itt, in iscsit_handle_snack()
2379 return iscsit_handle_data_ack(conn, be32_to_cpu(hdr->ttt), in iscsit_handle_snack()
2385 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2390 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_handle_snack()
2397 static void iscsit_rx_thread_wait_for_tcp(struct iscsi_conn *conn) in iscsit_rx_thread_wait_for_tcp() argument
2399 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_rx_thread_wait_for_tcp()
2400 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_rx_thread_wait_for_tcp()
2402 &conn->rx_half_close_comp, in iscsit_rx_thread_wait_for_tcp()
2414 struct iscsi_conn *conn = cmd->conn; in iscsit_handle_immediate_data() local
2432 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2438 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_handle_immediate_data()
2443 iscsit_rx_thread_wait_for_tcp(conn); in iscsit_handle_immediate_data()
2447 if (conn->conn_ops->DataDigest) { in iscsit_handle_immediate_data()
2450 data_crc = iscsit_do_crypto_hash_sg(&conn->conn_rx_hash, cmd, in iscsit_handle_immediate_data()
2459 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsit_handle_immediate_data()
2497 static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) in iscsit_build_conn_drop_async_message() argument
2507 list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { in iscsit_build_conn_drop_async_message()
2524 cmd->logout_cid = conn->cid; in iscsit_build_conn_drop_async_message()
2538 struct iscsi_conn *conn) in iscsit_send_conn_drop_async_message() argument
2551 cmd->stat_sn = conn->stat_sn++; in iscsit_send_conn_drop_async_message()
2553 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_conn_drop_async_message()
2554 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_send_conn_drop_async_message()
2557 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait); in iscsit_send_conn_drop_async_message()
2558 hdr->param3 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Retain); in iscsit_send_conn_drop_async_message()
2560 if (conn->conn_ops->HeaderDigest) { in iscsit_send_conn_drop_async_message()
2563 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_conn_drop_async_message()
2577 cmd->logout_cid, conn->cid); in iscsit_send_conn_drop_async_message()
2581 static void iscsit_tx_thread_wait_for_tcp(struct iscsi_conn *conn) in iscsit_tx_thread_wait_for_tcp() argument
2583 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) || in iscsit_tx_thread_wait_for_tcp()
2584 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) { in iscsit_tx_thread_wait_for_tcp()
2586 &conn->tx_half_close_comp, in iscsit_tx_thread_wait_for_tcp()
2592 iscsit_build_datain_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_datain_pdu() argument
2625 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_datain_pdu()
2626 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_datain_pdu()
2633 ntohl(hdr->offset), datain->length, conn->cid); in iscsit_build_datain_pdu()
2636 static int iscsit_send_datain(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_datain() argument
2664 atomic_long_add(datain.length, &conn->sess->tx_data_octets); in iscsit_send_datain()
2675 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_send_datain()
2676 cmd->stat_sn = conn->stat_sn++; in iscsit_send_datain()
2683 iscsit_build_datain_pdu(cmd, conn, &datain, hdr, set_statsn); in iscsit_send_datain()
2690 if (conn->conn_ops->HeaderDigest) { in iscsit_send_datain()
2693 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, cmd->pdu, in iscsit_send_datain()
2720 if (conn->conn_ops->DataDigest) { in iscsit_send_datain()
2721 cmd->data_crc = iscsit_do_crypto_hash_sg(&conn->conn_tx_hash, cmd, in iscsit_send_datain()
2736 if (!conn->conn_ops->IFMarker) in iscsit_send_datain()
2737 ret = iscsit_fe_sendpage_sg(cmd, conn); in iscsit_send_datain()
2739 ret = iscsit_send_tx_data(cmd, conn, 0); in iscsit_send_datain()
2744 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_send_datain()
2758 iscsit_build_logout_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_logout_rsp() argument
2763 struct iscsi_session *sess = conn->sess; in iscsit_build_logout_rsp()
2791 " successful.\n", cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2810 conn->sess, cmd->logout_cid); in iscsit_build_logout_rsp()
2823 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2836 cmd->stat_sn = conn->stat_sn++; in iscsit_build_logout_rsp()
2839 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_logout_rsp()
2840 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_logout_rsp()
2841 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_logout_rsp()
2846 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2853 iscsit_send_logout(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_logout() argument
2858 rc = iscsit_build_logout_rsp(cmd, conn, in iscsit_send_logout()
2868 if (conn->conn_ops->HeaderDigest) { in iscsit_send_logout()
2871 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, &cmd->pdu[0], in iscsit_send_logout()
2886 iscsit_build_nopin_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_nopin_rsp() argument
2896 cmd->stat_sn = (nopout_response) ? conn->stat_sn++ : in iscsit_build_nopin_rsp()
2897 conn->stat_sn; in iscsit_build_nopin_rsp()
2901 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_nopin_rsp()
2903 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_nopin_rsp()
2904 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_nopin_rsp()
2918 struct iscsi_conn *conn, in iscsit_send_unsolicited_nopin() argument
2924 iscsit_build_nopin_rsp(cmd, conn, hdr, false); in iscsit_send_unsolicited_nopin()
2926 if (conn->conn_ops->HeaderDigest) { in iscsit_send_unsolicited_nopin()
2929 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_unsolicited_nopin()
2943 " 0x%08x CID: %hu\n", hdr->ttt, cmd->stat_sn, conn->cid); in iscsit_send_unsolicited_nopin()
2945 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_send_unsolicited_nopin()
2947 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_send_unsolicited_nopin()
2960 iscsit_send_nopin(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_nopin() argument
2967 iscsit_build_nopin_rsp(cmd, conn, hdr, true); in iscsit_send_nopin()
2974 if (conn->conn_ops->HeaderDigest) { in iscsit_send_nopin()
2977 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_nopin()
3006 if (conn->conn_ops->DataDigest) { in iscsit_send_nopin()
3007 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, in iscsit_send_nopin()
3029 struct iscsi_conn *conn) in iscsit_send_r2t() argument
3047 r2t->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_send_r2t()
3049 hdr->statsn = cpu_to_be32(conn->stat_sn); in iscsit_send_r2t()
3050 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_send_r2t()
3051 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_send_r2t()
3060 if (conn->conn_ops->HeaderDigest) { in iscsit_send_r2t()
3063 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_r2t()
3076 r2t->offset, r2t->xfer_len, conn->cid); in iscsit_send_r2t()
3085 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_send_r2t()
3087 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_send_r2t()
3092 iscsit_start_dataout_timer(cmd, conn); in iscsit_send_r2t()
3103 struct iscsi_conn *conn, in iscsit_build_r2ts_for_cmd() argument
3116 if (conn->sess->sess_ops->DataSequenceInOrder && in iscsit_build_r2ts_for_cmd()
3120 while (cmd->outstanding_r2ts < conn->sess->sess_ops->MaxOutstandingR2T) { in iscsit_build_r2ts_for_cmd()
3121 if (conn->sess->sess_ops->DataSequenceInOrder) { in iscsit_build_r2ts_for_cmd()
3126 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3133 conn->sess->sess_ops->MaxBurstLength - in iscsit_build_r2ts_for_cmd()
3137 conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3142 xfer_len = conn->sess->sess_ops->MaxBurstLength; in iscsit_build_r2ts_for_cmd()
3179 void iscsit_build_rsp_pdu(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_rsp_pdu() argument
3183 cmd->stat_sn = conn->stat_sn++; in iscsit_build_rsp_pdu()
3185 atomic_long_inc(&conn->sess->rsp_pdus); in iscsit_build_rsp_pdu()
3202 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_rsp_pdu()
3203 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_rsp_pdu()
3204 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_rsp_pdu()
3209 cmd->se_cmd.scsi_status, conn->cid); in iscsit_build_rsp_pdu()
3213 static int iscsit_send_response(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_response() argument
3221 iscsit_build_rsp_pdu(cmd, conn, inc_stat_sn, hdr); in iscsit_send_response()
3252 if (conn->conn_ops->DataDigest) { in iscsit_send_response()
3253 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, in iscsit_send_response()
3273 if (conn->conn_ops->HeaderDigest) { in iscsit_send_response()
3276 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, cmd->pdu, in iscsit_send_response()
3309 iscsit_build_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_task_mgt_rsp() argument
3318 cmd->stat_sn = conn->stat_sn++; in iscsit_build_task_mgt_rsp()
3321 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_task_mgt_rsp()
3322 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_task_mgt_rsp()
3323 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_task_mgt_rsp()
3327 cmd->init_task_tag, cmd->stat_sn, hdr->response, conn->cid); in iscsit_build_task_mgt_rsp()
3332 iscsit_send_task_mgt_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn) in iscsit_send_task_mgt_rsp() argument
3337 iscsit_build_task_mgt_rsp(cmd, conn, hdr); in iscsit_send_task_mgt_rsp()
3343 if (conn->conn_ops->HeaderDigest) { in iscsit_send_task_mgt_rsp()
3346 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_task_mgt_rsp()
3393 struct iscsi_conn *conn = cmd->conn; in iscsit_build_sendtargets_response() local
3402 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength, in iscsit_build_sendtargets_response()
3449 cmd->conn->sess->sess_ops->InitiatorName))) { in iscsit_build_sendtargets_response()
3496 conn->local_ip, in iscsit_build_sendtargets_response()
3543 iscsit_build_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_text_rsp() argument
3562 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_build_text_rsp()
3569 cmd->stat_sn = conn->stat_sn++; in iscsit_build_text_rsp()
3572 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_text_rsp()
3579 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_text_rsp()
3580 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_text_rsp()
3584 cmd->targ_xfer_tag, cmd->stat_sn, text_length, conn->cid, in iscsit_build_text_rsp()
3594 struct iscsi_conn *conn) in iscsit_send_text_rsp() argument
3601 rc = iscsit_build_text_rsp(cmd, conn, hdr, ISCSI_TCP); in iscsit_send_text_rsp()
3614 if (conn->conn_ops->HeaderDigest) { in iscsit_send_text_rsp()
3617 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_text_rsp()
3626 if (conn->conn_ops->DataDigest) { in iscsit_send_text_rsp()
3627 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, in iscsit_send_text_rsp()
3647 iscsit_build_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn, in iscsit_build_reject() argument
3655 cmd->stat_sn = conn->stat_sn++; in iscsit_build_reject()
3657 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn); in iscsit_build_reject()
3658 hdr->max_cmdsn = cpu_to_be32(conn->sess->max_cmd_sn); in iscsit_build_reject()
3665 struct iscsi_conn *conn) in iscsit_send_reject() argument
3671 iscsit_build_reject(cmd, conn, hdr); in iscsit_send_reject()
3681 if (conn->conn_ops->HeaderDigest) { in iscsit_send_reject()
3684 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, hdr, in iscsit_send_reject()
3693 if (conn->conn_ops->DataDigest) { in iscsit_send_reject()
3694 iscsit_do_crypto_hash_buf(&conn->conn_tx_hash, cmd->buf_ptr, in iscsit_send_reject()
3708 " CID: %hu\n", ntohl(hdr->statsn), hdr->reason, conn->cid); in iscsit_send_reject()
3713 void iscsit_thread_get_cpumask(struct iscsi_conn *conn) in iscsit_thread_get_cpumask() argument
3724 ord = conn->bitmap_id % cpumask_weight(cpu_online_mask); in iscsit_thread_get_cpumask()
3727 cpumask_set_cpu(cpu, conn->conn_cpumask); in iscsit_thread_get_cpumask()
3735 cpumask_setall(conn->conn_cpumask); in iscsit_thread_get_cpumask()
3739 struct iscsi_conn *conn, in iscsit_thread_check_cpumask() argument
3748 if (!conn->conn_tx_reset_cpumask) in iscsit_thread_check_cpumask()
3750 conn->conn_tx_reset_cpumask = 0; in iscsit_thread_check_cpumask()
3752 if (!conn->conn_rx_reset_cpumask) in iscsit_thread_check_cpumask()
3754 conn->conn_rx_reset_cpumask = 0; in iscsit_thread_check_cpumask()
3761 set_cpus_allowed_ptr(p, conn->conn_cpumask); in iscsit_thread_check_cpumask()
3765 iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) in iscsit_immediate_queue() argument
3771 ret = iscsit_send_r2t(cmd, conn); in iscsit_immediate_queue()
3776 spin_lock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3778 spin_unlock_bh(&conn->cmd_lock); in iscsit_immediate_queue()
3783 iscsit_mod_nopin_response_timer(conn); in iscsit_immediate_queue()
3784 ret = iscsit_send_unsolicited_nopin(cmd, conn, 1); in iscsit_immediate_queue()
3789 ret = iscsit_send_unsolicited_nopin(cmd, conn, 0); in iscsit_immediate_queue()
3797 conn->cid); in iscsit_immediate_queue()
3808 iscsit_handle_immediate_queue(struct iscsi_conn *conn) in iscsit_handle_immediate_queue() argument
3810 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_immediate_queue()
3816 while ((qr = iscsit_get_cmd_from_immediate_queue(conn))) { in iscsit_handle_immediate_queue()
3817 atomic_set(&conn->check_immediate_queue, 0); in iscsit_handle_immediate_queue()
3822 ret = t->iscsit_immediate_queue(conn, cmd, state); in iscsit_handle_immediate_queue()
3831 iscsit_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) in iscsit_response_queue() argument
3838 ret = iscsit_send_datain(cmd, conn); in iscsit_response_queue()
3850 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3867 ret = iscsit_send_response(cmd, conn); in iscsit_response_queue()
3870 ret = iscsit_send_logout(cmd, conn); in iscsit_response_queue()
3874 cmd, conn); in iscsit_response_queue()
3877 ret = iscsit_send_nopin(cmd, conn); in iscsit_response_queue()
3880 ret = iscsit_send_reject(cmd, conn); in iscsit_response_queue()
3883 ret = iscsit_send_task_mgt_rsp(cmd, conn); in iscsit_response_queue()
3886 ret = iscsit_tmr_post_handler(cmd, conn); in iscsit_response_queue()
3888 iscsit_fall_back_to_erl0(conn->sess); in iscsit_response_queue()
3891 ret = iscsit_send_text_rsp(cmd, conn); in iscsit_response_queue()
3897 state, conn->cid); in iscsit_response_queue()
3903 if (iscsit_send_tx_data(cmd, conn, 1) < 0) { in iscsit_response_queue()
3904 iscsit_tx_thread_wait_for_tcp(conn); in iscsit_response_queue()
3912 if (!iscsit_logout_post_handler(cmd, conn)) in iscsit_response_queue()
3930 cmd->i_state, conn->cid); in iscsit_response_queue()
3934 if (atomic_read(&conn->check_immediate_queue)) in iscsit_response_queue()
3943 static int iscsit_handle_response_queue(struct iscsi_conn *conn) in iscsit_handle_response_queue() argument
3945 struct iscsit_transport *t = conn->conn_transport; in iscsit_handle_response_queue()
3951 while ((qr = iscsit_get_cmd_from_response_queue(conn))) { in iscsit_handle_response_queue()
3956 ret = t->iscsit_response_queue(conn, cmd, state); in iscsit_handle_response_queue()
3967 struct iscsi_conn *conn = arg; in iscsi_target_tx_thread() local
3979 iscsit_thread_check_cpumask(conn, current, 1); in iscsi_target_tx_thread()
3981 wait_event_interruptible(conn->queues_wq, in iscsi_target_tx_thread()
3982 !iscsit_conn_all_queues_empty(conn)); in iscsi_target_tx_thread()
3988 ret = iscsit_handle_immediate_queue(conn); in iscsi_target_tx_thread()
3992 ret = iscsit_handle_response_queue(conn); in iscsi_target_tx_thread()
4007 if (conn->conn_state != TARG_CONN_STATE_IN_LOGIN) in iscsi_target_tx_thread()
4008 iscsit_take_action_for_connection_exit(conn); in iscsi_target_tx_thread()
4013 static int iscsi_target_rx_opcode(struct iscsi_conn *conn, unsigned char *buf) in iscsi_target_rx_opcode() argument
4021 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4025 ret = iscsit_handle_scsi_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4028 ret = iscsit_handle_data_out(conn, buf); in iscsi_target_rx_opcode()
4033 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4037 ret = iscsit_handle_nop_out(conn, cmd, buf); in iscsi_target_rx_opcode()
4040 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4044 ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4048 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt); in iscsi_target_rx_opcode()
4052 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4057 ret = iscsit_handle_text_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4060 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4064 ret = iscsit_handle_logout_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4066 wait_for_completion_timeout(&conn->conn_logout_comp, in iscsi_target_rx_opcode()
4070 ret = iscsit_handle_snack(conn, buf); in iscsi_target_rx_opcode()
4074 if (!conn->sess->sess_ops->ErrorRecoveryLevel) { in iscsi_target_rx_opcode()
4079 if (!conn->conn_ops->OFMarker) { in iscsi_target_rx_opcode()
4085 if (iscsit_recover_from_unknown_opcode(conn) < 0) { in iscsi_target_rx_opcode()
4095 return iscsit_add_reject(conn, ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); in iscsi_target_rx_opcode()
4098 static bool iscsi_target_check_conn_state(struct iscsi_conn *conn) in iscsi_target_check_conn_state() argument
4102 spin_lock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
4103 ret = (conn->conn_state != TARG_CONN_STATE_LOGGED_IN); in iscsi_target_check_conn_state()
4104 spin_unlock_bh(&conn->state_lock); in iscsi_target_check_conn_state()
4114 struct iscsi_conn *conn = arg; in iscsi_target_rx_thread() local
4125 rc = wait_for_completion_interruptible(&conn->rx_login_comp); in iscsi_target_rx_thread()
4126 if (rc < 0 || iscsi_target_check_conn_state(conn)) in iscsi_target_rx_thread()
4129 if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) { in iscsi_target_rx_thread()
4145 iscsit_thread_check_cpumask(conn, current, 0); in iscsi_target_rx_thread()
4153 ret = rx_data(conn, &iov, 1, ISCSI_HDR_LEN); in iscsi_target_rx_thread()
4155 iscsit_rx_thread_wait_for_tcp(conn); in iscsi_target_rx_thread()
4159 if (conn->conn_ops->HeaderDigest) { in iscsi_target_rx_thread()
4163 ret = rx_data(conn, &iov, 1, ISCSI_CRC_LEN); in iscsi_target_rx_thread()
4165 iscsit_rx_thread_wait_for_tcp(conn); in iscsi_target_rx_thread()
4169 iscsit_do_crypto_hash_buf(&conn->conn_rx_hash, in iscsi_target_rx_thread()
4182 atomic_long_inc(&conn->sess->conn_digest_errors); in iscsi_target_rx_thread()
4189 if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT) in iscsi_target_rx_thread()
4194 if (conn->sess->sess_ops->SessionType && in iscsi_target_rx_thread()
4199 iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, in iscsi_target_rx_thread()
4204 ret = iscsi_target_rx_opcode(conn, buffer); in iscsi_target_rx_thread()
4211 atomic_set(&conn->transport_failed, 1); in iscsi_target_rx_thread()
4212 iscsit_take_action_for_connection_exit(conn); in iscsi_target_rx_thread()
4216 static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) in iscsit_release_commands_from_conn() argument
4219 struct iscsi_session *sess = conn->sess; in iscsit_release_commands_from_conn()
4225 spin_lock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4226 list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { in iscsit_release_commands_from_conn()
4229 spin_unlock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4235 spin_lock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4237 spin_unlock_bh(&conn->cmd_lock); in iscsit_release_commands_from_conn()
4241 struct iscsi_conn *conn) in iscsit_stop_timers_for_cmds() argument
4245 spin_lock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4246 list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) { in iscsit_stop_timers_for_cmds()
4250 spin_unlock_bh(&conn->cmd_lock); in iscsit_stop_timers_for_cmds()
4254 struct iscsi_conn *conn) in iscsit_close_connection() argument
4256 int conn_logout = (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT); in iscsit_close_connection()
4257 struct iscsi_session *sess = conn->sess; in iscsit_close_connection()
4260 " %u\n", conn->cid, sess->sid); in iscsit_close_connection()
4271 if (conn->conn_transport->transport_type == ISCSI_TCP) in iscsit_close_connection()
4272 complete(&conn->conn_logout_comp); in iscsit_close_connection()
4275 if (conn->tx_thread && in iscsit_close_connection()
4276 cmpxchg(&conn->tx_thread_active, true, false)) { in iscsit_close_connection()
4277 send_sig(SIGINT, conn->tx_thread, 1); in iscsit_close_connection()
4278 kthread_stop(conn->tx_thread); in iscsit_close_connection()
4281 if (conn->rx_thread && in iscsit_close_connection()
4282 cmpxchg(&conn->rx_thread_active, true, false)) { in iscsit_close_connection()
4283 send_sig(SIGINT, conn->rx_thread, 1); in iscsit_close_connection()
4284 kthread_stop(conn->rx_thread); in iscsit_close_connection()
4289 bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, in iscsit_close_connection()
4293 iscsit_stop_timers_for_cmds(conn); in iscsit_close_connection()
4294 iscsit_stop_nopin_response_timer(conn); in iscsit_close_connection()
4295 iscsit_stop_nopin_timer(conn); in iscsit_close_connection()
4297 if (conn->conn_transport->iscsit_wait_conn) in iscsit_close_connection()
4298 conn->conn_transport->iscsit_wait_conn(conn); in iscsit_close_connection()
4309 if (atomic_read(&conn->connection_recovery)) { in iscsit_close_connection()
4310 iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4311 iscsit_prepare_cmds_for_realligance(conn); in iscsit_close_connection()
4313 iscsit_clear_ooo_cmdsns_for_conn(conn); in iscsit_close_connection()
4314 iscsit_release_commands_from_conn(conn); in iscsit_close_connection()
4316 iscsit_free_queue_reqs_for_conn(conn); in iscsit_close_connection()
4323 if (atomic_read(&conn->conn_logout_remove)) { in iscsit_close_connection()
4324 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_SESSION) { in iscsit_close_connection()
4325 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4328 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_CONNECTION) in iscsit_close_connection()
4329 iscsit_dec_conn_usage_count(conn); in iscsit_close_connection()
4331 atomic_set(&conn->conn_logout_remove, 0); in iscsit_close_connection()
4337 list_del(&conn->conn_list); in iscsit_close_connection()
4344 if (atomic_read(&conn->connection_recovery)) in iscsit_close_connection()
4345 iscsit_build_conn_drop_async_message(conn); in iscsit_close_connection()
4354 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4355 if (atomic_read(&conn->sleep_on_conn_wait_comp)) { in iscsit_close_connection()
4356 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4357 complete(&conn->conn_wait_comp); in iscsit_close_connection()
4358 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4359 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4368 if (atomic_read(&conn->connection_wait_rcfr)) { in iscsit_close_connection()
4369 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4370 complete(&conn->conn_wait_rcfr_comp); in iscsit_close_connection()
4371 wait_for_completion(&conn->conn_post_wait_comp); in iscsit_close_connection()
4372 spin_lock_bh(&conn->state_lock); in iscsit_close_connection()
4374 atomic_set(&conn->connection_reinstatement, 1); in iscsit_close_connection()
4375 spin_unlock_bh(&conn->state_lock); in iscsit_close_connection()
4381 iscsit_check_conn_usage_count(conn); in iscsit_close_connection()
4383 if (conn->conn_rx_hash.tfm) in iscsit_close_connection()
4384 crypto_free_hash(conn->conn_rx_hash.tfm); in iscsit_close_connection()
4385 if (conn->conn_tx_hash.tfm) in iscsit_close_connection()
4386 crypto_free_hash(conn->conn_tx_hash.tfm); in iscsit_close_connection()
4388 free_cpumask_var(conn->conn_cpumask); in iscsit_close_connection()
4390 kfree(conn->conn_ops); in iscsit_close_connection()
4391 conn->conn_ops = NULL; in iscsit_close_connection()
4393 if (conn->sock) in iscsit_close_connection()
4394 sock_release(conn->sock); in iscsit_close_connection()
4396 if (conn->conn_transport->iscsit_free_conn) in iscsit_close_connection()
4397 conn->conn_transport->iscsit_free_conn(conn); in iscsit_close_connection()
4399 iscsit_put_transport(conn->conn_transport); in iscsit_close_connection()
4402 conn->conn_state = TARG_CONN_STATE_FREE; in iscsit_close_connection()
4403 kfree(conn); in iscsit_close_connection()
4564 struct iscsi_conn *conn) in iscsit_logout_post_handler_closesession() argument
4566 struct iscsi_session *sess = conn->sess; in iscsit_logout_post_handler_closesession()
4577 if (conn->conn_transport->transport_type == ISCSI_TCP) in iscsit_logout_post_handler_closesession()
4578 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_closesession()
4580 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_closesession()
4581 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_closesession()
4583 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_closesession()
4590 struct iscsi_conn *conn) in iscsit_logout_post_handler_samecid() argument
4594 if (conn->conn_transport->transport_type == ISCSI_TCP) in iscsit_logout_post_handler_samecid()
4595 sleep = cmpxchg(&conn->tx_thread_active, true, false); in iscsit_logout_post_handler_samecid()
4597 atomic_set(&conn->conn_logout_remove, 0); in iscsit_logout_post_handler_samecid()
4598 complete(&conn->conn_logout_comp); in iscsit_logout_post_handler_samecid()
4600 iscsit_cause_connection_reinstatement(conn, sleep); in iscsit_logout_post_handler_samecid()
4601 iscsit_dec_conn_usage_count(conn); in iscsit_logout_post_handler_samecid()
4605 struct iscsi_conn *conn, in iscsit_logout_post_handler_diffcid() argument
4609 struct iscsi_session *sess = conn->sess; in iscsit_logout_post_handler_diffcid()
4645 struct iscsi_conn *conn) in iscsit_logout_post_handler() argument
4655 iscsit_logout_post_handler_closesession(conn); in iscsit_logout_post_handler()
4661 if (conn->cid == cmd->logout_cid) { in iscsit_logout_post_handler()
4666 iscsit_logout_post_handler_samecid(conn); in iscsit_logout_post_handler()
4673 iscsit_logout_post_handler_diffcid(conn, in iscsit_logout_post_handler()
4705 struct iscsi_conn *conn; in iscsit_fail_session() local
4708 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) { in iscsit_fail_session()
4710 conn->conn_state = TARG_CONN_STATE_CLEANUP_WAIT; in iscsit_fail_session()
4721 struct iscsi_conn *conn, *conn_tmp = NULL; in iscsit_free_session() local
4727 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, in iscsit_free_session()
4732 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { in iscsit_free_session()
4738 iscsit_inc_conn_usage_count(conn); in iscsit_free_session()
4741 iscsit_cause_connection_reinstatement(conn, 1); in iscsit_free_session()
4744 iscsit_dec_conn_usage_count(conn); in iscsit_free_session()
4767 struct iscsi_conn *conn, *conn_tmp = NULL; in iscsit_stop_session() local
4775 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, in iscsit_stop_session()
4780 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { in iscsit_stop_session()
4786 iscsit_inc_conn_usage_count(conn); in iscsit_stop_session()
4789 iscsit_cause_connection_reinstatement(conn, 1); in iscsit_stop_session()
4792 iscsit_dec_conn_usage_count(conn); in iscsit_stop_session()
4798 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) in iscsit_stop_session()
4799 iscsit_cause_connection_reinstatement(conn, 0); in iscsit_stop_session()