drivers/target/iscsi/iscsi_target_login.c
Source file repositories/reference/linux-study-clean/drivers/target/iscsi/iscsi_target_login.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/target/iscsi/iscsi_target_login.c- Extension
.c- Size
- 37535 bytes
- Lines
- 1379
- 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.
- 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/module.hlinux/string.hlinux/kthread.hlinux/sched/signal.hlinux/idr.hlinux/tcp.hnet/ip.hnet/ipv6.hscsi/iscsi_proto.htarget/target_core_base.htarget/target_core_fabric.htarget/iscsi/iscsi_target_core.htarget/iscsi/iscsi_target_stat.hiscsi_target_device.hiscsi_target_nego.hiscsi_target_erl0.hiscsi_target_erl2.hiscsi_target_login.hiscsi_target_tpg.hiscsi_target_util.hiscsi_target.hiscsi_target_parameters.htarget/iscsi/iscsi_transport.h
Detected Declarations
function iscsi_login_check_initiator_versionfunction iscsi_check_for_session_reinstatementfunction iscsi_login_set_conn_valuesfunction iscsi_login_zero_tsih_s1function iscsi_login_zero_tsih_s2function iscsi_login_non_zero_tsih_s1function iscsi_login_non_zero_tsih_s2function iscsi_login_post_auth_non_zero_tsihfunction iscsi_post_login_start_timersfunction iscsit_start_kthreadsfunction iscsi_post_login_handlerfunction iscsit_setup_npfunction iscsi_target_setup_login_socketfunction iscsit_accept_npfunction iscsit_get_login_rxfunction iscsit_put_login_txfunction iscsit_conn_set_transportfunction iscsit_free_connfunction iscsi_target_login_sess_outfunction __iscsi_target_login_threadfunction iscsi_target_login_threadexport iscsi_change_param_sprintf
Annotated Snippet
ret = sock_create(sockaddr->ss_family, np->np_sock_type,
np->np_ip_proto, &sock);
if (ret < 0) {
pr_err("sock_create() failed.\n");
return ret;
}
np->np_socket = sock;
/*
* Setup the np->np_sockaddr from the passed sockaddr setup
* in iscsi_target_configfs.c code..
*/
memcpy(&np->np_sockaddr, sockaddr,
sizeof(struct sockaddr_storage));
if (sockaddr->ss_family == AF_INET6)
len = sizeof(struct sockaddr_in6);
else
len = sizeof(struct sockaddr_in);
/*
* Set SO_REUSEADDR, and disable Nagle Algorithm with TCP_NODELAY.
*/
if (np->np_network_transport == ISCSI_TCP)
tcp_sock_set_nodelay(sock->sk);
sock_set_reuseaddr(sock->sk);
ip_sock_set_freebind(sock->sk);
ret = kernel_bind(sock, (struct sockaddr_unsized *)&np->np_sockaddr, len);
if (ret < 0) {
pr_err("kernel_bind() failed: %d\n", ret);
goto fail;
}
ret = kernel_listen(sock, backlog);
if (ret != 0) {
pr_err("kernel_listen() failed: %d\n", ret);
goto fail;
}
return 0;
fail:
np->np_socket = NULL;
sock_release(sock);
return ret;
}
int iscsi_target_setup_login_socket(
struct iscsi_np *np,
struct sockaddr_storage *sockaddr)
{
struct iscsit_transport *t;
int rc;
t = iscsit_get_transport(np->np_network_transport);
if (!t)
return -EINVAL;
rc = t->iscsit_setup_np(np, sockaddr);
if (rc < 0) {
iscsit_put_transport(t);
return rc;
}
np->np_transport = t;
np->enabled = true;
return 0;
}
int iscsit_accept_np(struct iscsi_np *np, struct iscsit_conn *conn)
{
struct socket *new_sock, *sock = np->np_socket;
struct sockaddr_in sock_in;
struct sockaddr_in6 sock_in6;
int rc;
rc = kernel_accept(sock, &new_sock, 0);
if (rc < 0)
return rc;
conn->sock = new_sock;
conn->login_family = np->np_sockaddr.ss_family;
if (np->np_sockaddr.ss_family == AF_INET6) {
memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
rc = conn->sock->ops->getname(conn->sock,
(struct sockaddr *)&sock_in6, 1);
if (rc >= 0) {
if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6));
} else {
Annotation
- Immediate include surface: `linux/module.h`, `linux/string.h`, `linux/kthread.h`, `linux/sched/signal.h`, `linux/idr.h`, `linux/tcp.h`, `net/ip.h`, `net/ipv6.h`.
- Detected declarations: `function iscsi_login_check_initiator_version`, `function iscsi_check_for_session_reinstatement`, `function iscsi_login_set_conn_values`, `function iscsi_login_zero_tsih_s1`, `function iscsi_login_zero_tsih_s2`, `function iscsi_login_non_zero_tsih_s1`, `function iscsi_login_non_zero_tsih_s2`, `function iscsi_login_post_auth_non_zero_tsih`, `function iscsi_post_login_start_timers`, `function iscsit_start_kthreads`.
- 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.