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