drivers/target/iscsi/iscsi_target_tmr.c
Source file repositories/reference/linux-study-clean/drivers/target/iscsi/iscsi_target_tmr.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/target/iscsi/iscsi_target_tmr.c- Extension
.c- Size
- 23694 bytes
- Lines
- 843
- Domain
- Driver Families
- Bucket
- drivers/target
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/unaligned.hscsi/scsi_proto.hscsi/iscsi_proto.htarget/target_core_base.htarget/target_core_fabric.htarget/iscsi/iscsi_transport.htarget/iscsi/iscsi_target_core.hiscsi_target_seq_pdu_list.hiscsi_target_datain_values.hiscsi_target_device.hiscsi_target_erl0.hiscsi_target_erl1.hiscsi_target_erl2.hiscsi_target_tmr.hiscsi_target_tpg.hiscsi_target_util.hiscsi_target.h
Detected Declarations
function iscsit_tmr_abort_taskfunction iscsit_handle_task_mgt_cmdfunction iscsit_tmr_task_cold_resetfunction iscsit_tmr_task_reassignfunction iscsit_task_reassign_remove_cmdfunction iscsit_task_reassign_complete_nop_outfunction iscsit_task_reassign_complete_writefunction iscsit_task_reassign_complete_readfunction iscsit_task_reassign_complete_nonefunction iscsit_task_reassign_complete_scsi_cmndfunction iscsit_task_reassign_completefunction iscsit_tmr_post_handlerfunction iscsit_task_reassign_prepare_readfunction iscsit_task_reassign_prepare_unsolicited_dataoutfunction iscsit_task_reassign_prepare_writefunction list_for_each_entryfunction thefunction iscsit_check_task_reassign_expdatasnfunction iscsit_task_reassign_prepare_writeexport iscsit_tmr_post_handler
Annotated Snippet
if (!(cmd->se_cmd.transport_state & CMD_T_SENT)) {
pr_debug("WRITE ITT: 0x%08x: t_state: %d"
" never sent to transport\n",
cmd->init_task_tag, cmd->se_cmd.t_state);
target_execute_cmd(se_cmd);
return 0;
}
cmd->i_state = ISTATE_SEND_STATUS;
iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
return 0;
}
/*
* Special case to deal with DataSequenceInOrder=No and Non-Immeidate
* Unsolicited DataOut.
*/
if (cmd->unsolicited_data) {
cmd->unsolicited_data = 0;
offset = cmd->next_burst_len = cmd->write_data_done;
if ((conn->sess->sess_ops->FirstBurstLength - offset) >=
cmd->se_cmd.data_length) {
no_build_r2ts = 1;
length = (cmd->se_cmd.data_length - offset);
} else
length = (conn->sess->sess_ops->FirstBurstLength - offset);
spin_lock_bh(&cmd->r2t_lock);
if (iscsit_add_r2t_to_list(cmd, offset, length, 0, 0) < 0) {
spin_unlock_bh(&cmd->r2t_lock);
return -1;
}
cmd->outstanding_r2ts++;
spin_unlock_bh(&cmd->r2t_lock);
if (no_build_r2ts)
return 0;
}
/*
* iscsit_build_r2ts_for_cmd() can handle the rest from here.
*/
return conn->conn_transport->iscsit_get_dataout(conn, cmd, true);
}
static int iscsit_task_reassign_complete_read(
struct iscsit_cmd *cmd,
struct iscsi_tmr_req *tmr_req)
{
struct iscsit_conn *conn = cmd->conn;
struct iscsi_datain_req *dr;
struct se_cmd *se_cmd = &cmd->se_cmd;
/*
* The Initiator must not send a Data SNACK with a BegRun less than
* the TMR TASK_REASSIGN's ExpDataSN.
*/
if (!tmr_req->exp_data_sn) {
cmd->cmd_flags &= ~ICF_GOT_DATACK_SNACK;
cmd->acked_data_sn = 0;
} else {
cmd->cmd_flags |= ICF_GOT_DATACK_SNACK;
cmd->acked_data_sn = (tmr_req->exp_data_sn - 1);
}
if (!(cmd->se_cmd.transport_state & CMD_T_SENT)) {
pr_debug("READ ITT: 0x%08x: t_state: %d never sent to"
" transport\n", cmd->init_task_tag,
cmd->se_cmd.t_state);
target_submit(se_cmd);
return 0;
}
if (!(se_cmd->transport_state & CMD_T_COMPLETE)) {
pr_err("READ ITT: 0x%08x: t_state: %d, never returned"
" from transport\n", cmd->init_task_tag,
cmd->se_cmd.t_state);
return -1;
}
dr = iscsit_allocate_datain_req();
if (!dr)
return -1;
/*
* The TMR TASK_REASSIGN's ExpDataSN contains the next DataSN the
* Initiator is expecting.
*/
dr->data_sn = dr->begrun = tmr_req->exp_data_sn;
dr->runlength = 0;
dr->generate_recovery_values = 1;
Annotation
- Immediate include surface: `linux/unaligned.h`, `scsi/scsi_proto.h`, `scsi/iscsi_proto.h`, `target/target_core_base.h`, `target/target_core_fabric.h`, `target/iscsi/iscsi_transport.h`, `target/iscsi/iscsi_target_core.h`, `iscsi_target_seq_pdu_list.h`.
- Detected declarations: `function iscsit_tmr_abort_task`, `function iscsit_handle_task_mgt_cmd`, `function iscsit_tmr_task_cold_reset`, `function iscsit_tmr_task_reassign`, `function iscsit_task_reassign_remove_cmd`, `function iscsit_task_reassign_complete_nop_out`, `function iscsit_task_reassign_complete_write`, `function iscsit_task_reassign_complete_read`, `function iscsit_task_reassign_complete_none`, `function iscsit_task_reassign_complete_scsi_cmnd`.
- Atlas domain: Driver Families / drivers/target.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.