drivers/target/iscsi/iscsi_target_configfs.c

Source file repositories/reference/linux-study-clean/drivers/target/iscsi/iscsi_target_configfs.c

File Facts

System
Linux kernel
Corpus path
drivers/target/iscsi/iscsi_target_configfs.c
Extension
.c
Size
46318 bytes
Lines
1598
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (strlen(mod_name)) {
			rc = request_module(mod_name);
			if (rc != 0) {
				pr_warn("Unable to request_module for %s\n",
					mod_name);
				rc = 0;
			}
		}

		tpg_np_new = iscsit_tpg_add_network_portal(tpg,
					&np->np_sockaddr, tpg_np, type);
		if (IS_ERR(tpg_np_new)) {
			rc = PTR_ERR(tpg_np_new);
			goto out;
		}
	} else {
		tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type);
		if (tpg_np_new) {
			rc = iscsit_tpg_del_network_portal(tpg, tpg_np_new);
			if (rc < 0)
				goto out;
		}
	}

	iscsit_put_tpg(tpg);
	return count;
out:
	iscsit_put_tpg(tpg);
	return rc;
}

static ssize_t lio_target_np_iser_show(struct config_item *item, char *page)
{
	return lio_target_np_driver_show(item, page, ISCSI_INFINIBAND);
}

static ssize_t lio_target_np_iser_store(struct config_item *item,
					const char *page, size_t count)
{
	return lio_target_np_driver_store(item, page, count,
					  ISCSI_INFINIBAND, "ib_isert");
}
CONFIGFS_ATTR(lio_target_np_, iser);

static ssize_t lio_target_np_cxgbit_show(struct config_item *item, char *page)
{
	return lio_target_np_driver_show(item, page, ISCSI_CXGBIT);
}

static ssize_t lio_target_np_cxgbit_store(struct config_item *item,
					  const char *page, size_t count)
{
	return lio_target_np_driver_store(item, page, count,
					  ISCSI_CXGBIT, "cxgbit");
}
CONFIGFS_ATTR(lio_target_np_, cxgbit);

static struct configfs_attribute *lio_target_portal_attrs[] = {
	&lio_target_np_attr_iser,
	&lio_target_np_attr_cxgbit,
	NULL,
};

/* Stop items for lio_target_portal_cit */

/* Start items for lio_target_np_cit */

#define MAX_PORTAL_LEN		256

static struct se_tpg_np *lio_target_call_addnptotpg(
	struct se_portal_group *se_tpg,
	struct config_group *group,
	const char *name)
{
	struct iscsi_portal_group *tpg;
	struct iscsi_tpg_np *tpg_np;
	char *str, *str2, *ip_str, *port_str;
	struct sockaddr_storage sockaddr = { };
	int ret;
	char buf[MAX_PORTAL_LEN + 1] = { };

	if (strlen(name) > MAX_PORTAL_LEN) {
		pr_err("strlen(name): %d exceeds MAX_PORTAL_LEN: %d\n",
			(int)strlen(name), MAX_PORTAL_LEN);
		return ERR_PTR(-EOVERFLOW);
	}
	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);

	str = strstr(buf, "[");
	if (str) {

Annotation

Implementation Notes