drivers/target/iscsi/iscsi_target_util.c
Source file repositories/reference/linux-study-clean/drivers/target/iscsi/iscsi_target_util.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/target/iscsi/iscsi_target_util.c- Extension
.c- Size
- 34701 bytes
- Lines
- 1375
- 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/list.hlinux/sched/signal.hnet/ipv6.hscsi/scsi_tcq.hscsi/iscsi_proto.htarget/target_core_base.htarget/target_core_fabric.htarget/iscsi/iscsi_transport.htarget/iscsi/iscsi_target_core.hiscsi_target_parameters.hiscsi_target_seq_pdu_list.hiscsi_target_datain_values.hiscsi_target_erl0.hiscsi_target_erl1.hiscsi_target_erl2.hiscsi_target_tpg.hiscsi_target_util.hiscsi_target.h
Detected Declarations
function iscsit_add_r2t_to_listfunction iscsit_free_r2tfunction iscsit_free_r2ts_from_listfunction iscsit_wait_for_tagfunction interruptfunction iscsit_check_received_cmdsnfunction iscsit_sequence_cmdfunction iscsit_find_cmd_for_recoveryfunction list_for_each_entryfunction list_for_each_entryfunction iscsit_add_cmd_to_immediate_queuefunction iscsit_remove_cmd_from_immediate_queuefunction list_for_each_entry_safefunction iscsit_add_cmd_to_response_queuefunction iscsit_remove_cmd_from_response_queuefunction list_for_each_entry_safefunction iscsit_conn_all_queues_emptyfunction iscsit_free_queue_reqs_for_connfunction iscsit_release_cmdfunction __iscsit_free_cmdfunction iscsit_free_cmdfunction iscsit_check_session_usage_countfunction iscsit_dec_session_usage_countfunction iscsit_inc_session_usage_countfunction iscsit_check_conn_usage_countfunction iscsit_dec_conn_usage_countfunction iscsit_inc_conn_usage_countfunction iscsit_add_nopinfunction iscsit_handle_nopin_response_timeoutfunction iscsit_mod_nopin_response_timerfunction iscsit_start_nopin_response_timerfunction iscsit_stop_nopin_response_timerfunction iscsit_handle_nopin_timeoutfunction __iscsit_start_nopin_timerfunction iscsit_start_nopin_timerfunction iscsit_stop_nopin_timerfunction iscsit_login_timeoutfunction iscsit_start_login_timerfunction iscsit_set_login_timer_kworkerfunction iscsit_stop_login_timerfunction iscsit_send_tx_datafunction iscsit_fe_sendpage_sgfunction tx_datafunction sendpagefunction iscsit_tx_login_rspfunction rx_datafunction tx_datafunction iscsit_collect_login_stats
Annotated Snippet
if (!r2t->sent_r2t) {
spin_unlock_bh(&cmd->r2t_lock);
return r2t;
}
}
spin_unlock_bh(&cmd->r2t_lock);
pr_err("Unable to locate next R2T to send for ITT:"
" 0x%08x.\n", cmd->init_task_tag);
return NULL;
}
void iscsit_free_r2t(struct iscsi_r2t *r2t, struct iscsit_cmd *cmd)
{
lockdep_assert_held(&cmd->r2t_lock);
list_del(&r2t->r2t_list);
kmem_cache_free(lio_r2t_cache, r2t);
}
void iscsit_free_r2ts_from_list(struct iscsit_cmd *cmd)
{
struct iscsi_r2t *r2t, *r2t_tmp;
spin_lock_bh(&cmd->r2t_lock);
list_for_each_entry_safe(r2t, r2t_tmp, &cmd->cmd_r2t_list, r2t_list)
iscsit_free_r2t(r2t, cmd);
spin_unlock_bh(&cmd->r2t_lock);
}
static int iscsit_wait_for_tag(struct se_session *se_sess, int state, int *cpup)
{
int tag = -1;
DEFINE_SBQ_WAIT(wait);
struct sbq_wait_state *ws;
struct sbitmap_queue *sbq;
if (state == TASK_RUNNING)
return tag;
sbq = &se_sess->sess_tag_pool;
ws = &sbq->ws[0];
for (;;) {
sbitmap_prepare_to_wait(sbq, ws, &wait, state);
if (signal_pending_state(state, current))
break;
tag = sbitmap_queue_get(sbq, cpup);
if (tag >= 0)
break;
schedule();
}
sbitmap_finish_wait(sbq, ws, &wait);
return tag;
}
/*
* May be called from software interrupt (timer) context for allocating
* iSCSI NopINs.
*/
struct iscsit_cmd *iscsit_allocate_cmd(struct iscsit_conn *conn, int state)
{
struct iscsit_cmd *cmd;
struct se_session *se_sess = conn->sess->se_sess;
int size, tag, cpu;
tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu);
if (tag < 0)
tag = iscsit_wait_for_tag(se_sess, state, &cpu);
if (tag < 0)
return NULL;
size = sizeof(struct iscsit_cmd) + conn->conn_transport->priv_size;
cmd = (struct iscsit_cmd *)(se_sess->sess_cmd_map + (tag * size));
memset(cmd, 0, size);
cmd->se_cmd.map_tag = tag;
cmd->se_cmd.map_cpu = cpu;
cmd->conn = conn;
cmd->data_direction = DMA_NONE;
INIT_LIST_HEAD(&cmd->i_conn_node);
INIT_LIST_HEAD(&cmd->datain_list);
INIT_LIST_HEAD(&cmd->cmd_r2t_list);
spin_lock_init(&cmd->datain_lock);
spin_lock_init(&cmd->dataout_timeout_lock);
spin_lock_init(&cmd->istate_lock);
spin_lock_init(&cmd->error_lock);
spin_lock_init(&cmd->r2t_lock);
timer_setup(&cmd->dataout_timer, iscsit_handle_dataout_timeout, 0);
Annotation
- Immediate include surface: `linux/list.h`, `linux/sched/signal.h`, `net/ipv6.h`, `scsi/scsi_tcq.h`, `scsi/iscsi_proto.h`, `target/target_core_base.h`, `target/target_core_fabric.h`, `target/iscsi/iscsi_transport.h`.
- Detected declarations: `function iscsit_add_r2t_to_list`, `function iscsit_free_r2t`, `function iscsit_free_r2ts_from_list`, `function iscsit_wait_for_tag`, `function interrupt`, `function iscsit_check_received_cmdsn`, `function iscsit_sequence_cmd`, `function iscsit_find_cmd_for_recovery`, `function list_for_each_entry`, `function list_for_each_entry`.
- 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.