Lines Matching refs:conn

476 int iscsit_queue_rsp(struct iscsit_conn *conn, struct iscsit_cmd *cmd)
478 return iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state);
482 void iscsit_aborted_task(struct iscsit_conn *conn, struct iscsit_cmd *cmd)
484 spin_lock_bh(&conn->cmd_lock);
487 spin_unlock_bh(&conn->cmd_lock);
498 iscsit_xmit_nondatain_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
510 if (conn->conn_ops->HeaderDigest) {
513 iscsit_do_crypto_hash_buf(conn->conn_tx_hash, hdr,
539 if (conn->conn_ops->DataDigest) {
540 iscsit_do_crypto_hash_buf(conn->conn_tx_hash,
557 ret = iscsit_send_tx_data(cmd, conn, 1);
559 iscsit_tx_thread_wait_for_tcp(conn);
572 iscsit_xmit_datain_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
584 if (conn->conn_ops->HeaderDigest) {
587 iscsit_do_crypto_hash_buf(conn->conn_tx_hash, cmd->pdu,
616 if (conn->conn_ops->DataDigest) {
617 cmd->data_crc = iscsit_do_crypto_hash_sg(conn->conn_tx_hash,
634 ret = iscsit_fe_sendpage_sg(cmd, conn);
639 iscsit_tx_thread_wait_for_tcp(conn);
646 static int iscsit_xmit_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
651 return iscsit_xmit_datain_pdu(conn, cmd, buf);
653 return iscsit_xmit_nondatain_pdu(conn, cmd, buf, buf_len);
656 static enum target_prot_op iscsit_get_sup_prot_ops(struct iscsit_conn *conn)
798 struct iscsit_conn *conn,
804 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
818 spin_lock_bh(&conn->cmd_lock);
819 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
820 spin_unlock_bh(&conn->cmd_lock);
823 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
835 struct iscsit_conn *conn;
838 if (!cmd->conn) {
839 pr_err("cmd->conn is NULL for ITT: 0x%08x\n",
843 conn = cmd->conn;
856 spin_lock_bh(&conn->cmd_lock);
857 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
858 spin_unlock_bh(&conn->cmd_lock);
862 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
959 static void iscsit_ack_from_expstatsn(struct iscsit_conn *conn, u32 exp_statsn)
964 conn->exp_statsn = exp_statsn;
966 if (conn->sess->sess_ops->RDMAExtensions)
969 spin_lock_bh(&conn->cmd_lock);
970 list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) {
981 spin_unlock_bh(&conn->cmd_lock);
1002 int iscsit_setup_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1012 atomic_long_inc(&conn->sess->cmd_pdus);
1070 if (payload_length && !conn->sess->sess_ops->ImmediateData) {
1094 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) {
1097 payload_length, conn->conn_ops->MaxXmitDataSegmentLength);
1102 if (payload_length > conn->sess->sess_ops->FirstBurstLength) {
1105 payload_length, conn->sess->sess_ops->FirstBurstLength);
1164 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt;
1166 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess);
1173 if (!conn->sess->sess_ops->RDMAExtensions &&
1192 conn->sess->se_sess, be32_to_cpu(hdr->data_length),
1195 conn->cmd_cnt);
1200 conn->cid);
1234 spin_lock_bh(&conn->cmd_lock);
1235 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
1236 spin_unlock_bh(&conn->cmd_lock);
1246 iscsit_start_dataout_timer(cmd, cmd->conn);
1251 int iscsit_process_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1266 cmdsn_ret = iscsit_sequence_cmd(conn, cmd,
1276 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn));
1327 rc = iscsit_dump_data_payload(cmd->conn, length, 1);
1342 cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd,
1367 iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, cmd->i_state);
1375 iscsit_handle_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1382 rc = iscsit_setup_scsi_cmd(conn, cmd, buf);
1395 rc = iscsit_process_scsi_cmd(conn, cmd, hdr);
1481 __iscsit_check_dataout_hdr(struct iscsit_conn *conn, void *buf,
1490 atomic_long_add(payload_length, &conn->sess->rx_data_octets);
1495 payload_length, conn->cid);
1501 return iscsit_dump_data_payload(conn, payload_length, 1);
1507 return iscsit_dump_data_payload(conn, payload_length, 1);
1522 if (conn->sess->sess_ops->InitialR2T) {
1549 return iscsit_dump_data_payload(conn, payload_length, 1);
1567 return iscsit_dump_data_payload(conn, payload_length, 1);
1585 iscsit_check_dataout_hdr(struct iscsit_conn *conn, void *buf,
1599 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) {
1602 conn->conn_ops->MaxXmitDataSegmentLength);
1603 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, buf);
1606 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, payload_length);
1610 rc = __iscsit_check_dataout_hdr(conn, buf, cmd, payload_length, &success);
1620 iscsit_get_dataout(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1648 if (conn->conn_ops->DataDigest) {
1655 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size);
1662 if (conn->conn_ops->DataDigest) {
1665 data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd,
1691 struct iscsit_conn *conn = cmd->conn;
1702 conn->conn_transport->iscsit_get_dataout(conn, cmd, false);
1726 static int iscsit_handle_data_out(struct iscsit_conn *conn, unsigned char *buf)
1733 rc = iscsit_check_dataout_hdr(conn, buf, &cmd);
1739 rc = iscsit_get_dataout(conn, cmd, hdr);
1748 int iscsit_setup_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1756 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
1767 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
1774 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) {
1778 conn->conn_ops->MaxXmitDataSegmentLength);
1780 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
1804 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt;
1815 int iscsit_process_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1825 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
1828 spin_lock_bh(&conn->cmd_lock);
1829 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
1830 spin_unlock_bh(&conn->cmd_lock);
1832 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn));
1835 iscsit_add_cmd_to_response_queue(cmd, conn,
1840 cmdsn_ret = iscsit_sequence_cmd(conn, cmd,
1853 cmd_p = iscsit_find_cmd_from_ttt(conn, be32_to_cpu(hdr->ttt));
1857 iscsit_stop_nopin_response_timer(conn);
1860 iscsit_add_cmd_to_immediate_queue(cmd_p, conn, cmd_p->i_state);
1862 iscsit_start_nopin_timer(conn);
1877 static int iscsit_handle_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
1886 ret = iscsit_setup_nop_out(conn, cmd, hdr);
1914 if (conn->conn_ops->DataDigest) {
1921 rx_got = rx_data(conn, &cmd->iov_misc[0], niov, rx_size);
1927 if (conn->conn_ops->DataDigest) {
1928 iscsit_do_crypto_hash_buf(conn->conn_rx_hash, ping_data,
1936 if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
1972 return iscsit_process_nop_out(conn, cmd, hdr);
2004 iscsit_handle_task_mgt_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
2020 hdr->rtt, hdr->refcmdsn, conn->cid);
2050 conn->sess->se_sess, 0, DMA_NONE,
2053 conn->cmd_cnt);
2110 if (iscsit_tmr_task_warm_reset(conn, tmr_req, buf) < 0) {
2116 if (iscsit_tmr_task_cold_reset(conn, tmr_req, buf) < 0) {
2130 if (iscsit_check_task_reassign_expdatasn(tmr_req, conn) < 0)
2145 spin_lock_bh(&conn->cmd_lock);
2146 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
2147 spin_unlock_bh(&conn->cmd_lock);
2150 int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn);
2160 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn));
2178 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
2186 iscsit_setup_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
2191 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) {
2194 payload_length, conn->conn_ops->MaxXmitDataSegmentLength);
2213 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt;
2226 iscsit_process_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
2260 spin_lock_bh(&conn->cmd_lock);
2261 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
2262 spin_unlock_bh(&conn->cmd_lock);
2265 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn));
2268 cmdsn_ret = iscsit_sequence_cmd(conn, cmd,
2285 iscsit_handle_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
2293 rc = iscsit_setup_text_cmd(conn, cmd, hdr);
2319 if (conn->conn_ops->DataDigest) {
2326 rx_got = rx_data(conn, &iov[0], niov, rx_size);
2330 if (conn->conn_ops->DataDigest) {
2331 iscsit_do_crypto_hash_buf(conn->conn_rx_hash,
2339 if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
2366 return iscsit_process_text_cmd(conn, cmd, hdr);
2374 int iscsit_logout_closesession(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
2377 struct iscsit_session *sess = conn->sess;
2380 " for SID: %u.\n", conn->cid, conn->sess->sid);
2383 atomic_set(&conn->conn_logout_remove, 1);
2384 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_SESSION;
2386 iscsit_inc_conn_usage_count(conn);
2399 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
2404 int iscsit_logout_closeconnection(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
2407 struct iscsit_session *sess = conn->sess;
2410 " %hu on CID: %hu.\n", cmd->logout_cid, conn->cid);
2416 if (conn->cid == cmd->logout_cid) {
2417 spin_lock_bh(&conn->state_lock);
2419 conn->conn_state = TARG_CONN_STATE_IN_LOGOUT;
2421 atomic_set(&conn->conn_logout_remove, 1);
2422 conn->conn_logout_reason = ISCSI_LOGOUT_REASON_CLOSE_CONNECTION;
2423 iscsit_inc_conn_usage_count(conn);
2425 spin_unlock_bh(&conn->state_lock);
2439 iscsit_add_cmd_to_response_queue(cmd, conn,
2447 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
2452 int iscsit_logout_removeconnforrecovery(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
2454 struct iscsit_session *sess = conn->sess;
2457 " CID: %hu on CID: %hu.\n", cmd->logout_cid, conn->cid);
2463 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
2467 if (conn->cid == cmd->logout_cid) {
2470 cmd->logout_cid, conn->cid);
2472 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
2476 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
2482 iscsit_handle_logout_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
2488 struct iscsi_tiqn *tiqn = iscsit_snmp_get_tiqn(conn);
2505 hdr->cid, conn->cid);
2507 if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) {
2517 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt;
2531 be16_to_cpu(hdr->cid) == conn->cid))
2534 spin_lock_bh(&conn->cmd_lock);
2535 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
2536 spin_unlock_bh(&conn->cmd_lock);
2539 iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn));
2551 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn);
2563 struct iscsit_conn *conn,
2574 hdr->begrun, hdr->runlength, conn->cid);
2576 if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
2579 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
2588 return iscsit_handle_recovery_datain_or_r2t(conn, buf,
2594 return iscsit_handle_status_snack(conn, hdr->itt,
2598 return iscsit_handle_data_ack(conn, be32_to_cpu(hdr->ttt),
2604 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
2609 return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
2617 static void iscsit_rx_thread_wait_for_tcp(struct iscsit_conn *conn)
2619 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) ||
2620 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) {
2622 &conn->rx_half_close_comp,
2634 struct iscsit_conn *conn = cmd->conn;
2672 if (conn->conn_ops->DataDigest) {
2679 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size);
2684 iscsit_rx_thread_wait_for_tcp(conn);
2688 if (conn->conn_ops->DataDigest) {
2691 data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd,
2700 if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
2735 static void iscsit_build_conn_drop_async_message(struct iscsit_conn *conn)
2741 lockdep_assert_held(&conn->sess->conn_lock);
2747 list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) {
2764 cmd->logout_cid = conn->cid;
2778 struct iscsit_conn *conn)
2790 cmd->stat_sn = conn->stat_sn++;
2792 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
2793 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
2796 hdr->param2 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Wait);
2797 hdr->param3 = cpu_to_be16(conn->sess->sess_ops->DefaultTime2Retain);
2801 cmd->logout_cid, conn->cid);
2803 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0);
2806 static void iscsit_tx_thread_wait_for_tcp(struct iscsit_conn *conn)
2808 if ((conn->sock->sk->sk_shutdown & SEND_SHUTDOWN) ||
2809 (conn->sock->sk->sk_shutdown & RCV_SHUTDOWN)) {
2811 &conn->tx_half_close_comp,
2817 iscsit_build_datain_pdu(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
2850 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
2851 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
2858 ntohl(hdr->offset), datain->length, conn->cid);
2862 static int iscsit_send_datain(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
2888 atomic_long_add(datain.length, &conn->sess->tx_data_octets);
2899 iscsit_increment_maxcmdsn(cmd, conn->sess);
2900 cmd->stat_sn = conn->stat_sn++;
2907 iscsit_build_datain_pdu(cmd, conn, &datain, hdr, set_statsn);
2909 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, dr, &datain, 0);
2923 iscsit_build_logout_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
2928 struct iscsit_session *sess = conn->sess;
2956 " successful.\n", cmd->logout_cid, conn->cid);
2975 conn->sess, cmd->logout_cid);
2988 cmd->logout_cid, conn->cid);
3001 cmd->stat_sn = conn->stat_sn++;
3004 iscsit_increment_maxcmdsn(cmd, conn->sess);
3005 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3006 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3011 cmd->logout_cid, conn->cid);
3018 iscsit_send_logout(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
3022 rc = iscsit_build_logout_rsp(cmd, conn,
3027 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0);
3031 iscsit_build_nopin_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
3041 cmd->stat_sn = (nopout_response) ? conn->stat_sn++ :
3042 conn->stat_sn;
3046 iscsit_increment_maxcmdsn(cmd, conn->sess);
3048 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3049 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3063 struct iscsit_conn *conn,
3069 iscsit_build_nopin_rsp(cmd, conn, hdr, false);
3072 " 0x%08x CID: %hu\n", hdr->ttt, cmd->stat_sn, conn->cid);
3074 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0);
3087 iscsit_send_nopin(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
3091 iscsit_build_nopin_rsp(cmd, conn, hdr, true);
3099 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL,
3106 struct iscsit_conn *conn)
3123 if (conn->conn_transport->iscsit_get_r2t_ttt)
3124 conn->conn_transport->iscsit_get_r2t_ttt(conn, cmd, r2t);
3126 r2t->targ_xfer_tag = session_get_next_ttt(conn->sess);
3128 hdr->statsn = cpu_to_be32(conn->stat_sn);
3129 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3130 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3139 r2t->offset, r2t->xfer_len, conn->cid);
3145 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0);
3151 iscsit_start_dataout_timer(cmd, conn);
3162 struct iscsit_conn *conn,
3175 if (conn->sess->sess_ops->DataSequenceInOrder &&
3179 while (cmd->outstanding_r2ts < conn->sess->sess_ops->MaxOutstandingR2T) {
3180 if (conn->sess->sess_ops->DataSequenceInOrder) {
3185 conn->sess->sess_ops->MaxBurstLength -
3192 conn->sess->sess_ops->MaxBurstLength -
3196 conn->sess->sess_ops->MaxBurstLength;
3201 xfer_len = conn->sess->sess_ops->MaxBurstLength;
3245 void iscsit_build_rsp_pdu(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
3249 cmd->stat_sn = conn->stat_sn++;
3251 atomic_long_inc(&conn->sess->rsp_pdus);
3268 iscsit_increment_maxcmdsn(cmd, conn->sess);
3269 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3270 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3275 cmd->se_cmd.scsi_status, conn->cid);
3279 static int iscsit_send_response(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
3286 iscsit_build_rsp_pdu(cmd, conn, inc_stat_sn, hdr);
3314 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, data_buf,
3336 iscsit_build_task_mgt_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
3345 cmd->stat_sn = conn->stat_sn++;
3348 iscsit_increment_maxcmdsn(cmd, conn->sess);
3349 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3350 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3354 cmd->init_task_tag, cmd->stat_sn, hdr->response, conn->cid);
3359 iscsit_send_task_mgt_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn)
3363 iscsit_build_task_mgt_rsp(cmd, conn, hdr);
3365 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0);
3376 struct iscsit_conn *conn = cmd->conn;
3386 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength,
3431 cmd->conn->sess->sess_ops->InitiatorName))) {
3475 sockaddr = &conn->local_sockaddr;
3521 iscsit_build_text_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
3540 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess);
3547 cmd->stat_sn = conn->stat_sn++;
3550 iscsit_increment_maxcmdsn(cmd, conn->sess);
3557 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3558 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3562 cmd->targ_xfer_tag, cmd->stat_sn, text_length, conn->cid,
3572 struct iscsit_conn *conn)
3577 text_length = iscsit_build_text_rsp(cmd, conn, hdr,
3578 conn->conn_transport->transport_type);
3582 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL,
3588 iscsit_build_reject(struct iscsit_cmd *cmd, struct iscsit_conn *conn,
3596 cmd->stat_sn = conn->stat_sn++;
3598 hdr->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
3599 hdr->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
3606 struct iscsit_conn *conn)
3610 iscsit_build_reject(cmd, conn, hdr);
3613 " CID: %hu\n", ntohl(hdr->statsn), hdr->reason, conn->cid);
3615 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL,
3620 void iscsit_thread_get_cpumask(struct iscsit_conn *conn)
3634 ord = conn->bitmap_id % cpumask_weight(cpu_online_mask);
3637 cpumask_set_cpu(cpu, conn->conn_cpumask);
3645 cpumask_clear(conn->conn_cpumask);
3646 ord = conn->bitmap_id % cpumask_weight(conn_allowed_cpumask);
3649 cpumask_set_cpu(cpu, conn->conn_cpumask);
3660 cpumask_setall(conn->conn_cpumask);
3663 static void iscsit_thread_reschedule(struct iscsit_conn *conn)
3667 * connection's RX/TX threads update conn->allowed_cpumask.
3670 conn->allowed_cpumask)) {
3671 iscsit_thread_get_cpumask(conn);
3672 conn->conn_tx_reset_cpumask = 1;
3673 conn->conn_rx_reset_cpumask = 1;
3674 cpumask_copy(conn->allowed_cpumask,
3680 struct iscsit_conn *conn,
3692 iscsit_thread_reschedule(conn);
3699 if (!conn->conn_tx_reset_cpumask)
3702 if (!conn->conn_rx_reset_cpumask)
3711 set_cpus_allowed_ptr(p, conn->conn_cpumask);
3713 conn->conn_tx_reset_cpumask = 0;
3715 conn->conn_rx_reset_cpumask = 0;
3720 iscsit_immediate_queue(struct iscsit_conn *conn, struct iscsit_cmd *cmd, int state)
3726 ret = iscsit_send_r2t(cmd, conn);
3731 spin_lock_bh(&conn->cmd_lock);
3733 spin_unlock_bh(&conn->cmd_lock);
3738 iscsit_mod_nopin_response_timer(conn);
3739 ret = iscsit_send_unsolicited_nopin(cmd, conn, 1);
3744 ret = iscsit_send_unsolicited_nopin(cmd, conn, 0);
3752 conn->cid);
3764 iscsit_handle_immediate_queue(struct iscsit_conn *conn)
3766 struct iscsit_transport *t = conn->conn_transport;
3772 while ((qr = iscsit_get_cmd_from_immediate_queue(conn))) {
3773 atomic_set(&conn->check_immediate_queue, 0);
3778 ret = t->iscsit_immediate_queue(conn, cmd, state);
3787 iscsit_response_queue(struct iscsit_conn *conn, struct iscsit_cmd *cmd, int state)
3794 ret = iscsit_send_datain(cmd, conn);
3806 if (atomic_read(&conn->check_immediate_queue))
3823 ret = iscsit_send_response(cmd, conn);
3826 ret = iscsit_send_logout(cmd, conn);
3830 cmd, conn);
3833 ret = iscsit_send_nopin(cmd, conn);
3836 ret = iscsit_send_reject(cmd, conn);
3839 ret = iscsit_send_task_mgt_rsp(cmd, conn);
3842 ret = iscsit_tmr_post_handler(cmd, conn);
3844 iscsit_fall_back_to_erl0(conn->sess);
3847 ret = iscsit_send_text_rsp(cmd, conn);
3853 state, conn->cid);
3861 if (!iscsit_logout_post_handler(cmd, conn))
3879 cmd->i_state, conn->cid);
3883 if (atomic_read(&conn->check_immediate_queue))
3893 static int iscsit_handle_response_queue(struct iscsit_conn *conn)
3895 struct iscsit_transport *t = conn->conn_transport;
3901 while ((qr = iscsit_get_cmd_from_response_queue(conn))) {
3906 ret = t->iscsit_response_queue(conn, cmd, state);
3917 struct iscsit_conn *conn = arg;
3931 iscsit_thread_check_cpumask(conn, current, 1);
3933 wait_event_interruptible(conn->queues_wq,
3934 !iscsit_conn_all_queues_empty(conn));
3940 ret = iscsit_handle_immediate_queue(conn);
3944 ret = iscsit_handle_response_queue(conn);
3961 if (conn->conn_state != TARG_CONN_STATE_IN_LOGIN)
3962 iscsit_take_action_for_connection_exit(conn, &conn_freed);
3972 static int iscsi_target_rx_opcode(struct iscsit_conn *conn, unsigned char *buf)
3980 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
3984 ret = iscsit_handle_scsi_cmd(conn, cmd, buf);
3987 ret = iscsit_handle_data_out(conn, buf);
3992 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
3996 ret = iscsit_handle_nop_out(conn, cmd, buf);
3999 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
4003 ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf);
4007 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt);
4011 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
4016 ret = iscsit_handle_text_cmd(conn, cmd, buf);
4019 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE);
4023 ret = iscsit_handle_logout_cmd(conn, cmd, buf);
4025 wait_for_completion_timeout(&conn->conn_logout_comp,
4029 ret = iscsit_handle_snack(conn, buf);
4033 if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
4046 return iscsit_add_reject(conn, ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
4049 static bool iscsi_target_check_conn_state(struct iscsit_conn *conn)
4053 spin_lock_bh(&conn->state_lock);
4054 ret = (conn->conn_state != TARG_CONN_STATE_LOGGED_IN);
4055 spin_unlock_bh(&conn->state_lock);
4060 static void iscsit_get_rx_pdu(struct iscsit_conn *conn)
4077 iscsit_thread_check_cpumask(conn, current, 0);
4084 ret = rx_data(conn, &iov, 1, ISCSI_HDR_LEN);
4086 iscsit_rx_thread_wait_for_tcp(conn);
4102 ret = rx_data(conn, &iov, 1, iov.iov_len);
4104 iscsit_rx_thread_wait_for_tcp(conn);
4109 if (conn->conn_ops->HeaderDigest) {
4113 ret = rx_data(conn, &iov, 1, ISCSI_CRC_LEN);
4115 iscsit_rx_thread_wait_for_tcp(conn);
4119 iscsit_do_crypto_hash_buf(conn->conn_rx_hash, buffer,
4132 atomic_long_inc(&conn->sess->conn_digest_errors);
4139 if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT)
4144 if (conn->sess->sess_ops->SessionType &&
4149 iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
4154 ret = iscsi_target_rx_opcode(conn, buffer);
4165 struct iscsit_conn *conn = arg;
4177 rc = wait_for_completion_interruptible(&conn->rx_login_comp);
4178 if (rc < 0 || iscsi_target_check_conn_state(conn))
4181 if (!conn->conn_transport->iscsit_get_rx_pdu)
4184 conn->conn_transport->iscsit_get_rx_pdu(conn);
4187 atomic_set(&conn->transport_failed, 1);
4188 iscsit_take_action_for_connection_exit(conn, &conn_freed);
4200 static void iscsit_release_commands_from_conn(struct iscsit_conn *conn)
4204 struct iscsit_session *sess = conn->sess;
4210 spin_lock_bh(&conn->cmd_lock);
4211 list_splice_init(&conn->conn_cmd_list, &tmp_list);
4228 &conn->conn_cmd_list);
4244 spin_unlock_bh(&conn->cmd_lock);
4259 if (!conn->conn_transport->iscsit_wait_conn) {
4260 target_stop_cmd_counter(conn->cmd_cnt);
4261 target_wait_for_cmds(conn->cmd_cnt);
4266 struct iscsit_conn *conn)
4270 spin_lock_bh(&conn->cmd_lock);
4271 list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) {
4275 spin_unlock_bh(&conn->cmd_lock);
4279 struct iscsit_conn *conn)
4281 int conn_logout = (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT);
4282 struct iscsit_session *sess = conn->sess;
4285 " %u\n", conn->cid, sess->sid);
4297 if (!conn->conn_transport->rdma_shutdown)
4298 complete(&conn->conn_logout_comp);
4301 if (conn->tx_thread &&
4302 cmpxchg(&conn->tx_thread_active, true, false)) {
4303 send_sig(SIGINT, conn->tx_thread, 1);
4304 kthread_stop(conn->tx_thread);
4307 if (conn->rx_thread &&
4308 cmpxchg(&conn->rx_thread_active, true, false)) {
4309 send_sig(SIGINT, conn->rx_thread, 1);
4310 kthread_stop(conn->rx_thread);
4315 bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id,
4319 iscsit_stop_timers_for_cmds(conn);
4320 iscsit_stop_nopin_response_timer(conn);
4321 iscsit_stop_nopin_timer(conn);
4323 if (conn->conn_transport->iscsit_wait_conn)
4324 conn->conn_transport->iscsit_wait_conn(conn);
4335 if (atomic_read(&conn->connection_recovery)) {
4336 iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(conn);
4337 iscsit_prepare_cmds_for_reallegiance(conn);
4339 iscsit_clear_ooo_cmdsns_for_conn(conn);
4340 iscsit_release_commands_from_conn(conn);
4342 iscsit_free_queue_reqs_for_conn(conn);
4349 if (atomic_read(&conn->conn_logout_remove)) {
4350 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_SESSION) {
4351 iscsit_dec_conn_usage_count(conn);
4354 if (conn->conn_logout_reason == ISCSI_LOGOUT_REASON_CLOSE_CONNECTION)
4355 iscsit_dec_conn_usage_count(conn);
4357 atomic_set(&conn->conn_logout_remove, 0);
4363 list_del(&conn->conn_list);
4370 if (atomic_read(&conn->connection_recovery))
4371 iscsit_build_conn_drop_async_message(conn);
4380 spin_lock_bh(&conn->state_lock);
4381 if (atomic_read(&conn->sleep_on_conn_wait_comp)) {
4382 spin_unlock_bh(&conn->state_lock);
4383 complete(&conn->conn_wait_comp);
4384 wait_for_completion(&conn->conn_post_wait_comp);
4385 spin_lock_bh(&conn->state_lock);
4394 if (atomic_read(&conn->connection_wait_rcfr)) {
4395 spin_unlock_bh(&conn->state_lock);
4396 complete(&conn->conn_wait_rcfr_comp);
4397 wait_for_completion(&conn->conn_post_wait_comp);
4398 spin_lock_bh(&conn->state_lock);
4400 atomic_set(&conn->connection_reinstatement, 1);
4401 spin_unlock_bh(&conn->state_lock);
4407 iscsit_check_conn_usage_count(conn);
4409 ahash_request_free(conn->conn_tx_hash);
4410 if (conn->conn_rx_hash) {
4413 tfm = crypto_ahash_reqtfm(conn->conn_rx_hash);
4414 ahash_request_free(conn->conn_rx_hash);
4418 if (conn->sock)
4419 sock_release(conn->sock);
4421 if (conn->conn_transport->iscsit_free_conn)
4422 conn->conn_transport->iscsit_free_conn(conn);
4425 conn->conn_state = TARG_CONN_STATE_FREE;
4426 iscsit_free_conn(conn);
4587 struct iscsit_conn *conn)
4589 struct iscsit_session *sess = conn->sess;
4600 if (!conn->conn_transport->rdma_shutdown) {
4601 sleep = cmpxchg(&conn->tx_thread_active, true, false);
4606 atomic_set(&conn->conn_logout_remove, 0);
4607 complete(&conn->conn_logout_comp);
4609 iscsit_dec_conn_usage_count(conn);
4616 struct iscsit_conn *conn)
4620 if (!conn->conn_transport->rdma_shutdown) {
4621 sleep = cmpxchg(&conn->tx_thread_active, true, false);
4626 atomic_set(&conn->conn_logout_remove, 0);
4627 complete(&conn->conn_logout_comp);
4629 iscsit_cause_connection_reinstatement(conn, sleep);
4630 iscsit_dec_conn_usage_count(conn);
4634 struct iscsit_conn *conn,
4638 struct iscsit_session *sess = conn->sess;
4674 struct iscsit_conn *conn)
4684 iscsit_logout_post_handler_closesession(conn);
4689 if (conn->cid == cmd->logout_cid) {
4694 iscsit_logout_post_handler_samecid(conn);
4700 iscsit_logout_post_handler_diffcid(conn,
4732 struct iscsit_conn *conn;
4735 list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
4737 conn->conn_state = TARG_CONN_STATE_CLEANUP_WAIT;
4751 struct iscsit_conn *conn, *conn_tmp = NULL;
4757 list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list,
4762 if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) {
4768 iscsit_inc_conn_usage_count(conn);
4771 iscsit_cause_connection_reinstatement(conn, 1);
4774 iscsit_dec_conn_usage_count(conn);
4780 list_for_each_entry(conn, &sess->sess_conn_list, conn_list)
4781 iscsit_cause_connection_reinstatement(conn, 0);