Lines Matching refs:cmd

477 int iscsit_queue_rsp(struct iscsit_conn *conn, struct iscsit_cmd *cmd)  in iscsit_queue_rsp()  argument
479 return iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); in iscsit_queue_rsp()
483 void iscsit_aborted_task(struct iscsit_conn *conn, struct iscsit_cmd *cmd) in iscsit_aborted_task() argument
486 if (!list_empty(&cmd->i_conn_node)) in iscsit_aborted_task()
487 list_del_init(&cmd->i_conn_node); in iscsit_aborted_task()
490 __iscsit_free_cmd(cmd, true); in iscsit_aborted_task()
499 iscsit_xmit_nondatain_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_xmit_nondatain_pdu() argument
502 struct iscsi_hdr *hdr = (struct iscsi_hdr *)cmd->pdu; in iscsit_xmit_nondatain_pdu()
507 iov = &cmd->iov_misc[0]; in iscsit_xmit_nondatain_pdu()
508 iov[niov].iov_base = cmd->pdu; in iscsit_xmit_nondatain_pdu()
512 u32 *header_digest = (u32 *)&cmd->pdu[ISCSI_HDR_LEN]; in iscsit_xmit_nondatain_pdu()
533 iov[niov].iov_base = &cmd->pad_bytes; in iscsit_xmit_nondatain_pdu()
543 padding, &cmd->pad_bytes, in iscsit_xmit_nondatain_pdu()
544 &cmd->data_crc); in iscsit_xmit_nondatain_pdu()
546 iov[niov].iov_base = &cmd->data_crc; in iscsit_xmit_nondatain_pdu()
551 data_buf_len, hdr->opcode, cmd->data_crc); in iscsit_xmit_nondatain_pdu()
555 cmd->iov_misc_count = niov; in iscsit_xmit_nondatain_pdu()
556 cmd->tx_size = tx_size; in iscsit_xmit_nondatain_pdu()
558 ret = iscsit_send_tx_data(cmd, conn, 1); in iscsit_xmit_nondatain_pdu()
567 static int iscsit_map_iovec(struct iscsit_cmd *cmd, struct kvec *iov, int nvec,
573 iscsit_xmit_datain_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_xmit_datain_pdu() argument
580 iov = &cmd->iov_data[0]; in iscsit_xmit_datain_pdu()
581 iov[iov_count].iov_base = cmd->pdu; in iscsit_xmit_datain_pdu()
586 u32 *header_digest = (u32 *)&cmd->pdu[ISCSI_HDR_LEN]; in iscsit_xmit_datain_pdu()
588 iscsit_do_crypto_hash_buf(conn->conn_tx_hash, cmd->pdu, in iscsit_xmit_datain_pdu()
599 iov_ret = iscsit_map_iovec(cmd, &cmd->iov_data[iov_count], in iscsit_xmit_datain_pdu()
600 cmd->orig_iov_data_count - (iov_count + 2), in iscsit_xmit_datain_pdu()
608 cmd->padding = ((-datain->length) & 3); in iscsit_xmit_datain_pdu()
609 if (cmd->padding) { in iscsit_xmit_datain_pdu()
610 iov[iov_count].iov_base = cmd->pad_bytes; in iscsit_xmit_datain_pdu()
611 iov[iov_count++].iov_len = cmd->padding; in iscsit_xmit_datain_pdu()
612 tx_size += cmd->padding; in iscsit_xmit_datain_pdu()
614 pr_debug("Attaching %u padding bytes\n", cmd->padding); in iscsit_xmit_datain_pdu()
618 cmd->data_crc = iscsit_do_crypto_hash_sg(conn->conn_tx_hash, in iscsit_xmit_datain_pdu()
619 cmd, datain->offset, in iscsit_xmit_datain_pdu()
621 cmd->padding, in iscsit_xmit_datain_pdu()
622 cmd->pad_bytes); in iscsit_xmit_datain_pdu()
624 iov[iov_count].iov_base = &cmd->data_crc; in iscsit_xmit_datain_pdu()
629 datain->length + cmd->padding, cmd->data_crc); in iscsit_xmit_datain_pdu()
632 cmd->iov_data_count = iov_count; in iscsit_xmit_datain_pdu()
633 cmd->tx_size = tx_size; in iscsit_xmit_datain_pdu()
635 ret = iscsit_fe_sendpage_sg(cmd, conn); in iscsit_xmit_datain_pdu()
637 iscsit_unmap_iovec(cmd); in iscsit_xmit_datain_pdu()
647 static int iscsit_xmit_pdu(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_xmit_pdu() argument
652 return iscsit_xmit_datain_pdu(conn, cmd, buf); in iscsit_xmit_pdu()
654 return iscsit_xmit_nondatain_pdu(conn, cmd, buf, buf_len); in iscsit_xmit_pdu()
803 struct iscsit_cmd *cmd; in iscsit_add_reject() local
805 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsit_add_reject()
806 if (!cmd) in iscsit_add_reject()
809 cmd->iscsi_opcode = ISCSI_OP_REJECT; in iscsit_add_reject()
810 cmd->reject_reason = reason; in iscsit_add_reject()
812 cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); in iscsit_add_reject()
813 if (!cmd->buf_ptr) { in iscsit_add_reject()
815 iscsit_free_cmd(cmd, false); in iscsit_add_reject()
820 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject()
823 cmd->i_state = ISTATE_SEND_REJECT; in iscsit_add_reject()
824 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject()
831 struct iscsit_cmd *cmd, in iscsit_add_reject_from_cmd() argument
837 const bool do_put = cmd->se_cmd.se_tfo != NULL; in iscsit_add_reject_from_cmd()
839 if (!cmd->conn) { in iscsit_add_reject_from_cmd()
841 cmd->init_task_tag); in iscsit_add_reject_from_cmd()
844 conn = cmd->conn; in iscsit_add_reject_from_cmd()
846 cmd->iscsi_opcode = ISCSI_OP_REJECT; in iscsit_add_reject_from_cmd()
847 cmd->reject_reason = reason; in iscsit_add_reject_from_cmd()
849 cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); in iscsit_add_reject_from_cmd()
850 if (!cmd->buf_ptr) { in iscsit_add_reject_from_cmd()
852 iscsit_free_cmd(cmd, false); in iscsit_add_reject_from_cmd()
858 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_add_reject_from_cmd()
862 cmd->i_state = ISTATE_SEND_REJECT; in iscsit_add_reject_from_cmd()
863 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_add_reject_from_cmd()
870 target_put_sess_cmd(&cmd->se_cmd); in iscsit_add_reject_from_cmd()
875 static int iscsit_add_reject_cmd(struct iscsit_cmd *cmd, u8 reason, in iscsit_add_reject_cmd() argument
878 return iscsit_add_reject_from_cmd(cmd, reason, true, buf); in iscsit_add_reject_cmd()
881 int iscsit_reject_cmd(struct iscsit_cmd *cmd, u8 reason, unsigned char *buf) in iscsit_reject_cmd() argument
883 return iscsit_add_reject_from_cmd(cmd, reason, false, buf); in iscsit_reject_cmd()
891 static int iscsit_map_iovec(struct iscsit_cmd *cmd, struct kvec *iov, int nvec, in iscsit_map_iovec() argument
906 if (ent >= cmd->se_cmd.t_data_nents) { in iscsit_map_iovec()
911 sg = &cmd->se_cmd.t_data_sg[ent]; in iscsit_map_iovec()
914 cmd->first_data_sg = sg; in iscsit_map_iovec()
915 cmd->first_data_sg_off = page_off; in iscsit_map_iovec()
934 cmd->kmapped_nents = i; in iscsit_map_iovec()
941 for_each_sg(cmd->se_cmd.t_data_sg, sg, in iscsit_map_iovec()
942 cmd->se_cmd.t_data_nents, i) { in iscsit_map_iovec()
949 static void iscsit_unmap_iovec(struct iscsit_cmd *cmd) in iscsit_unmap_iovec() argument
954 sg = cmd->first_data_sg; in iscsit_unmap_iovec()
956 for (i = 0; i < cmd->kmapped_nents; i++) in iscsit_unmap_iovec()
963 struct iscsit_cmd *cmd, *cmd_p; in iscsit_ack_from_expstatsn() local
971 list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) { in iscsit_ack_from_expstatsn()
972 spin_lock(&cmd->istate_lock); in iscsit_ack_from_expstatsn()
973 if ((cmd->i_state == ISTATE_SENT_STATUS) && in iscsit_ack_from_expstatsn()
974 iscsi_sna_lt(cmd->stat_sn, exp_statsn)) { in iscsit_ack_from_expstatsn()
975 cmd->i_state = ISTATE_REMOVE; in iscsit_ack_from_expstatsn()
976 spin_unlock(&cmd->istate_lock); in iscsit_ack_from_expstatsn()
977 list_move_tail(&cmd->i_conn_node, &ack_list); in iscsit_ack_from_expstatsn()
980 spin_unlock(&cmd->istate_lock); in iscsit_ack_from_expstatsn()
984 list_for_each_entry_safe(cmd, cmd_p, &ack_list, i_conn_node) { in iscsit_ack_from_expstatsn()
985 list_del_init(&cmd->i_conn_node); in iscsit_ack_from_expstatsn()
986 iscsit_free_cmd(cmd, false); in iscsit_ack_from_expstatsn()
990 static int iscsit_allocate_iovecs(struct iscsit_cmd *cmd) in iscsit_allocate_iovecs() argument
992 u32 iov_count = max(1UL, DIV_ROUND_UP(cmd->se_cmd.data_length, PAGE_SIZE)); in iscsit_allocate_iovecs()
995 cmd->iov_data = kcalloc(iov_count, sizeof(*cmd->iov_data), GFP_KERNEL); in iscsit_allocate_iovecs()
996 if (!cmd->iov_data) in iscsit_allocate_iovecs()
999 cmd->orig_iov_data_count = iov_count; in iscsit_allocate_iovecs()
1003 int iscsit_setup_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_setup_scsi_cmd() argument
1024 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1053 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1060 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1067 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1074 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1083 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1091 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1099 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1107 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1118 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1125 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1136 cmd->data_direction = data_direction; in iscsit_setup_scsi_cmd()
1156 cmd->iscsi_opcode = ISCSI_OP_SCSI_CMD; in iscsit_setup_scsi_cmd()
1157 cmd->i_state = ISTATE_NEW_CMD; in iscsit_setup_scsi_cmd()
1158 cmd->immediate_cmd = ((hdr->opcode & ISCSI_OP_IMMEDIATE) ? 1 : 0); in iscsit_setup_scsi_cmd()
1159 cmd->immediate_data = (payload_length) ? 1 : 0; in iscsit_setup_scsi_cmd()
1160 cmd->unsolicited_data = ((!(hdr->flags & ISCSI_FLAG_CMD_FINAL) && in iscsit_setup_scsi_cmd()
1162 if (cmd->unsolicited_data) in iscsit_setup_scsi_cmd()
1163 cmd->cmd_flags |= ICF_NON_IMMEDIATE_UNSOLICITED_DATA; in iscsit_setup_scsi_cmd()
1165 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_scsi_cmd()
1167 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_setup_scsi_cmd()
1169 cmd->targ_xfer_tag = 0xFFFFFFFF; in iscsit_setup_scsi_cmd()
1170 cmd->cmd_sn = be32_to_cpu(hdr->cmdsn); in iscsit_setup_scsi_cmd()
1171 cmd->exp_stat_sn = be32_to_cpu(hdr->exp_statsn); in iscsit_setup_scsi_cmd()
1172 cmd->first_burst_len = payload_length; in iscsit_setup_scsi_cmd()
1175 cmd->data_direction == DMA_FROM_DEVICE) { in iscsit_setup_scsi_cmd()
1182 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1186 iscsit_attach_datain_req(cmd, dr); in iscsit_setup_scsi_cmd()
1192 __target_init_cmd(&cmd->se_cmd, &iscsi_ops, in iscsit_setup_scsi_cmd()
1194 cmd->data_direction, sam_task_attr, in iscsit_setup_scsi_cmd()
1195 cmd->sense_buffer + 2, scsilun_to_int(&hdr->lun)); in iscsit_setup_scsi_cmd()
1202 target_get_sess_cmd(&cmd->se_cmd, true); in iscsit_setup_scsi_cmd()
1204 cmd->se_cmd.tag = (__force u32)cmd->init_task_tag; in iscsit_setup_scsi_cmd()
1205 cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, cdb, in iscsit_setup_scsi_cmd()
1211 if (cmd->sense_reason) { in iscsit_setup_scsi_cmd()
1212 if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) { in iscsit_setup_scsi_cmd()
1213 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1220 cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd); in iscsit_setup_scsi_cmd()
1221 if (cmd->sense_reason) in iscsit_setup_scsi_cmd()
1224 cmd->sense_reason = target_cmd_parse_cdb(&cmd->se_cmd); in iscsit_setup_scsi_cmd()
1225 if (cmd->sense_reason) in iscsit_setup_scsi_cmd()
1228 if (iscsit_build_pdu_and_seq_lists(cmd, payload_length) < 0) { in iscsit_setup_scsi_cmd()
1229 return iscsit_add_reject_cmd(cmd, in iscsit_setup_scsi_cmd()
1235 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_setup_scsi_cmd()
1241 core_alua_check_nonop_delay(&cmd->se_cmd); in iscsit_setup_scsi_cmd()
1247 void iscsit_set_unsolicited_dataout(struct iscsit_cmd *cmd) in iscsit_set_unsolicited_dataout() argument
1249 iscsit_set_dataout_sequence_values(cmd); in iscsit_set_unsolicited_dataout()
1251 spin_lock_bh(&cmd->dataout_timeout_lock); in iscsit_set_unsolicited_dataout()
1252 iscsit_start_dataout_timer(cmd, cmd->conn); in iscsit_set_unsolicited_dataout()
1253 spin_unlock_bh(&cmd->dataout_timeout_lock); in iscsit_set_unsolicited_dataout()
1257 int iscsit_process_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_process_scsi_cmd() argument
1271 if (!cmd->immediate_data) { in iscsit_process_scsi_cmd()
1272 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_scsi_cmd()
1277 target_put_sess_cmd(&cmd->se_cmd); in iscsit_process_scsi_cmd()
1287 if (!cmd->immediate_data) { in iscsit_process_scsi_cmd()
1288 if (!cmd->sense_reason && cmd->unsolicited_data) in iscsit_process_scsi_cmd()
1289 iscsit_set_unsolicited_dataout(cmd); in iscsit_process_scsi_cmd()
1290 if (!cmd->sense_reason) in iscsit_process_scsi_cmd()
1293 target_put_sess_cmd(&cmd->se_cmd); in iscsit_process_scsi_cmd()
1302 if (cmd->sense_reason) in iscsit_process_scsi_cmd()
1308 cmd->sense_reason = transport_generic_new_cmd(&cmd->se_cmd); in iscsit_process_scsi_cmd()
1309 if (cmd->sense_reason) in iscsit_process_scsi_cmd()
1317 iscsit_get_immediate_data(struct iscsit_cmd *cmd, struct iscsi_scsi_req *hdr, in iscsit_get_immediate_data() argument
1327 u32 length = min(cmd->se_cmd.data_length - cmd->write_data_done, in iscsit_get_immediate_data()
1328 cmd->first_burst_len); in iscsit_get_immediate_data()
1331 cmd->se_cmd.data_length, cmd->write_data_done, in iscsit_get_immediate_data()
1332 cmd->first_burst_len, length); in iscsit_get_immediate_data()
1333 rc = iscsit_dump_data_payload(cmd->conn, length, 1); in iscsit_get_immediate_data()
1338 immed_ret = iscsit_handle_immediate_data(cmd, hdr, in iscsit_get_immediate_data()
1339 cmd->first_burst_len); in iscsit_get_immediate_data()
1348 cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, in iscsit_get_immediate_data()
1353 if (cmd->sense_reason || cmdsn_ret == CMDSN_LOWER_THAN_EXP) { in iscsit_get_immediate_data()
1354 target_put_sess_cmd(&cmd->se_cmd); in iscsit_get_immediate_data()
1357 } else if (cmd->unsolicited_data) in iscsit_get_immediate_data()
1358 iscsit_set_unsolicited_dataout(cmd); in iscsit_get_immediate_data()
1372 cmd->i_state = ISTATE_REMOVE; in iscsit_get_immediate_data()
1373 iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, cmd->i_state); in iscsit_get_immediate_data()
1381 iscsit_handle_scsi_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_scsi_cmd() argument
1388 rc = iscsit_setup_scsi_cmd(conn, cmd, buf); in iscsit_handle_scsi_cmd()
1395 if (iscsit_allocate_iovecs(cmd) < 0) { in iscsit_handle_scsi_cmd()
1396 return iscsit_reject_cmd(cmd, in iscsit_handle_scsi_cmd()
1399 immed_data = cmd->immediate_data; in iscsit_handle_scsi_cmd()
1401 rc = iscsit_process_scsi_cmd(conn, cmd, hdr); in iscsit_handle_scsi_cmd()
1410 return iscsit_get_immediate_data(cmd, hdr, dump_payload); in iscsit_handle_scsi_cmd()
1415 struct iscsit_cmd *cmd, in iscsit_do_crypto_hash_sg() argument
1427 sg = cmd->first_data_sg; in iscsit_do_crypto_hash_sg()
1428 page_off = cmd->first_data_sg_off; in iscsit_do_crypto_hash_sg()
1488 struct iscsit_cmd *cmd, u32 payload_length, in __iscsit_check_dataout_hdr() argument
1503 if (cmd->cmd_flags & ICF_GOT_LAST_DATAOUT) { in __iscsit_check_dataout_hdr()
1506 cmd->init_task_tag); in __iscsit_check_dataout_hdr()
1510 if (cmd->data_direction != DMA_TO_DEVICE) { in __iscsit_check_dataout_hdr()
1512 " NON-WRITE command.\n", cmd->init_task_tag); in __iscsit_check_dataout_hdr()
1515 se_cmd = &cmd->se_cmd; in __iscsit_check_dataout_hdr()
1516 iscsit_mod_dataout_timer(cmd); in __iscsit_check_dataout_hdr()
1518 if ((be32_to_cpu(hdr->offset) + payload_length) > cmd->se_cmd.data_length) { in __iscsit_check_dataout_hdr()
1521 cmd->se_cmd.data_length); in __iscsit_check_dataout_hdr()
1522 return iscsit_reject_cmd(cmd, ISCSI_REASON_BOOKMARK_INVALID, buf); in __iscsit_check_dataout_hdr()
1525 if (cmd->unsolicited_data) { in __iscsit_check_dataout_hdr()
1531 transport_send_check_condition_and_sense(&cmd->se_cmd, in __iscsit_check_dataout_hdr()
1553 iscsit_stop_dataout_timer(cmd); in __iscsit_check_dataout_hdr()
1570 --cmd->outstanding_r2ts < 1) in __iscsit_check_dataout_hdr()
1571 iscsit_stop_dataout_timer(cmd); in __iscsit_check_dataout_hdr()
1580 rc = iscsit_check_pre_dataout(cmd, buf); in __iscsit_check_dataout_hdr()
1595 struct iscsit_cmd *cmd; in iscsit_check_dataout_hdr() local
1612 cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, payload_length); in iscsit_check_dataout_hdr()
1613 if (!cmd) in iscsit_check_dataout_hdr()
1616 rc = __iscsit_check_dataout_hdr(conn, buf, cmd, payload_length, &success); in iscsit_check_dataout_hdr()
1619 *out_cmd = cmd; in iscsit_check_dataout_hdr()
1626 iscsit_get_dataout(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_get_dataout() argument
1634 payload_length = min_t(u32, cmd->se_cmd.data_length, in iscsit_get_dataout()
1637 iov = &cmd->iov_data[0]; in iscsit_get_dataout()
1639 iov_ret = iscsit_map_iovec(cmd, iov, cmd->orig_iov_data_count - 2, in iscsit_get_dataout()
1648 iov[iov_count].iov_base = cmd->pad_bytes; in iscsit_get_dataout()
1660 WARN_ON_ONCE(iov_count > cmd->orig_iov_data_count); in iscsit_get_dataout()
1661 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_get_dataout()
1663 iscsit_unmap_iovec(cmd); in iscsit_get_dataout()
1671 data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd, in iscsit_get_dataout()
1674 cmd->pad_bytes); in iscsit_get_dataout()
1694 iscsit_check_dataout_payload(struct iscsit_cmd *cmd, struct iscsi_data *hdr, in iscsit_check_dataout_payload() argument
1697 struct iscsit_conn *conn = cmd->conn; in iscsit_check_dataout_payload()
1703 rc = iscsit_check_post_dataout(cmd, (unsigned char *)hdr, data_crc_failed); in iscsit_check_dataout_payload()
1707 iscsit_set_dataout_sequence_values(cmd); in iscsit_check_dataout_payload()
1708 conn->conn_transport->iscsit_get_dataout(conn, cmd, false); in iscsit_check_dataout_payload()
1714 spin_lock_bh(&cmd->istate_lock); in iscsit_check_dataout_payload()
1715 ooo_cmdsn = (cmd->cmd_flags & ICF_OOO_CMDSN); in iscsit_check_dataout_payload()
1716 cmd->cmd_flags |= ICF_GOT_LAST_DATAOUT; in iscsit_check_dataout_payload()
1717 cmd->i_state = ISTATE_RECEIVED_LAST_DATAOUT; in iscsit_check_dataout_payload()
1718 spin_unlock_bh(&cmd->istate_lock); in iscsit_check_dataout_payload()
1720 iscsit_stop_dataout_timer(cmd); in iscsit_check_dataout_payload()
1723 target_execute_cmd(&cmd->se_cmd); in iscsit_check_dataout_payload()
1734 struct iscsit_cmd *cmd = NULL; in iscsit_handle_data_out() local
1739 rc = iscsit_check_dataout_hdr(conn, buf, &cmd); in iscsit_handle_data_out()
1742 else if (!cmd) in iscsit_handle_data_out()
1745 rc = iscsit_get_dataout(conn, cmd, hdr); in iscsit_handle_data_out()
1751 return iscsit_check_dataout_payload(cmd, hdr, data_crc_failed); in iscsit_handle_data_out()
1754 int iscsit_setup_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_setup_nop_out() argument
1761 if (!cmd) in iscsit_setup_nop_out()
1765 return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1772 if (!cmd) in iscsit_setup_nop_out()
1776 return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1785 if (!cmd) in iscsit_setup_nop_out()
1789 return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_nop_out()
1806 cmd->iscsi_opcode = ISCSI_OP_NOOP_OUT; in iscsit_setup_nop_out()
1807 cmd->i_state = ISTATE_SEND_NOPIN; in iscsit_setup_nop_out()
1808 cmd->immediate_cmd = ((hdr->opcode & ISCSI_OP_IMMEDIATE) ? in iscsit_setup_nop_out()
1810 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_nop_out()
1811 cmd->targ_xfer_tag = 0xFFFFFFFF; in iscsit_setup_nop_out()
1812 cmd->cmd_sn = be32_to_cpu(hdr->cmdsn); in iscsit_setup_nop_out()
1813 cmd->exp_stat_sn = be32_to_cpu(hdr->exp_statsn); in iscsit_setup_nop_out()
1814 cmd->data_direction = DMA_NONE; in iscsit_setup_nop_out()
1821 int iscsit_process_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_process_nop_out() argument
1830 if (!cmd) in iscsit_process_nop_out()
1835 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_nop_out()
1841 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_process_nop_out()
1842 cmd->i_state); in iscsit_process_nop_out()
1846 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_nop_out()
1876 if (cmd) in iscsit_process_nop_out()
1877 iscsit_free_cmd(cmd, false); in iscsit_process_nop_out()
1883 static int iscsit_handle_nop_out(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_nop_out() argument
1892 ret = iscsit_setup_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1908 iov = &cmd->iov_misc[0]; in iscsit_handle_nop_out()
1916 iov[niov].iov_base = &cmd->pad_bytes; in iscsit_handle_nop_out()
1926 WARN_ON_ONCE(niov > ARRAY_SIZE(cmd->iov_misc)); in iscsit_handle_nop_out()
1927 rx_got = rx_data(conn, &cmd->iov_misc[0], niov, rx_size); in iscsit_handle_nop_out()
1936 cmd->pad_bytes, &data_crc); in iscsit_handle_nop_out()
1970 cmd->buf_ptr = ping_data; in iscsit_handle_nop_out()
1971 cmd->buf_ptr_size = payload_length; in iscsit_handle_nop_out()
1978 return iscsit_process_nop_out(conn, cmd, hdr); in iscsit_handle_nop_out()
1980 if (cmd) in iscsit_handle_nop_out()
1981 iscsit_free_cmd(cmd, false); in iscsit_handle_nop_out()
2010 iscsit_handle_task_mgt_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_task_mgt_cmd() argument
2040 return iscsit_add_reject_cmd(cmd, in iscsit_handle_task_mgt_cmd()
2047 cmd->data_direction = DMA_NONE; in iscsit_handle_task_mgt_cmd()
2048 cmd->tmr_req = kzalloc(sizeof(*cmd->tmr_req), GFP_KERNEL); in iscsit_handle_task_mgt_cmd()
2049 if (!cmd->tmr_req) { in iscsit_handle_task_mgt_cmd()
2050 return iscsit_add_reject_cmd(cmd, in iscsit_handle_task_mgt_cmd()
2055 __target_init_cmd(&cmd->se_cmd, &iscsi_ops, in iscsit_handle_task_mgt_cmd()
2057 TCM_SIMPLE_TAG, cmd->sense_buffer + 2, in iscsit_handle_task_mgt_cmd()
2060 target_get_sess_cmd(&cmd->se_cmd, true); in iscsit_handle_task_mgt_cmd()
2071 return iscsit_add_reject_cmd(cmd, in iscsit_handle_task_mgt_cmd()
2075 ret = core_tmr_alloc_req(&cmd->se_cmd, cmd->tmr_req, tcm_function, in iscsit_handle_task_mgt_cmd()
2078 return iscsit_add_reject_cmd(cmd, in iscsit_handle_task_mgt_cmd()
2081 cmd->tmr_req->se_tmr_req = cmd->se_cmd.se_tmr_req; in iscsit_handle_task_mgt_cmd()
2083 cmd->iscsi_opcode = ISCSI_OP_SCSI_TMFUNC; in iscsit_handle_task_mgt_cmd()
2084 cmd->i_state = ISTATE_SEND_TASKMGTRSP; in iscsit_handle_task_mgt_cmd()
2085 cmd->immediate_cmd = ((hdr->opcode & ISCSI_OP_IMMEDIATE) ? 1 : 0); in iscsit_handle_task_mgt_cmd()
2086 cmd->init_task_tag = hdr->itt; in iscsit_handle_task_mgt_cmd()
2087 cmd->targ_xfer_tag = 0xFFFFFFFF; in iscsit_handle_task_mgt_cmd()
2088 cmd->cmd_sn = be32_to_cpu(hdr->cmdsn); in iscsit_handle_task_mgt_cmd()
2089 cmd->exp_stat_sn = be32_to_cpu(hdr->exp_statsn); in iscsit_handle_task_mgt_cmd()
2090 se_tmr = cmd->se_cmd.se_tmr_req; in iscsit_handle_task_mgt_cmd()
2091 tmr_req = cmd->tmr_req; in iscsit_handle_task_mgt_cmd()
2096 ret = transport_lookup_tmr_lun(&cmd->se_cmd); in iscsit_handle_task_mgt_cmd()
2105 se_tmr->response = iscsit_tmr_abort_task(cmd, buf); in iscsit_handle_task_mgt_cmd()
2127 se_tmr->response = iscsit_tmr_task_reassign(cmd, buf); in iscsit_handle_task_mgt_cmd()
2136 return iscsit_add_reject_cmd(cmd, in iscsit_handle_task_mgt_cmd()
2151 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_task_mgt_cmd()
2155 int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_task_mgt_cmd()
2159 target_put_sess_cmd(&cmd->se_cmd); in iscsit_handle_task_mgt_cmd()
2173 return transport_generic_handle_tmr(&cmd->se_cmd); in iscsit_handle_task_mgt_cmd()
2183 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_handle_task_mgt_cmd()
2184 target_put_sess_cmd(&cmd->se_cmd); in iscsit_handle_task_mgt_cmd()
2191 iscsit_setup_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_setup_text_cmd() argument
2200 return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_setup_text_cmd()
2207 return iscsit_reject_cmd(cmd, ISCSI_REASON_CMD_NOT_SUPPORTED, in iscsit_setup_text_cmd()
2215 cmd->iscsi_opcode = ISCSI_OP_TEXT; in iscsit_setup_text_cmd()
2216 cmd->i_state = ISTATE_SEND_TEXTRSP; in iscsit_setup_text_cmd()
2217 cmd->immediate_cmd = ((hdr->opcode & ISCSI_OP_IMMEDIATE) ? 1 : 0); in iscsit_setup_text_cmd()
2218 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_setup_text_cmd()
2219 cmd->targ_xfer_tag = 0xFFFFFFFF; in iscsit_setup_text_cmd()
2220 cmd->cmd_sn = be32_to_cpu(hdr->cmdsn); in iscsit_setup_text_cmd()
2221 cmd->exp_stat_sn = be32_to_cpu(hdr->exp_statsn); in iscsit_setup_text_cmd()
2222 cmd->data_direction = DMA_NONE; in iscsit_setup_text_cmd()
2223 kfree(cmd->text_in_ptr); in iscsit_setup_text_cmd()
2224 cmd->text_in_ptr = NULL; in iscsit_setup_text_cmd()
2231 iscsit_process_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_process_text_cmd() argument
2234 unsigned char *text_in = cmd->text_in_ptr, *text_ptr; in iscsit_process_text_cmd()
2238 cmd->targ_xfer_tag = be32_to_cpu(hdr->ttt); in iscsit_process_text_cmd()
2239 if (cmd->targ_xfer_tag == 0xFFFFFFFF) { in iscsit_process_text_cmd()
2255 cmd->cmd_flags |= ICF_SENDTARGETS_ALL; in iscsit_process_text_cmd()
2258 cmd->cmd_flags |= ICF_SENDTARGETS_SINGLE; in iscsit_process_text_cmd()
2266 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_process_text_cmd()
2273 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, in iscsit_process_text_cmd()
2281 return iscsit_execute_cmd(cmd, 0); in iscsit_process_text_cmd()
2284 return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, in iscsit_process_text_cmd()
2290 iscsit_handle_text_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_text_cmd() argument
2298 rc = iscsit_setup_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2314 cmd->text_in_ptr = text_in; in iscsit_handle_text_cmd()
2371 return iscsit_process_text_cmd(conn, cmd, hdr); in iscsit_handle_text_cmd()
2374 kfree(cmd->text_in_ptr); in iscsit_handle_text_cmd()
2375 cmd->text_in_ptr = NULL; in iscsit_handle_text_cmd()
2376 return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, buf); in iscsit_handle_text_cmd()
2379 int iscsit_logout_closesession(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_logout_closesession() argument
2404 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closesession()
2409 int iscsit_logout_closeconnection(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_logout_closeconnection() argument
2415 " %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_closeconnection()
2421 if (conn->cid == cmd->logout_cid) { in iscsit_logout_closeconnection()
2441 cmd->logout_cid); in iscsit_logout_closeconnection()
2443 cmd->logout_response = ISCSI_LOGOUT_CID_NOT_FOUND; in iscsit_logout_closeconnection()
2444 iscsit_add_cmd_to_response_queue(cmd, conn, in iscsit_logout_closeconnection()
2445 cmd->i_state); in iscsit_logout_closeconnection()
2452 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_closeconnection()
2457 int iscsit_logout_removeconnforrecovery(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_logout_removeconnforrecovery() argument
2462 " CID: %hu on CID: %hu.\n", cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2467 cmd->logout_response = ISCSI_LOGOUT_RECOVERY_UNSUPPORTED; in iscsit_logout_removeconnforrecovery()
2468 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2472 if (conn->cid == cmd->logout_cid) { in iscsit_logout_removeconnforrecovery()
2475 cmd->logout_cid, conn->cid); in iscsit_logout_removeconnforrecovery()
2476 cmd->logout_response = ISCSI_LOGOUT_CLEANUP_FAILED; in iscsit_logout_removeconnforrecovery()
2477 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2481 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); in iscsit_logout_removeconnforrecovery()
2487 iscsit_handle_logout_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd, in iscsit_handle_logout_cmd() argument
2515 iscsit_free_cmd(cmd, false); in iscsit_handle_logout_cmd()
2519 cmd->iscsi_opcode = ISCSI_OP_LOGOUT; in iscsit_handle_logout_cmd()
2520 cmd->i_state = ISTATE_SEND_LOGOUTRSP; in iscsit_handle_logout_cmd()
2521 cmd->immediate_cmd = ((hdr->opcode & ISCSI_OP_IMMEDIATE) ? 1 : 0); in iscsit_handle_logout_cmd()
2522 conn->sess->init_task_tag = cmd->init_task_tag = hdr->itt; in iscsit_handle_logout_cmd()
2523 cmd->targ_xfer_tag = 0xFFFFFFFF; in iscsit_handle_logout_cmd()
2524 cmd->cmd_sn = be32_to_cpu(hdr->cmdsn); in iscsit_handle_logout_cmd()
2525 cmd->exp_stat_sn = be32_to_cpu(hdr->exp_statsn); in iscsit_handle_logout_cmd()
2526 cmd->logout_cid = be16_to_cpu(hdr->cid); in iscsit_handle_logout_cmd()
2527 cmd->logout_reason = reason_code; in iscsit_handle_logout_cmd()
2528 cmd->data_direction = DMA_NONE; in iscsit_handle_logout_cmd()
2540 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); in iscsit_handle_logout_cmd()
2550 if (cmd->immediate_cmd) { in iscsit_handle_logout_cmd()
2551 int ret = iscsit_execute_cmd(cmd, 0); in iscsit_handle_logout_cmd()
2556 cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); in iscsit_handle_logout_cmd()
2633 struct iscsit_cmd *cmd, in iscsit_handle_immediate_data() argument
2639 struct iscsit_conn *conn = cmd->conn; in iscsit_handle_immediate_data()
2643 BUG_ON(cmd->write_data_done > cmd->se_cmd.data_length); in iscsit_handle_immediate_data()
2644 rx_size = min(cmd->se_cmd.data_length - cmd->write_data_done, length); in iscsit_handle_immediate_data()
2645 iov_ret = iscsit_map_iovec(cmd, cmd->iov_data, in iscsit_handle_immediate_data()
2646 cmd->orig_iov_data_count - 2, in iscsit_handle_immediate_data()
2647 cmd->write_data_done, rx_size); in iscsit_handle_immediate_data()
2652 iov = &cmd->iov_data[0]; in iscsit_handle_immediate_data()
2660 iscsit_unmap_iovec(cmd); in iscsit_handle_immediate_data()
2663 cmd->overflow_buf = overflow_buf; in iscsit_handle_immediate_data()
2672 iov[iov_count].iov_base = cmd->pad_bytes; in iscsit_handle_immediate_data()
2683 WARN_ON_ONCE(iov_count > cmd->orig_iov_data_count); in iscsit_handle_immediate_data()
2684 rx_got = rx_data(conn, &cmd->iov_data[0], iov_count, rx_size); in iscsit_handle_immediate_data()
2686 iscsit_unmap_iovec(cmd); in iscsit_handle_immediate_data()
2696 data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd, in iscsit_handle_immediate_data()
2697 cmd->write_data_done, length, padding, in iscsit_handle_immediate_data()
2698 cmd->pad_bytes); in iscsit_handle_immediate_data()
2709 iscsit_reject_cmd(cmd, in iscsit_handle_immediate_data()
2714 iscsit_reject_cmd(cmd, in iscsit_handle_immediate_data()
2726 cmd->write_data_done += length; in iscsit_handle_immediate_data()
2728 if (cmd->write_data_done == cmd->se_cmd.data_length) { in iscsit_handle_immediate_data()
2729 spin_lock_bh(&cmd->istate_lock); in iscsit_handle_immediate_data()
2730 cmd->cmd_flags |= ICF_GOT_LAST_DATAOUT; in iscsit_handle_immediate_data()
2731 cmd->i_state = ISTATE_RECEIVED_LAST_DATAOUT; in iscsit_handle_immediate_data()
2732 spin_unlock_bh(&cmd->istate_lock); in iscsit_handle_immediate_data()
2742 struct iscsit_cmd *cmd; in iscsit_build_conn_drop_async_message() local
2763 cmd = iscsit_allocate_cmd(conn_p, TASK_RUNNING); in iscsit_build_conn_drop_async_message()
2764 if (!cmd) { in iscsit_build_conn_drop_async_message()
2769 cmd->logout_cid = conn->cid; in iscsit_build_conn_drop_async_message()
2770 cmd->iscsi_opcode = ISCSI_OP_ASYNC_EVENT; in iscsit_build_conn_drop_async_message()
2771 cmd->i_state = ISTATE_SEND_ASYNCMSG; in iscsit_build_conn_drop_async_message()
2774 list_add_tail(&cmd->i_conn_node, &conn_p->conn_cmd_list); in iscsit_build_conn_drop_async_message()
2777 iscsit_add_cmd_to_response_queue(cmd, conn_p, cmd->i_state); in iscsit_build_conn_drop_async_message()
2782 struct iscsit_cmd *cmd, in iscsit_send_conn_drop_async_message() argument
2787 cmd->iscsi_opcode = ISCSI_OP_ASYNC_EVENT; in iscsit_send_conn_drop_async_message()
2789 hdr = (struct iscsi_async *) cmd->pdu; in iscsit_send_conn_drop_async_message()
2792 cmd->init_task_tag = RESERVED_ITT; in iscsit_send_conn_drop_async_message()
2793 cmd->targ_xfer_tag = 0xFFFFFFFF; in iscsit_send_conn_drop_async_message()
2795 cmd->stat_sn = conn->stat_sn++; in iscsit_send_conn_drop_async_message()
2796 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_send_conn_drop_async_message()
2800 hdr->param1 = cpu_to_be16(cmd->logout_cid); in iscsit_send_conn_drop_async_message()
2805 " 0x%08x, for CID: %hu on CID: %hu\n", cmd->stat_sn, in iscsit_send_conn_drop_async_message()
2806 cmd->logout_cid, conn->cid); in iscsit_send_conn_drop_async_message()
2808 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_conn_drop_async_message()
2822 iscsit_build_datain_pdu(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_datain_pdu() argument
2829 if (cmd->se_cmd.se_cmd_flags & SCF_OVERFLOW_BIT) { in iscsit_build_datain_pdu()
2831 hdr->residual_count = cpu_to_be32(cmd->se_cmd.residual_count); in iscsit_build_datain_pdu()
2832 } else if (cmd->se_cmd.se_cmd_flags & SCF_UNDERFLOW_BIT) { in iscsit_build_datain_pdu()
2834 hdr->residual_count = cpu_to_be32(cmd->se_cmd.residual_count); in iscsit_build_datain_pdu()
2839 int_to_scsilun(cmd->se_cmd.orig_fe_lun, in iscsit_build_datain_pdu()
2844 hdr->itt = cmd->init_task_tag; in iscsit_build_datain_pdu()
2847 hdr->ttt = cpu_to_be32(cmd->targ_xfer_tag); in iscsit_build_datain_pdu()
2851 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_datain_pdu()
2862 cmd->init_task_tag, ntohl(hdr->statsn), ntohl(hdr->datasn), in iscsit_build_datain_pdu()
2867 static int iscsit_send_datain(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_datain() argument
2869 struct iscsi_data_rsp *hdr = (struct iscsi_data_rsp *)&cmd->pdu[0]; in iscsit_send_datain()
2876 dr = iscsit_get_datain_values(cmd, &datain); in iscsit_send_datain()
2879 cmd->init_task_tag); in iscsit_send_datain()
2885 if ((datain.offset + datain.length) > cmd->se_cmd.data_length) { in iscsit_send_datain()
2888 cmd->init_task_tag, datain.offset, datain.length, in iscsit_send_datain()
2889 cmd->se_cmd.data_length); in iscsit_send_datain()
2899 (cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE)) in iscsit_send_datain()
2904 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_send_datain()
2905 cmd->stat_sn = conn->stat_sn++; in iscsit_send_datain()
2912 iscsit_build_datain_pdu(cmd, conn, &datain, hdr, set_statsn); in iscsit_send_datain()
2914 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, dr, &datain, 0); in iscsit_send_datain()
2919 eodr = (cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) ? in iscsit_send_datain()
2921 iscsit_free_datain_req(cmd, dr); in iscsit_send_datain()
2928 iscsit_build_logout_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_logout_rsp() argument
2939 switch (cmd->logout_reason) { in iscsit_build_logout_rsp()
2943 cmd->logout_response = ISCSI_LOGOUT_SUCCESS; in iscsit_build_logout_rsp()
2946 if (cmd->logout_response == ISCSI_LOGOUT_CID_NOT_FOUND) in iscsit_build_logout_rsp()
2961 " successful.\n", cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2962 cmd->logout_response = ISCSI_LOGOUT_SUCCESS; in iscsit_build_logout_rsp()
2965 if ((cmd->logout_response == ISCSI_LOGOUT_RECOVERY_UNSUPPORTED) || in iscsit_build_logout_rsp()
2966 (cmd->logout_response == ISCSI_LOGOUT_CLEANUP_FAILED)) in iscsit_build_logout_rsp()
2973 cmd->logout_cid); in iscsit_build_logout_rsp()
2980 conn->sess, cmd->logout_cid); in iscsit_build_logout_rsp()
2984 cmd->logout_cid); in iscsit_build_logout_rsp()
2985 cmd->logout_response = ISCSI_LOGOUT_CID_NOT_FOUND; in iscsit_build_logout_rsp()
2989 iscsit_discard_cr_cmds_by_expstatsn(cr, cmd->exp_stat_sn); in iscsit_build_logout_rsp()
2993 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
2994 cmd->logout_response = ISCSI_LOGOUT_SUCCESS; in iscsit_build_logout_rsp()
2998 cmd->logout_reason); in iscsit_build_logout_rsp()
3004 hdr->response = cmd->logout_response; in iscsit_build_logout_rsp()
3005 hdr->itt = cmd->init_task_tag; in iscsit_build_logout_rsp()
3006 cmd->stat_sn = conn->stat_sn++; in iscsit_build_logout_rsp()
3007 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_logout_rsp()
3009 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_logout_rsp()
3015 cmd->init_task_tag, cmd->stat_sn, hdr->response, in iscsit_build_logout_rsp()
3016 cmd->logout_cid, conn->cid); in iscsit_build_logout_rsp()
3023 iscsit_send_logout(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_logout() argument
3027 rc = iscsit_build_logout_rsp(cmd, conn, in iscsit_send_logout()
3028 (struct iscsi_logout_rsp *)&cmd->pdu[0]); in iscsit_send_logout()
3032 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_logout()
3036 iscsit_build_nopin_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_nopin_rsp() argument
3041 hton24(hdr->dlength, cmd->buf_ptr_size); in iscsit_build_nopin_rsp()
3044 hdr->itt = cmd->init_task_tag; in iscsit_build_nopin_rsp()
3045 hdr->ttt = cpu_to_be32(cmd->targ_xfer_tag); in iscsit_build_nopin_rsp()
3046 cmd->stat_sn = (nopout_response) ? conn->stat_sn++ : in iscsit_build_nopin_rsp()
3048 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_nopin_rsp()
3051 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_nopin_rsp()
3058 "Solicited" : "Unsolicited", cmd->init_task_tag, in iscsit_build_nopin_rsp()
3059 cmd->targ_xfer_tag, cmd->stat_sn, cmd->buf_ptr_size); in iscsit_build_nopin_rsp()
3067 struct iscsit_cmd *cmd, in iscsit_send_unsolicited_nopin() argument
3071 struct iscsi_nopin *hdr = (struct iscsi_nopin *)&cmd->pdu[0]; in iscsit_send_unsolicited_nopin()
3074 iscsit_build_nopin_rsp(cmd, conn, hdr, false); in iscsit_send_unsolicited_nopin()
3077 " 0x%08x CID: %hu\n", hdr->ttt, cmd->stat_sn, conn->cid); in iscsit_send_unsolicited_nopin()
3079 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_unsolicited_nopin()
3083 spin_lock_bh(&cmd->istate_lock); in iscsit_send_unsolicited_nopin()
3084 cmd->i_state = want_response ? in iscsit_send_unsolicited_nopin()
3086 spin_unlock_bh(&cmd->istate_lock); in iscsit_send_unsolicited_nopin()
3092 iscsit_send_nopin(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_nopin() argument
3094 struct iscsi_nopin *hdr = (struct iscsi_nopin *)&cmd->pdu[0]; in iscsit_send_nopin()
3096 iscsit_build_nopin_rsp(cmd, conn, hdr, true); in iscsit_send_nopin()
3102 pr_debug("Echoing back %u bytes of ping data.\n", cmd->buf_ptr_size); in iscsit_send_nopin()
3104 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_nopin()
3105 cmd->buf_ptr, in iscsit_send_nopin()
3106 cmd->buf_ptr_size); in iscsit_send_nopin()
3110 struct iscsit_cmd *cmd, in iscsit_send_r2t() argument
3117 r2t = iscsit_get_r2t_from_list(cmd); in iscsit_send_r2t()
3121 hdr = (struct iscsi_r2t_rsp *) cmd->pdu; in iscsit_send_r2t()
3125 int_to_scsilun(cmd->se_cmd.orig_fe_lun, in iscsit_send_r2t()
3127 hdr->itt = cmd->init_task_tag; in iscsit_send_r2t()
3129 conn->conn_transport->iscsit_get_r2t_ttt(conn, cmd, r2t); in iscsit_send_r2t()
3142 (!r2t->recovery_r2t) ? "" : "Recovery ", cmd->init_task_tag, in iscsit_send_r2t()
3146 spin_lock_bh(&cmd->r2t_lock); in iscsit_send_r2t()
3148 spin_unlock_bh(&cmd->r2t_lock); in iscsit_send_r2t()
3150 ret = conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_r2t()
3155 spin_lock_bh(&cmd->dataout_timeout_lock); in iscsit_send_r2t()
3156 iscsit_start_dataout_timer(cmd, conn); in iscsit_send_r2t()
3157 spin_unlock_bh(&cmd->dataout_timeout_lock); in iscsit_send_r2t()
3168 struct iscsit_cmd *cmd, in iscsit_build_r2ts_for_cmd() argument
3174 spin_lock_bh(&cmd->r2t_lock); in iscsit_build_r2ts_for_cmd()
3175 if (cmd->cmd_flags & ICF_SENT_LAST_R2T) { in iscsit_build_r2ts_for_cmd()
3176 spin_unlock_bh(&cmd->r2t_lock); in iscsit_build_r2ts_for_cmd()
3182 cmd->r2t_offset = max(cmd->r2t_offset, cmd->write_data_done); in iscsit_build_r2ts_for_cmd()
3184 while (cmd->outstanding_r2ts < conn->sess->sess_ops->MaxOutstandingR2T) { in iscsit_build_r2ts_for_cmd()
3186 offset = cmd->r2t_offset; in iscsit_build_r2ts_for_cmd()
3191 cmd->next_burst_len; in iscsit_build_r2ts_for_cmd()
3193 if (new_data_end > cmd->se_cmd.data_length) in iscsit_build_r2ts_for_cmd()
3194 xfer_len = cmd->se_cmd.data_length - offset; in iscsit_build_r2ts_for_cmd()
3198 cmd->next_burst_len; in iscsit_build_r2ts_for_cmd()
3203 if (new_data_end > cmd->se_cmd.data_length) in iscsit_build_r2ts_for_cmd()
3204 xfer_len = cmd->se_cmd.data_length - offset; in iscsit_build_r2ts_for_cmd()
3210 cmd->cmd_flags |= ICF_SENT_LAST_R2T; in iscsit_build_r2ts_for_cmd()
3214 cmd->r2t_offset += xfer_len; in iscsit_build_r2ts_for_cmd()
3216 if (cmd->r2t_offset == cmd->se_cmd.data_length) in iscsit_build_r2ts_for_cmd()
3217 cmd->cmd_flags |= ICF_SENT_LAST_R2T; in iscsit_build_r2ts_for_cmd()
3221 seq = iscsit_get_seq_holder_for_r2t(cmd); in iscsit_build_r2ts_for_cmd()
3223 spin_unlock_bh(&cmd->r2t_lock); in iscsit_build_r2ts_for_cmd()
3230 if (cmd->seq_send_order == cmd->seq_count) in iscsit_build_r2ts_for_cmd()
3231 cmd->cmd_flags |= ICF_SENT_LAST_R2T; in iscsit_build_r2ts_for_cmd()
3233 cmd->outstanding_r2ts++; in iscsit_build_r2ts_for_cmd()
3236 if (iscsit_add_r2t_to_list(cmd, offset, xfer_len, 0, 0) < 0) { in iscsit_build_r2ts_for_cmd()
3237 spin_unlock_bh(&cmd->r2t_lock); in iscsit_build_r2ts_for_cmd()
3241 if (cmd->cmd_flags & ICF_SENT_LAST_R2T) in iscsit_build_r2ts_for_cmd()
3244 spin_unlock_bh(&cmd->r2t_lock); in iscsit_build_r2ts_for_cmd()
3250 void iscsit_build_rsp_pdu(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_rsp_pdu() argument
3254 cmd->stat_sn = conn->stat_sn++; in iscsit_build_rsp_pdu()
3261 if (cmd->se_cmd.se_cmd_flags & SCF_OVERFLOW_BIT) { in iscsit_build_rsp_pdu()
3263 hdr->residual_count = cpu_to_be32(cmd->se_cmd.residual_count); in iscsit_build_rsp_pdu()
3264 } else if (cmd->se_cmd.se_cmd_flags & SCF_UNDERFLOW_BIT) { in iscsit_build_rsp_pdu()
3266 hdr->residual_count = cpu_to_be32(cmd->se_cmd.residual_count); in iscsit_build_rsp_pdu()
3268 hdr->response = cmd->iscsi_response; in iscsit_build_rsp_pdu()
3269 hdr->cmd_status = cmd->se_cmd.scsi_status; in iscsit_build_rsp_pdu()
3270 hdr->itt = cmd->init_task_tag; in iscsit_build_rsp_pdu()
3271 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_rsp_pdu()
3273 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_rsp_pdu()
3279 cmd->init_task_tag, cmd->stat_sn, cmd->se_cmd.scsi_status, in iscsit_build_rsp_pdu()
3280 cmd->se_cmd.scsi_status, conn->cid); in iscsit_build_rsp_pdu()
3284 static int iscsit_send_response(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_response() argument
3286 struct iscsi_scsi_rsp *hdr = (struct iscsi_scsi_rsp *)&cmd->pdu[0]; in iscsit_send_response()
3287 bool inc_stat_sn = (cmd->i_state == ISTATE_SEND_STATUS); in iscsit_send_response()
3291 iscsit_build_rsp_pdu(cmd, conn, inc_stat_sn, hdr); in iscsit_send_response()
3296 if (cmd->se_cmd.sense_buffer && in iscsit_send_response()
3297 ((cmd->se_cmd.se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || in iscsit_send_response()
3298 (cmd->se_cmd.se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { in iscsit_send_response()
3299 put_unaligned_be16(cmd->se_cmd.scsi_sense_length, cmd->sense_buffer); in iscsit_send_response()
3300 cmd->se_cmd.scsi_sense_length += sizeof (__be16); in iscsit_send_response()
3302 padding = -(cmd->se_cmd.scsi_sense_length) & 3; in iscsit_send_response()
3303 hton24(hdr->dlength, (u32)cmd->se_cmd.scsi_sense_length); in iscsit_send_response()
3304 data_buf = cmd->sense_buffer; in iscsit_send_response()
3305 data_buf_len = cmd->se_cmd.scsi_sense_length + padding; in iscsit_send_response()
3308 memset(cmd->sense_buffer + in iscsit_send_response()
3309 cmd->se_cmd.scsi_sense_length, 0, padding); in iscsit_send_response()
3316 cmd->se_cmd.scsi_sense_length); in iscsit_send_response()
3319 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, data_buf, in iscsit_send_response()
3341 iscsit_build_task_mgt_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_task_mgt_rsp() argument
3344 struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req; in iscsit_build_task_mgt_rsp()
3349 hdr->itt = cmd->init_task_tag; in iscsit_build_task_mgt_rsp()
3350 cmd->stat_sn = conn->stat_sn++; in iscsit_build_task_mgt_rsp()
3351 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_task_mgt_rsp()
3353 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_task_mgt_rsp()
3359 cmd->init_task_tag, cmd->stat_sn, hdr->response, conn->cid); in iscsit_build_task_mgt_rsp()
3364 iscsit_send_task_mgt_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn) in iscsit_send_task_mgt_rsp() argument
3366 struct iscsi_tm_rsp *hdr = (struct iscsi_tm_rsp *)&cmd->pdu[0]; in iscsit_send_task_mgt_rsp()
3368 iscsit_build_task_mgt_rsp(cmd, conn, hdr); in iscsit_send_task_mgt_rsp()
3370 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, NULL, 0); in iscsit_send_task_mgt_rsp()
3376 iscsit_build_sendtargets_response(struct iscsit_cmd *cmd, in iscsit_build_sendtargets_response() argument
3381 struct iscsit_conn *conn = cmd->conn; in iscsit_build_sendtargets_response()
3388 unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL; in iscsit_build_sendtargets_response()
3402 if (cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) { in iscsit_build_sendtargets_response()
3418 if ((cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) && in iscsit_build_sendtargets_response()
3436 cmd->conn->sess->sess_ops->InitiatorName))) { in iscsit_build_sendtargets_response()
3515 if (cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) in iscsit_build_sendtargets_response()
3520 cmd->buf_ptr = payload; in iscsit_build_sendtargets_response()
3526 iscsit_build_text_rsp(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_text_rsp() argument
3533 text_length = iscsit_build_sendtargets_response(cmd, network_transport, in iscsit_build_text_rsp()
3534 cmd->read_data_done, in iscsit_build_text_rsp()
3543 cmd->read_data_done += text_length; in iscsit_build_text_rsp()
3544 if (cmd->targ_xfer_tag == 0xFFFFFFFF) in iscsit_build_text_rsp()
3545 cmd->targ_xfer_tag = session_get_next_ttt(conn->sess); in iscsit_build_text_rsp()
3550 hdr->itt = cmd->init_task_tag; in iscsit_build_text_rsp()
3551 hdr->ttt = cpu_to_be32(cmd->targ_xfer_tag); in iscsit_build_text_rsp()
3552 cmd->stat_sn = conn->stat_sn++; in iscsit_build_text_rsp()
3553 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_text_rsp()
3555 iscsit_increment_maxcmdsn(cmd, conn->sess); in iscsit_build_text_rsp()
3561 cmd->maxcmdsn_inc = 0; in iscsit_build_text_rsp()
3566 " Length: %u, CID: %hu F: %d C: %d\n", cmd->init_task_tag, in iscsit_build_text_rsp()
3567 cmd->targ_xfer_tag, cmd->stat_sn, text_length, conn->cid, in iscsit_build_text_rsp()
3576 struct iscsit_cmd *cmd, in iscsit_send_text_rsp() argument
3579 struct iscsi_text_rsp *hdr = (struct iscsi_text_rsp *)cmd->pdu; in iscsit_send_text_rsp()
3582 text_length = iscsit_build_text_rsp(cmd, conn, hdr, in iscsit_send_text_rsp()
3587 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_text_rsp()
3588 cmd->buf_ptr, in iscsit_send_text_rsp()
3593 iscsit_build_reject(struct iscsit_cmd *cmd, struct iscsit_conn *conn, in iscsit_build_reject() argument
3597 hdr->reason = cmd->reject_reason; in iscsit_build_reject()
3601 cmd->stat_sn = conn->stat_sn++; in iscsit_build_reject()
3602 hdr->statsn = cpu_to_be32(cmd->stat_sn); in iscsit_build_reject()
3610 struct iscsit_cmd *cmd, in iscsit_send_reject() argument
3613 struct iscsi_reject *hdr = (struct iscsi_reject *)&cmd->pdu[0]; in iscsit_send_reject()
3615 iscsit_build_reject(cmd, conn, hdr); in iscsit_send_reject()
3620 return conn->conn_transport->iscsit_xmit_pdu(conn, cmd, NULL, in iscsit_send_reject()
3621 cmd->buf_ptr, in iscsit_send_reject()
3725 iscsit_immediate_queue(struct iscsit_conn *conn, struct iscsit_cmd *cmd, int state) in iscsit_immediate_queue() argument
3731 ret = iscsit_send_r2t(cmd, conn); in iscsit_immediate_queue()
3737 list_del_init(&cmd->i_conn_node); in iscsit_immediate_queue()
3740 iscsit_free_cmd(cmd, false); in iscsit_immediate_queue()
3744 ret = iscsit_send_unsolicited_nopin(cmd, conn, 1); in iscsit_immediate_queue()
3749 ret = iscsit_send_unsolicited_nopin(cmd, conn, 0); in iscsit_immediate_queue()
3756 cmd->iscsi_opcode, cmd->init_task_tag, state, in iscsit_immediate_queue()
3773 struct iscsit_cmd *cmd; in iscsit_handle_immediate_queue() local
3779 cmd = qr->cmd; in iscsit_handle_immediate_queue()
3783 ret = t->iscsit_immediate_queue(conn, cmd, state); in iscsit_handle_immediate_queue()
3792 iscsit_response_queue(struct iscsit_conn *conn, struct iscsit_cmd *cmd, int state) in iscsit_response_queue() argument
3799 ret = iscsit_send_datain(cmd, conn); in iscsit_response_queue()
3807 spin_lock_bh(&cmd->istate_lock); in iscsit_response_queue()
3808 cmd->i_state = ISTATE_SENT_STATUS; in iscsit_response_queue()
3809 spin_unlock_bh(&cmd->istate_lock); in iscsit_response_queue()
3818 spin_lock_bh(&cmd->istate_lock); in iscsit_response_queue()
3819 cmd->i_state = ISTATE_SEND_STATUS; in iscsit_response_queue()
3820 spin_unlock_bh(&cmd->istate_lock); in iscsit_response_queue()
3828 ret = iscsit_send_response(cmd, conn); in iscsit_response_queue()
3831 ret = iscsit_send_logout(cmd, conn); in iscsit_response_queue()
3835 cmd, conn); in iscsit_response_queue()
3838 ret = iscsit_send_nopin(cmd, conn); in iscsit_response_queue()
3841 ret = iscsit_send_reject(cmd, conn); in iscsit_response_queue()
3844 ret = iscsit_send_task_mgt_rsp(cmd, conn); in iscsit_response_queue()
3847 ret = iscsit_tmr_post_handler(cmd, conn); in iscsit_response_queue()
3852 ret = iscsit_send_text_rsp(cmd, conn); in iscsit_response_queue()
3857 cmd->iscsi_opcode, cmd->init_task_tag, in iscsit_response_queue()
3866 if (!iscsit_logout_post_handler(cmd, conn)) in iscsit_response_queue()
3876 spin_lock_bh(&cmd->istate_lock); in iscsit_response_queue()
3877 cmd->i_state = ISTATE_SENT_STATUS; in iscsit_response_queue()
3878 spin_unlock_bh(&cmd->istate_lock); in iscsit_response_queue()
3883 cmd->iscsi_opcode, cmd->init_task_tag, in iscsit_response_queue()
3884 cmd->i_state, conn->cid); in iscsit_response_queue()
3902 struct iscsit_cmd *cmd; in iscsit_handle_response_queue() local
3907 cmd = qr->cmd; in iscsit_handle_response_queue()
3911 ret = t->iscsit_response_queue(conn, cmd, state); in iscsit_handle_response_queue()
3980 struct iscsit_cmd *cmd; in iscsi_target_rx_opcode() local
3985 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3986 if (!cmd) in iscsi_target_rx_opcode()
3989 ret = iscsit_handle_scsi_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
3995 cmd = NULL; in iscsi_target_rx_opcode()
3997 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
3998 if (!cmd) in iscsi_target_rx_opcode()
4001 ret = iscsit_handle_nop_out(conn, cmd, buf); in iscsi_target_rx_opcode()
4004 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4005 if (!cmd) in iscsi_target_rx_opcode()
4008 ret = iscsit_handle_task_mgt_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4012 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt); in iscsi_target_rx_opcode()
4013 if (!cmd) in iscsi_target_rx_opcode()
4016 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4017 if (!cmd) in iscsi_target_rx_opcode()
4021 ret = iscsit_handle_text_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4024 cmd = iscsit_allocate_cmd(conn, TASK_INTERRUPTIBLE); in iscsi_target_rx_opcode()
4025 if (!cmd) in iscsi_target_rx_opcode()
4028 ret = iscsit_handle_logout_cmd(conn, cmd, buf); in iscsi_target_rx_opcode()
4208 struct iscsit_cmd *cmd = NULL, *cmd_tmp = NULL; in iscsit_release_commands_from_conn() local
4218 list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) { in iscsit_release_commands_from_conn()
4219 struct se_cmd *se_cmd = &cmd->se_cmd; in iscsit_release_commands_from_conn()
4229 list_move_tail(&cmd->i_conn_node, in iscsit_release_commands_from_conn()
4239 list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) { in iscsit_release_commands_from_conn()
4240 list_del_init(&cmd->i_conn_node); in iscsit_release_commands_from_conn()
4242 iscsit_increment_maxcmdsn(cmd, sess); in iscsit_release_commands_from_conn()
4243 iscsit_free_cmd(cmd, true); in iscsit_release_commands_from_conn()
4251 struct iscsit_cmd *cmd; in iscsit_stop_timers_for_cmds() local
4254 list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) { in iscsit_stop_timers_for_cmds()
4255 if (cmd->data_direction == DMA_TO_DEVICE) in iscsit_stop_timers_for_cmds()
4256 iscsit_stop_dataout_timer(cmd); in iscsit_stop_timers_for_cmds()
4656 struct iscsit_cmd *cmd, in iscsit_logout_post_handler() argument
4661 switch (cmd->logout_reason) { in iscsit_logout_post_handler()
4663 switch (cmd->logout_response) { in iscsit_logout_post_handler()
4672 if (conn->cid == cmd->logout_cid) { in iscsit_logout_post_handler()
4673 switch (cmd->logout_response) { in iscsit_logout_post_handler()
4681 switch (cmd->logout_response) { in iscsit_logout_post_handler()
4684 cmd->logout_cid); in iscsit_logout_post_handler()
4695 switch (cmd->logout_response) { in iscsit_logout_post_handler()