drivers/target/iscsi/iscsi_target_tpg.c
Source file repositories/reference/linux-study-clean/drivers/target/iscsi/iscsi_target_tpg.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/target/iscsi/iscsi_target_tpg.c- Extension
.c- Size
- 22023 bytes
- Lines
- 882
- Domain
- Driver Families
- Bucket
- drivers/target
- Inferred role
- Driver Families: implementation source
- Status
- source 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/slab.htarget/target_core_base.htarget/target_core_fabric.htarget/iscsi/iscsi_target_core.hiscsi_target_erl0.hiscsi_target_login.hiscsi_target_nodeattrib.hiscsi_target_tpg.hiscsi_target_util.hiscsi_target.hiscsi_target_parameters.htarget/iscsi/iscsi_transport.h
Detected Declarations
function iscsit_load_discovery_tpgfunction iscsit_release_discovery_tpgfunction list_for_each_entryfunction iscsit_get_tpgfunction iscsit_put_tpgfunction iscsit_clear_tpg_np_login_threadfunction iscsit_clear_tpg_np_login_threadsfunction iscsit_set_default_tpg_attribsfunction iscsit_tpg_add_portal_groupfunction iscsit_tpg_del_portal_groupfunction iscsit_tpg_enable_portal_groupfunction iscsit_tpg_disable_portal_groupfunction iscsit_tpg_check_network_portalfunction list_for_each_entryfunction iscsit_tpg_release_npfunction iscsit_tpg_del_network_portalfunction iscsit_ta_authenticationfunction iscsit_ta_login_timeoutfunction iscsit_ta_generate_node_aclsfunction iscsit_ta_default_cmdsn_depthfunction iscsit_ta_cache_dynamic_aclsfunction iscsit_ta_demo_mode_write_protectfunction iscsit_ta_prod_mode_write_protectfunction iscsit_ta_demo_mode_discoveryfunction iscsit_ta_default_erlfunction iscsit_ta_t10_pifunction iscsit_ta_fabric_prot_typefunction iscsit_ta_tpg_enabled_sendtargetsfunction iscsit_ta_login_keys_workaround
Annotated Snippet
if (tpg->tpg_state != TPG_STATE_ACTIVE) {
spin_unlock(&tpg->tpg_state_lock);
continue;
}
spin_unlock(&tpg->tpg_state_lock);
spin_lock(&tpg->tpg_np_lock);
list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, tpg_np_list) {
if (tpg_np->tpg_np == np) {
*tpg_np_out = tpg_np;
kref_get(&tpg_np->tpg_np_kref);
spin_unlock(&tpg->tpg_np_lock);
spin_unlock(&tiqn->tiqn_tpg_lock);
return tpg;
}
}
spin_unlock(&tpg->tpg_np_lock);
}
spin_unlock(&tiqn->tiqn_tpg_lock);
return NULL;
}
int iscsit_get_tpg(
struct iscsi_portal_group *tpg)
{
return mutex_lock_interruptible(&tpg->tpg_access_lock);
}
void iscsit_put_tpg(struct iscsi_portal_group *tpg)
{
mutex_unlock(&tpg->tpg_access_lock);
}
static void iscsit_clear_tpg_np_login_thread(
struct iscsi_tpg_np *tpg_np,
struct iscsi_portal_group *tpg,
bool shutdown)
{
if (!tpg_np->tpg_np) {
pr_err("struct iscsi_tpg_np->tpg_np is NULL!\n");
return;
}
if (shutdown)
tpg_np->tpg_np->enabled = false;
iscsit_reset_np_thread(tpg_np->tpg_np, tpg_np, tpg, shutdown);
}
static void iscsit_clear_tpg_np_login_threads(
struct iscsi_portal_group *tpg,
bool shutdown)
{
struct iscsi_tpg_np *tpg_np;
spin_lock(&tpg->tpg_np_lock);
list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, tpg_np_list) {
if (!tpg_np->tpg_np) {
pr_err("struct iscsi_tpg_np->tpg_np is NULL!\n");
continue;
}
spin_unlock(&tpg->tpg_np_lock);
iscsit_clear_tpg_np_login_thread(tpg_np, tpg, shutdown);
spin_lock(&tpg->tpg_np_lock);
}
spin_unlock(&tpg->tpg_np_lock);
}
static void iscsit_set_default_tpg_attribs(struct iscsi_portal_group *tpg)
{
struct iscsi_tpg_attrib *a = &tpg->tpg_attrib;
a->authentication = TA_AUTHENTICATION;
a->login_timeout = TA_LOGIN_TIMEOUT;
a->default_cmdsn_depth = TA_DEFAULT_CMDSN_DEPTH;
a->generate_node_acls = TA_GENERATE_NODE_ACLS;
a->cache_dynamic_acls = TA_CACHE_DYNAMIC_ACLS;
a->demo_mode_write_protect = TA_DEMO_MODE_WRITE_PROTECT;
a->prod_mode_write_protect = TA_PROD_MODE_WRITE_PROTECT;
a->demo_mode_discovery = TA_DEMO_MODE_DISCOVERY;
a->default_erl = TA_DEFAULT_ERL;
a->t10_pi = TA_DEFAULT_T10_PI;
a->fabric_prot_type = TA_DEFAULT_FABRIC_PROT_TYPE;
a->tpg_enabled_sendtargets = TA_DEFAULT_TPG_ENABLED_SENDTARGETS;
a->login_keys_workaround = TA_DEFAULT_LOGIN_KEYS_WORKAROUND;
}
int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg)
{
if (tpg->tpg_state != TPG_STATE_FREE) {
Annotation
- Immediate include surface: `linux/slab.h`, `target/target_core_base.h`, `target/target_core_fabric.h`, `target/iscsi/iscsi_target_core.h`, `iscsi_target_erl0.h`, `iscsi_target_login.h`, `iscsi_target_nodeattrib.h`, `iscsi_target_tpg.h`.
- Detected declarations: `function iscsit_load_discovery_tpg`, `function iscsit_release_discovery_tpg`, `function list_for_each_entry`, `function iscsit_get_tpg`, `function iscsit_put_tpg`, `function iscsit_clear_tpg_np_login_thread`, `function iscsit_clear_tpg_np_login_threads`, `function iscsit_set_default_tpg_attribs`, `function iscsit_tpg_add_portal_group`, `function iscsit_tpg_del_portal_group`.
- Atlas domain: Driver Families / drivers/target.
- Implementation status: source 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.