File Index
Files and directories
Sign in
FILE

iscsi_target_configfs.c

File preview with syntax highlighting.

linux-6.19.14/drivers/target/iscsi/iscsi_target_configfs.c C
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*******************************************************************************
   3 * This file contains the configfs implementation for iSCSI Target mode
   4 * from the LIO-Target Project.
   5 *
   6 * (c) Copyright 2007-2013 Datera, Inc.
   7 *
   8 * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
   9 *
  10 ****************************************************************************/
  11
  12#include <linux/configfs.h>
  13#include <linux/ctype.h>
  14#include <linux/export.h>
  15#include <linux/inet.h>
  16#include <linux/module.h>
  17#include <net/ipv6.h>
  18#include <target/target_core_base.h>
  19#include <target/target_core_fabric.h>
  20#include <target/iscsi/iscsi_transport.h>
  21#include <target/iscsi/iscsi_target_core.h>
  22#include "iscsi_target_parameters.h"
  23#include "iscsi_target_device.h"
  24#include "iscsi_target_erl0.h"
  25#include "iscsi_target_nodeattrib.h"
  26#include "iscsi_target_tpg.h"
  27#include "iscsi_target_util.h"
  28#include "iscsi_target.h"
  29#include <target/iscsi/iscsi_target_stat.h>
  30
  31
  32/* Start items for lio_target_portal_cit */
  33
  34static inline struct iscsi_tpg_np *to_iscsi_tpg_np(struct config_item *item)
  35{
  36	return container_of(to_tpg_np(item), struct iscsi_tpg_np, se_tpg_np);
  37}
  38
  39static ssize_t lio_target_np_driver_show(struct config_item *item, char *page,
  40					 enum iscsit_transport_type type)
  41{
  42	struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
  43	struct iscsi_tpg_np *tpg_np_new;
  44	ssize_t rb;
  45
  46	tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type);
  47	if (tpg_np_new)
  48		rb = sysfs_emit(page, "1\n");
  49	else
  50		rb = sysfs_emit(page, "0\n");
  51
  52	return rb;
  53}
  54
  55static ssize_t lio_target_np_driver_store(struct config_item *item,
  56		const char *page, size_t count, enum iscsit_transport_type type,
  57		const char *mod_name)
  58{
  59	struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
  60	struct iscsi_np *np;
  61	struct iscsi_portal_group *tpg;
  62	struct iscsi_tpg_np *tpg_np_new = NULL;
  63	u32 op;
  64	int rc;
  65
  66	rc = kstrtou32(page, 0, &op);
  67	if (rc)
  68		return rc;
  69	if ((op != 1) && (op != 0)) {
  70		pr_err("Illegal value for tpg_enable: %u\n", op);
  71		return -EINVAL;
  72	}
  73	np = tpg_np->tpg_np;
  74	if (!np) {
  75		pr_err("Unable to locate struct iscsi_np from"
  76				" struct iscsi_tpg_np\n");
  77		return -EINVAL;
  78	}
  79
  80	tpg = tpg_np->tpg;
  81	if (iscsit_get_tpg(tpg) < 0)
  82		return -EINVAL;
  83
  84	if (op) {
  85		if (strlen(mod_name)) {
  86			rc = request_module(mod_name);
  87			if (rc != 0) {
  88				pr_warn("Unable to request_module for %s\n",
  89					mod_name);
  90				rc = 0;
  91			}
  92		}
  93
  94		tpg_np_new = iscsit_tpg_add_network_portal(tpg,
  95					&np->np_sockaddr, tpg_np, type);
  96		if (IS_ERR(tpg_np_new)) {
  97			rc = PTR_ERR(tpg_np_new);
  98			goto out;
  99		}
 100	} else {
 101		tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type);
 102		if (tpg_np_new) {
 103			rc = iscsit_tpg_del_network_portal(tpg, tpg_np_new);
 104			if (rc < 0)
 105				goto out;
 106		}
 107	}
 108
 109	iscsit_put_tpg(tpg);
 110	return count;
 111out:
 112	iscsit_put_tpg(tpg);
 113	return rc;
 114}
 115
 116static ssize_t lio_target_np_iser_show(struct config_item *item, char *page)
 117{
 118	return lio_target_np_driver_show(item, page, ISCSI_INFINIBAND);
 119}
 120
 121static ssize_t lio_target_np_iser_store(struct config_item *item,
 122					const char *page, size_t count)
 123{
 124	return lio_target_np_driver_store(item, page, count,
 125					  ISCSI_INFINIBAND, "ib_isert");
 126}
 127CONFIGFS_ATTR(lio_target_np_, iser);
 128
 129static ssize_t lio_target_np_cxgbit_show(struct config_item *item, char *page)
 130{
 131	return lio_target_np_driver_show(item, page, ISCSI_CXGBIT);
 132}
 133
 134static ssize_t lio_target_np_cxgbit_store(struct config_item *item,
 135					  const char *page, size_t count)
 136{
 137	return lio_target_np_driver_store(item, page, count,
 138					  ISCSI_CXGBIT, "cxgbit");
 139}
 140CONFIGFS_ATTR(lio_target_np_, cxgbit);
 141
 142static struct configfs_attribute *lio_target_portal_attrs[] = {
 143	&lio_target_np_attr_iser,
 144	&lio_target_np_attr_cxgbit,
 145	NULL,
 146};
 147
 148/* Stop items for lio_target_portal_cit */
 149
 150/* Start items for lio_target_np_cit */
 151
 152#define MAX_PORTAL_LEN		256
 153
 154static struct se_tpg_np *lio_target_call_addnptotpg(
 155	struct se_portal_group *se_tpg,
 156	struct config_group *group,
 157	const char *name)
 158{
 159	struct iscsi_portal_group *tpg;
 160	struct iscsi_tpg_np *tpg_np;
 161	char *str, *str2, *ip_str, *port_str;
 162	struct sockaddr_storage sockaddr = { };
 163	int ret;
 164	char buf[MAX_PORTAL_LEN + 1] = { };
 165
 166	if (strlen(name) > MAX_PORTAL_LEN) {
 167		pr_err("strlen(name): %d exceeds MAX_PORTAL_LEN: %d\n",
 168			(int)strlen(name), MAX_PORTAL_LEN);
 169		return ERR_PTR(-EOVERFLOW);
 170	}
 171	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
 172
 173	str = strstr(buf, "[");
 174	if (str) {
 175		str2 = strstr(str, "]");
 176		if (!str2) {
 177			pr_err("Unable to locate trailing \"]\""
 178				" in IPv6 iSCSI network portal address\n");
 179			return ERR_PTR(-EINVAL);
 180		}
 181
 182		ip_str = str + 1; /* Skip over leading "[" */
 183		*str2 = '\0'; /* Terminate the unbracketed IPv6 address */
 184		str2++; /* Skip over the \0 */
 185
 186		port_str = strstr(str2, ":");
 187		if (!port_str) {
 188			pr_err("Unable to locate \":port\""
 189				" in IPv6 iSCSI network portal address\n");
 190			return ERR_PTR(-EINVAL);
 191		}
 192		*port_str = '\0'; /* Terminate string for IP */
 193		port_str++; /* Skip over ":" */
 194	} else {
 195		ip_str = &buf[0];
 196		port_str = strstr(ip_str, ":");
 197		if (!port_str) {
 198			pr_err("Unable to locate \":port\""
 199				" in IPv4 iSCSI network portal address\n");
 200			return ERR_PTR(-EINVAL);
 201		}
 202		*port_str = '\0'; /* Terminate string for IP */
 203		port_str++; /* Skip over ":" */
 204	}
 205
 206	ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str,
 207			port_str, &sockaddr);
 208	if (ret) {
 209		pr_err("malformed ip/port passed: %s\n", name);
 210		return ERR_PTR(ret);
 211	}
 212
 213	tpg = to_iscsi_tpg(se_tpg);
 214	ret = iscsit_get_tpg(tpg);
 215	if (ret < 0)
 216		return ERR_PTR(-EINVAL);
 217
 218	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s TPGT: %hu"
 219		" PORTAL: %s\n",
 220		config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
 221		tpg->tpgt, name);
 222	/*
 223	 * Assume ISCSI_TCP by default.  Other network portals for other
 224	 * iSCSI fabrics:
 225	 *
 226	 * Traditional iSCSI over SCTP (initial support)
 227	 * iSER/TCP (TODO, hardware available)
 228	 * iSER/SCTP (TODO, software emulation with osc-iwarp)
 229	 * iSER/IB (TODO, hardware available)
 230	 *
 231	 * can be enabled with attributes under
 232	 * sys/kernel/config/iscsi/$IQN/$TPG/np/$IP:$PORT/
 233	 *
 234	 */
 235	tpg_np = iscsit_tpg_add_network_portal(tpg, &sockaddr, NULL,
 236				ISCSI_TCP);
 237	if (IS_ERR(tpg_np)) {
 238		iscsit_put_tpg(tpg);
 239		return ERR_CAST(tpg_np);
 240	}
 241	pr_debug("LIO_Target_ConfigFS: addnptotpg done!\n");
 242
 243	iscsit_put_tpg(tpg);
 244	return &tpg_np->se_tpg_np;
 245}
 246
 247static void lio_target_call_delnpfromtpg(
 248	struct se_tpg_np *se_tpg_np)
 249{
 250	struct iscsi_portal_group *tpg;
 251	struct iscsi_tpg_np *tpg_np;
 252	struct se_portal_group *se_tpg;
 253	int ret;
 254
 255	tpg_np = container_of(se_tpg_np, struct iscsi_tpg_np, se_tpg_np);
 256	tpg = tpg_np->tpg;
 257	ret = iscsit_get_tpg(tpg);
 258	if (ret < 0)
 259		return;
 260
 261	se_tpg = &tpg->tpg_se_tpg;
 262	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu"
 263		" PORTAL: %pISpc\n", config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
 264		tpg->tpgt, &tpg_np->tpg_np->np_sockaddr);
 265
 266	ret = iscsit_tpg_del_network_portal(tpg, tpg_np);
 267	if (ret < 0)
 268		goto out;
 269
 270	pr_debug("LIO_Target_ConfigFS: delnpfromtpg done!\n");
 271out:
 272	iscsit_put_tpg(tpg);
 273}
 274
 275/* End items for lio_target_np_cit */
 276
 277/* Start items for lio_target_nacl_attrib_cit */
 278
 279#define ISCSI_NACL_ATTR(name)						\
 280static ssize_t iscsi_nacl_attrib_##name##_show(struct config_item *item,\
 281		char *page)						\
 282{									\
 283	struct se_node_acl *se_nacl = attrib_to_nacl(item);		\
 284	struct iscsi_node_acl *nacl = to_iscsi_nacl(se_nacl);		\
 285	return sysfs_emit(page, "%u\n", nacl->node_attrib.name);		\
 286}									\
 287									\
 288static ssize_t iscsi_nacl_attrib_##name##_store(struct config_item *item,\
 289		const char *page, size_t count)				\
 290{									\
 291	struct se_node_acl *se_nacl = attrib_to_nacl(item);		\
 292	struct iscsi_node_acl *nacl = to_iscsi_nacl(se_nacl);		\
 293	u32 val;							\
 294	int ret;							\
 295									\
 296	ret = kstrtou32(page, 0, &val);					\
 297	if (ret)							\
 298		return ret;						\
 299	ret = iscsit_na_##name(nacl, val);				\
 300	if (ret < 0)							\
 301		return ret;						\
 302									\
 303	return count;							\
 304}									\
 305									\
 306CONFIGFS_ATTR(iscsi_nacl_attrib_, name)
 307
 308ISCSI_NACL_ATTR(dataout_timeout);
 309ISCSI_NACL_ATTR(dataout_timeout_retries);
 310ISCSI_NACL_ATTR(default_erl);
 311ISCSI_NACL_ATTR(nopin_timeout);
 312ISCSI_NACL_ATTR(nopin_response_timeout);
 313ISCSI_NACL_ATTR(random_datain_pdu_offsets);
 314ISCSI_NACL_ATTR(random_datain_seq_offsets);
 315ISCSI_NACL_ATTR(random_r2t_offsets);
 316
 317static ssize_t iscsi_nacl_attrib_authentication_show(struct config_item *item,
 318		char *page)
 319{
 320	struct se_node_acl *se_nacl = attrib_to_nacl(item);
 321	struct iscsi_node_acl *nacl = to_iscsi_nacl(se_nacl);
 322
 323	return sysfs_emit(page, "%d\n", nacl->node_attrib.authentication);
 324}
 325
 326static ssize_t iscsi_nacl_attrib_authentication_store(struct config_item *item,
 327		const char *page, size_t count)
 328{
 329	struct se_node_acl *se_nacl = attrib_to_nacl(item);
 330	struct iscsi_node_acl *nacl = to_iscsi_nacl(se_nacl);
 331	s32 val;
 332	int ret;
 333
 334	ret = kstrtos32(page, 0, &val);
 335	if (ret)
 336		return ret;
 337	if (val != 0 && val != 1 && val != NA_AUTHENTICATION_INHERITED)
 338		return -EINVAL;
 339
 340	nacl->node_attrib.authentication = val;
 341
 342	return count;
 343}
 344
 345CONFIGFS_ATTR(iscsi_nacl_attrib_, authentication);
 346
 347static struct configfs_attribute *lio_target_nacl_attrib_attrs[] = {
 348	&iscsi_nacl_attrib_attr_dataout_timeout,
 349	&iscsi_nacl_attrib_attr_dataout_timeout_retries,
 350	&iscsi_nacl_attrib_attr_default_erl,
 351	&iscsi_nacl_attrib_attr_nopin_timeout,
 352	&iscsi_nacl_attrib_attr_nopin_response_timeout,
 353	&iscsi_nacl_attrib_attr_random_datain_pdu_offsets,
 354	&iscsi_nacl_attrib_attr_random_datain_seq_offsets,
 355	&iscsi_nacl_attrib_attr_random_r2t_offsets,
 356	&iscsi_nacl_attrib_attr_authentication,
 357	NULL,
 358};
 359
 360/* End items for lio_target_nacl_attrib_cit */
 361
 362/* Start items for lio_target_nacl_auth_cit */
 363
 364#define __DEF_NACL_AUTH_STR(prefix, name, flags)			\
 365static ssize_t __iscsi_##prefix##_##name##_show(			\
 366	struct iscsi_node_acl *nacl,					\
 367	char *page)							\
 368{									\
 369	struct iscsi_node_auth *auth = &nacl->node_auth;		\
 370									\
 371	if (!capable(CAP_SYS_ADMIN))					\
 372		return -EPERM;						\
 373	return snprintf(page, PAGE_SIZE, "%s\n", auth->name);		\
 374}									\
 375									\
 376static ssize_t __iscsi_##prefix##_##name##_store(			\
 377	struct iscsi_node_acl *nacl,					\
 378	const char *page,						\
 379	size_t count)							\
 380{									\
 381	struct iscsi_node_auth *auth = &nacl->node_auth;		\
 382									\
 383	if (!capable(CAP_SYS_ADMIN))					\
 384		return -EPERM;						\
 385	if (count >= sizeof(auth->name))				\
 386		return -EINVAL;						\
 387	snprintf(auth->name, sizeof(auth->name), "%s", page);		\
 388	if (!strncmp("NULL", auth->name, 4))				\
 389		auth->naf_flags &= ~flags;				\
 390	else								\
 391		auth->naf_flags |= flags;				\
 392									\
 393	if ((auth->naf_flags & NAF_USERID_IN_SET) &&			\
 394	    (auth->naf_flags & NAF_PASSWORD_IN_SET))			\
 395		auth->authenticate_target = 1;				\
 396	else								\
 397		auth->authenticate_target = 0;				\
 398									\
 399	return count;							\
 400}
 401
 402#define DEF_NACL_AUTH_STR(name, flags)					\
 403	__DEF_NACL_AUTH_STR(nacl_auth, name, flags)			\
 404static ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item,	\
 405		char *page)						\
 406{									\
 407	struct se_node_acl *nacl = auth_to_nacl(item);			\
 408	return __iscsi_nacl_auth_##name##_show(to_iscsi_nacl(nacl), page);	\
 409}									\
 410static ssize_t iscsi_nacl_auth_##name##_store(struct config_item *item,	\
 411		const char *page, size_t count)				\
 412{									\
 413	struct se_node_acl *nacl = auth_to_nacl(item);			\
 414	return __iscsi_nacl_auth_##name##_store(to_iscsi_nacl(nacl),	\
 415						page, count); \
 416}									\
 417									\
 418CONFIGFS_ATTR(iscsi_nacl_auth_, name)
 419
 420/*
 421 * One-way authentication userid
 422 */
 423DEF_NACL_AUTH_STR(userid, NAF_USERID_SET);
 424DEF_NACL_AUTH_STR(password, NAF_PASSWORD_SET);
 425DEF_NACL_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
 426DEF_NACL_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
 427
 428#define __DEF_NACL_AUTH_INT(prefix, name)				\
 429static ssize_t __iscsi_##prefix##_##name##_show(				\
 430	struct iscsi_node_acl *nacl,					\
 431	char *page)							\
 432{									\
 433	struct iscsi_node_auth *auth = &nacl->node_auth;		\
 434									\
 435	if (!capable(CAP_SYS_ADMIN))					\
 436		return -EPERM;						\
 437									\
 438	return snprintf(page, PAGE_SIZE, "%d\n", auth->name);		\
 439}
 440
 441#define DEF_NACL_AUTH_INT(name)						\
 442	__DEF_NACL_AUTH_INT(nacl_auth, name)				\
 443static ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item,	\
 444		char *page)						\
 445{									\
 446	struct se_node_acl *nacl = auth_to_nacl(item);			\
 447	return __iscsi_nacl_auth_##name##_show(to_iscsi_nacl(nacl), page);	\
 448}									\
 449									\
 450CONFIGFS_ATTR_RO(iscsi_nacl_auth_, name)
 451
 452DEF_NACL_AUTH_INT(authenticate_target);
 453
 454static struct configfs_attribute *lio_target_nacl_auth_attrs[] = {
 455	&iscsi_nacl_auth_attr_userid,
 456	&iscsi_nacl_auth_attr_password,
 457	&iscsi_nacl_auth_attr_authenticate_target,
 458	&iscsi_nacl_auth_attr_userid_mutual,
 459	&iscsi_nacl_auth_attr_password_mutual,
 460	NULL,
 461};
 462
 463/* End items for lio_target_nacl_auth_cit */
 464
 465/* Start items for lio_target_nacl_param_cit */
 466
 467#define ISCSI_NACL_PARAM(name)						\
 468static ssize_t iscsi_nacl_param_##name##_show(struct config_item *item,	\
 469		char *page)						\
 470{									\
 471	struct se_node_acl *se_nacl = param_to_nacl(item);		\
 472	struct iscsit_session *sess;					\
 473	struct se_session *se_sess;					\
 474	ssize_t rb;							\
 475									\
 476	spin_lock_bh(&se_nacl->nacl_sess_lock);				\
 477	se_sess = se_nacl->nacl_sess;					\
 478	if (!se_sess) {							\
 479		rb = snprintf(page, PAGE_SIZE,				\
 480			"No Active iSCSI Session\n");			\
 481	} else {							\
 482		sess = se_sess->fabric_sess_ptr;			\
 483		rb = snprintf(page, PAGE_SIZE, "%u\n",			\
 484			(u32)sess->sess_ops->name);			\
 485	}								\
 486	spin_unlock_bh(&se_nacl->nacl_sess_lock);			\
 487									\
 488	return rb;							\
 489}									\
 490									\
 491CONFIGFS_ATTR_RO(iscsi_nacl_param_, name)
 492
 493ISCSI_NACL_PARAM(MaxConnections);
 494ISCSI_NACL_PARAM(InitialR2T);
 495ISCSI_NACL_PARAM(ImmediateData);
 496ISCSI_NACL_PARAM(MaxBurstLength);
 497ISCSI_NACL_PARAM(FirstBurstLength);
 498ISCSI_NACL_PARAM(DefaultTime2Wait);
 499ISCSI_NACL_PARAM(DefaultTime2Retain);
 500ISCSI_NACL_PARAM(MaxOutstandingR2T);
 501ISCSI_NACL_PARAM(DataPDUInOrder);
 502ISCSI_NACL_PARAM(DataSequenceInOrder);
 503ISCSI_NACL_PARAM(ErrorRecoveryLevel);
 504
 505static struct configfs_attribute *lio_target_nacl_param_attrs[] = {
 506	&iscsi_nacl_param_attr_MaxConnections,
 507	&iscsi_nacl_param_attr_InitialR2T,
 508	&iscsi_nacl_param_attr_ImmediateData,
 509	&iscsi_nacl_param_attr_MaxBurstLength,
 510	&iscsi_nacl_param_attr_FirstBurstLength,
 511	&iscsi_nacl_param_attr_DefaultTime2Wait,
 512	&iscsi_nacl_param_attr_DefaultTime2Retain,
 513	&iscsi_nacl_param_attr_MaxOutstandingR2T,
 514	&iscsi_nacl_param_attr_DataPDUInOrder,
 515	&iscsi_nacl_param_attr_DataSequenceInOrder,
 516	&iscsi_nacl_param_attr_ErrorRecoveryLevel,
 517	NULL,
 518};
 519
 520/* End items for lio_target_nacl_param_cit */
 521
 522/* Start items for lio_target_acl_cit */
 523
 524static ssize_t lio_target_nacl_info_show(struct config_item *item, char *page)
 525{
 526	struct se_node_acl *se_nacl = acl_to_nacl(item);
 527	struct iscsit_session *sess;
 528	struct iscsit_conn *conn;
 529	struct se_session *se_sess;
 530	ssize_t rb = 0;
 531	u32 max_cmd_sn;
 532
 533	spin_lock_bh(&se_nacl->nacl_sess_lock);
 534	se_sess = se_nacl->nacl_sess;
 535	if (!se_sess) {
 536		rb += sysfs_emit_at(page, rb, "No active iSCSI Session for Initiator"
 537			" Endpoint: %s\n", se_nacl->initiatorname);
 538	} else {
 539		sess = se_sess->fabric_sess_ptr;
 540
 541		rb += sysfs_emit_at(page, rb, "InitiatorName: %s\n",
 542			sess->sess_ops->InitiatorName);
 543		rb += sysfs_emit_at(page, rb, "InitiatorAlias: %s\n",
 544			sess->sess_ops->InitiatorAlias);
 545
 546		rb += sysfs_emit_at(page, rb,
 547			      "LIO Session ID: %u   ISID: 0x%6ph  TSIH: %hu  ",
 548			      sess->sid, sess->isid, sess->tsih);
 549		rb += sysfs_emit_at(page, rb, "SessionType: %s\n",
 550				(sess->sess_ops->SessionType) ?
 551				"Discovery" : "Normal");
 552		rb += sysfs_emit_at(page, rb, "Session State: ");
 553		switch (sess->session_state) {
 554		case TARG_SESS_STATE_FREE:
 555			rb += sysfs_emit_at(page, rb, "TARG_SESS_FREE\n");
 556			break;
 557		case TARG_SESS_STATE_ACTIVE:
 558			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_ACTIVE\n");
 559			break;
 560		case TARG_SESS_STATE_LOGGED_IN:
 561			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_LOGGED_IN\n");
 562			break;
 563		case TARG_SESS_STATE_FAILED:
 564			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_FAILED\n");
 565			break;
 566		case TARG_SESS_STATE_IN_CONTINUE:
 567			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_IN_CONTINUE\n");
 568			break;
 569		default:
 570			rb += sysfs_emit_at(page, rb, "ERROR: Unknown Session"
 571					" State!\n");
 572			break;
 573		}
 574
 575		rb += sysfs_emit_at(page, rb, "---------------------[iSCSI Session"
 576				" Values]-----------------------\n");
 577		rb += sysfs_emit_at(page, rb, "  CmdSN/WR  :  CmdSN/WC  :  ExpCmdSN"
 578				"  :  MaxCmdSN  :     ITT    :     TTT\n");
 579		max_cmd_sn = (u32) atomic_read(&sess->max_cmd_sn);
 580		rb += sysfs_emit_at(page, rb, " 0x%08x   0x%08x   0x%08x   0x%08x"
 581				"   0x%08x   0x%08x\n",
 582			sess->cmdsn_window,
 583			(max_cmd_sn - sess->exp_cmd_sn) + 1,
 584			sess->exp_cmd_sn, max_cmd_sn,
 585			sess->init_task_tag, sess->targ_xfer_tag);
 586		rb += sysfs_emit_at(page, rb, "----------------------[iSCSI"
 587				" Connections]-------------------------\n");
 588
 589		spin_lock(&sess->conn_lock);
 590		list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
 591			rb += sysfs_emit_at(page, rb, "CID: %hu  Connection"
 592					" State: ", conn->cid);
 593			switch (conn->conn_state) {
 594			case TARG_CONN_STATE_FREE:
 595				rb += sysfs_emit_at(page, rb,
 596					"TARG_CONN_STATE_FREE\n");
 597				break;
 598			case TARG_CONN_STATE_XPT_UP:
 599				rb += sysfs_emit_at(page, rb,
 600					"TARG_CONN_STATE_XPT_UP\n");
 601				break;
 602			case TARG_CONN_STATE_IN_LOGIN:
 603				rb += sysfs_emit_at(page, rb,
 604					"TARG_CONN_STATE_IN_LOGIN\n");
 605				break;
 606			case TARG_CONN_STATE_LOGGED_IN:
 607				rb += sysfs_emit_at(page, rb,
 608					"TARG_CONN_STATE_LOGGED_IN\n");
 609				break;
 610			case TARG_CONN_STATE_IN_LOGOUT:
 611				rb += sysfs_emit_at(page, rb,
 612					"TARG_CONN_STATE_IN_LOGOUT\n");
 613				break;
 614			case TARG_CONN_STATE_LOGOUT_REQUESTED:
 615				rb += sysfs_emit_at(page, rb,
 616					"TARG_CONN_STATE_LOGOUT_REQUESTED\n");
 617				break;
 618			case TARG_CONN_STATE_CLEANUP_WAIT:
 619				rb += sysfs_emit_at(page, rb,
 620					"TARG_CONN_STATE_CLEANUP_WAIT\n");
 621				break;
 622			default:
 623				rb += sysfs_emit_at(page, rb,
 624					"ERROR: Unknown Connection State!\n");
 625				break;
 626			}
 627
 628			rb += sysfs_emit_at(page, rb, "   Address %pISc %s", &conn->login_sockaddr,
 629				(conn->network_transport == ISCSI_TCP) ?
 630				"TCP" : "SCTP");
 631			rb += sysfs_emit_at(page, rb, "  StatSN: 0x%08x\n",
 632				conn->stat_sn);
 633		}
 634		spin_unlock(&sess->conn_lock);
 635	}
 636	spin_unlock_bh(&se_nacl->nacl_sess_lock);
 637
 638	return rb;
 639}
 640
 641static ssize_t lio_target_nacl_cmdsn_depth_show(struct config_item *item,
 642		char *page)
 643{
 644	return sysfs_emit(page, "%u\n", acl_to_nacl(item)->queue_depth);
 645}
 646
 647static ssize_t lio_target_nacl_cmdsn_depth_store(struct config_item *item,
 648		const char *page, size_t count)
 649{
 650	struct se_node_acl *se_nacl = acl_to_nacl(item);
 651	struct se_portal_group *se_tpg = se_nacl->se_tpg;
 652	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);
 653	struct config_item *acl_ci, *tpg_ci, *wwn_ci;
 654	u32 cmdsn_depth = 0;
 655	int ret;
 656
 657	ret = kstrtou32(page, 0, &cmdsn_depth);
 658	if (ret)
 659		return ret;
 660	if (cmdsn_depth > TA_DEFAULT_CMDSN_DEPTH_MAX) {
 661		pr_err("Passed cmdsn_depth: %u exceeds"
 662			" TA_DEFAULT_CMDSN_DEPTH_MAX: %u\n", cmdsn_depth,
 663			TA_DEFAULT_CMDSN_DEPTH_MAX);
 664		return -EINVAL;
 665	}
 666	acl_ci = &se_nacl->acl_group.cg_item;
 667	if (!acl_ci) {
 668		pr_err("Unable to locate acl_ci\n");
 669		return -EINVAL;
 670	}
 671	tpg_ci = &acl_ci->ci_parent->ci_group->cg_item;
 672	if (!tpg_ci) {
 673		pr_err("Unable to locate tpg_ci\n");
 674		return -EINVAL;
 675	}
 676	wwn_ci = &tpg_ci->ci_group->cg_item;
 677	if (!wwn_ci) {
 678		pr_err("Unable to locate config_item wwn_ci\n");
 679		return -EINVAL;
 680	}
 681
 682	if (iscsit_get_tpg(tpg) < 0)
 683		return -EINVAL;
 684
 685	ret = core_tpg_set_initiator_node_queue_depth(se_nacl, cmdsn_depth);
 686
 687	pr_debug("LIO_Target_ConfigFS: %s/%s Set CmdSN Window: %u for "
 688		"InitiatorName: %s\n", config_item_name(wwn_ci),
 689		config_item_name(tpg_ci), cmdsn_depth,
 690		config_item_name(acl_ci));
 691
 692	iscsit_put_tpg(tpg);
 693	return (!ret) ? count : (ssize_t)ret;
 694}
 695
 696static ssize_t lio_target_nacl_tag_show(struct config_item *item, char *page)
 697{
 698	return snprintf(page, PAGE_SIZE, "%s", acl_to_nacl(item)->acl_tag);
 699}
 700
 701static ssize_t lio_target_nacl_tag_store(struct config_item *item,
 702		const char *page, size_t count)
 703{
 704	struct se_node_acl *se_nacl = acl_to_nacl(item);
 705	int ret;
 706
 707	ret = core_tpg_set_initiator_node_tag(se_nacl->se_tpg, se_nacl, page);
 708
 709	if (ret < 0)
 710		return ret;
 711	return count;
 712}
 713
 714CONFIGFS_ATTR_RO(lio_target_nacl_, info);
 715CONFIGFS_ATTR(lio_target_nacl_, cmdsn_depth);
 716CONFIGFS_ATTR(lio_target_nacl_, tag);
 717
 718static struct configfs_attribute *lio_target_initiator_attrs[] = {
 719	&lio_target_nacl_attr_info,
 720	&lio_target_nacl_attr_cmdsn_depth,
 721	&lio_target_nacl_attr_tag,
 722	NULL,
 723};
 724
 725static int lio_target_init_nodeacl(struct se_node_acl *se_nacl,
 726		const char *name)
 727{
 728	struct iscsi_node_acl *acl = to_iscsi_nacl(se_nacl);
 729
 730	config_group_init_type_name(&acl->node_stat_grps.iscsi_sess_stats_group,
 731			"iscsi_sess_stats", &iscsi_stat_sess_cit);
 732	configfs_add_default_group(&acl->node_stat_grps.iscsi_sess_stats_group,
 733			&se_nacl->acl_fabric_stat_group);
 734	return 0;
 735}
 736
 737/* End items for lio_target_acl_cit */
 738
 739/* Start items for lio_target_tpg_attrib_cit */
 740
 741#define DEF_TPG_ATTRIB(name)						\
 742									\
 743static ssize_t iscsi_tpg_attrib_##name##_show(struct config_item *item,	\
 744		char *page)						\
 745{									\
 746	struct se_portal_group *se_tpg = attrib_to_tpg(item);		\
 747	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);		\
 748	ssize_t rb;							\
 749									\
 750	if (iscsit_get_tpg(tpg) < 0)					\
 751		return -EINVAL;						\
 752									\
 753	rb = sysfs_emit(page, "%u\n", tpg->tpg_attrib.name);		\
 754	iscsit_put_tpg(tpg);						\
 755	return rb;							\
 756}									\
 757									\
 758static ssize_t iscsi_tpg_attrib_##name##_store(struct config_item *item,\
 759		const char *page, size_t count)				\
 760{									\
 761	struct se_portal_group *se_tpg = attrib_to_tpg(item);		\
 762	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);		\
 763	u32 val;							\
 764	int ret;							\
 765									\
 766	if (iscsit_get_tpg(tpg) < 0)					\
 767		return -EINVAL;						\
 768									\
 769	ret = kstrtou32(page, 0, &val);					\
 770	if (ret)							\
 771		goto out;						\
 772	ret = iscsit_ta_##name(tpg, val);				\
 773	if (ret < 0)							\
 774		goto out;						\
 775									\
 776	iscsit_put_tpg(tpg);						\
 777	return count;							\
 778out:									\
 779	iscsit_put_tpg(tpg);						\
 780	return ret;							\
 781}									\
 782CONFIGFS_ATTR(iscsi_tpg_attrib_, name)
 783
 784DEF_TPG_ATTRIB(authentication);
 785DEF_TPG_ATTRIB(login_timeout);
 786DEF_TPG_ATTRIB(generate_node_acls);
 787DEF_TPG_ATTRIB(default_cmdsn_depth);
 788DEF_TPG_ATTRIB(cache_dynamic_acls);
 789DEF_TPG_ATTRIB(demo_mode_write_protect);
 790DEF_TPG_ATTRIB(prod_mode_write_protect);
 791DEF_TPG_ATTRIB(demo_mode_discovery);
 792DEF_TPG_ATTRIB(default_erl);
 793DEF_TPG_ATTRIB(t10_pi);
 794DEF_TPG_ATTRIB(fabric_prot_type);
 795DEF_TPG_ATTRIB(tpg_enabled_sendtargets);
 796DEF_TPG_ATTRIB(login_keys_workaround);
 797
 798static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
 799	&iscsi_tpg_attrib_attr_authentication,
 800	&iscsi_tpg_attrib_attr_login_timeout,
 801	&iscsi_tpg_attrib_attr_generate_node_acls,
 802	&iscsi_tpg_attrib_attr_default_cmdsn_depth,
 803	&iscsi_tpg_attrib_attr_cache_dynamic_acls,
 804	&iscsi_tpg_attrib_attr_demo_mode_write_protect,
 805	&iscsi_tpg_attrib_attr_prod_mode_write_protect,
 806	&iscsi_tpg_attrib_attr_demo_mode_discovery,
 807	&iscsi_tpg_attrib_attr_default_erl,
 808	&iscsi_tpg_attrib_attr_t10_pi,
 809	&iscsi_tpg_attrib_attr_fabric_prot_type,
 810	&iscsi_tpg_attrib_attr_tpg_enabled_sendtargets,
 811	&iscsi_tpg_attrib_attr_login_keys_workaround,
 812	NULL,
 813};
 814
 815/* End items for lio_target_tpg_attrib_cit */
 816
 817/* Start items for lio_target_tpg_auth_cit */
 818
 819#define __DEF_TPG_AUTH_STR(prefix, name, flags)					\
 820static ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg,	\
 821		char *page)							\
 822{										\
 823	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);			\
 824	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
 825										\
 826	if (!capable(CAP_SYS_ADMIN))						\
 827		return -EPERM;							\
 828										\
 829	return snprintf(page, PAGE_SIZE, "%s\n", auth->name);			\
 830}										\
 831										\
 832static ssize_t __iscsi_##prefix##_##name##_store(struct se_portal_group *se_tpg,\
 833		const char *page, size_t count)					\
 834{										\
 835	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);			\
 836	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
 837										\
 838	if (!capable(CAP_SYS_ADMIN))						\
 839		return -EPERM;							\
 840										\
 841	snprintf(auth->name, sizeof(auth->name), "%s", page);			\
 842	if (!(strncmp("NULL", auth->name, 4)))					\
 843		auth->naf_flags &= ~flags;					\
 844	else									\
 845		auth->naf_flags |= flags;					\
 846										\
 847	if ((auth->naf_flags & NAF_USERID_IN_SET) &&				\
 848	    (auth->naf_flags & NAF_PASSWORD_IN_SET))				\
 849		auth->authenticate_target = 1;					\
 850	else									\
 851		auth->authenticate_target = 0;					\
 852										\
 853	return count;								\
 854}
 855
 856#define DEF_TPG_AUTH_STR(name, flags)						\
 857	__DEF_TPG_AUTH_STR(tpg_auth, name, flags)				\
 858static ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item,		\
 859		char *page)							\
 860{										\
 861	return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page);		\
 862}										\
 863										\
 864static ssize_t iscsi_tpg_auth_##name##_store(struct config_item *item,		\
 865		const char *page, size_t count)					\
 866{										\
 867	return __iscsi_tpg_auth_##name##_store(auth_to_tpg(item), page, count);	\
 868}										\
 869										\
 870CONFIGFS_ATTR(iscsi_tpg_auth_, name);
 871
 872
 873DEF_TPG_AUTH_STR(userid, NAF_USERID_SET);
 874DEF_TPG_AUTH_STR(password, NAF_PASSWORD_SET);
 875DEF_TPG_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
 876DEF_TPG_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
 877
 878#define __DEF_TPG_AUTH_INT(prefix, name)					\
 879static ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg,	\
 880		char *page)								\
 881{										\
 882	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);			\
 883	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
 884										\
 885	if (!capable(CAP_SYS_ADMIN))						\
 886		return -EPERM;							\
 887										\
 888	return snprintf(page, PAGE_SIZE, "%d\n", auth->name);			\
 889}
 890
 891#define DEF_TPG_AUTH_INT(name)							\
 892	__DEF_TPG_AUTH_INT(tpg_auth, name)					\
 893static ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item,		\
 894		char *page) \
 895{										\
 896	return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page);		\
 897}										\
 898CONFIGFS_ATTR_RO(iscsi_tpg_auth_, name);
 899
 900DEF_TPG_AUTH_INT(authenticate_target);
 901
 902static struct configfs_attribute *lio_target_tpg_auth_attrs[] = {
 903	&iscsi_tpg_auth_attr_userid,
 904	&iscsi_tpg_auth_attr_password,
 905	&iscsi_tpg_auth_attr_authenticate_target,
 906	&iscsi_tpg_auth_attr_userid_mutual,
 907	&iscsi_tpg_auth_attr_password_mutual,
 908	NULL,
 909};
 910
 911/* End items for lio_target_tpg_auth_cit */
 912
 913/* Start items for lio_target_tpg_param_cit */
 914
 915#define DEF_TPG_PARAM(name)						\
 916static ssize_t iscsi_tpg_param_##name##_show(struct config_item *item,	\
 917		char *page)						\
 918{									\
 919	struct se_portal_group *se_tpg = param_to_tpg(item);		\
 920	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);		\
 921	struct iscsi_param *param;					\
 922	ssize_t rb;							\
 923									\
 924	if (iscsit_get_tpg(tpg) < 0)					\
 925		return -EINVAL;						\
 926									\
 927	param = iscsi_find_param_from_key(__stringify(name),		\
 928				tpg->param_list);			\
 929	if (!param) {							\
 930		iscsit_put_tpg(tpg);					\
 931		return -EINVAL;						\
 932	}								\
 933	rb = snprintf(page, PAGE_SIZE, "%s\n", param->value);		\
 934									\
 935	iscsit_put_tpg(tpg);						\
 936	return rb;							\
 937}									\
 938static ssize_t iscsi_tpg_param_##name##_store(struct config_item *item, \
 939		const char *page, size_t count)				\
 940{									\
 941	struct se_portal_group *se_tpg = param_to_tpg(item);		\
 942	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);		\
 943	char *buf;							\
 944	int ret, len;							\
 945									\
 946	buf = kzalloc(PAGE_SIZE, GFP_KERNEL);				\
 947	if (!buf)							\
 948		return -ENOMEM;						\
 949	len = snprintf(buf, PAGE_SIZE, "%s=%s", __stringify(name), page);	\
 950	if (isspace(buf[len-1]))					\
 951		buf[len-1] = '\0'; /* Kill newline */			\
 952									\
 953	if (iscsit_get_tpg(tpg) < 0) {					\
 954		kfree(buf);						\
 955		return -EINVAL;						\
 956	}								\
 957									\
 958	ret = iscsi_change_param_value(buf, tpg->param_list, 1);	\
 959	if (ret < 0)							\
 960		goto out;						\
 961									\
 962	kfree(buf);							\
 963	iscsit_put_tpg(tpg);						\
 964	return count;							\
 965out:									\
 966	kfree(buf);							\
 967	iscsit_put_tpg(tpg);						\
 968	return -EINVAL;							\
 969}									\
 970CONFIGFS_ATTR(iscsi_tpg_param_, name)
 971
 972DEF_TPG_PARAM(AuthMethod);
 973DEF_TPG_PARAM(HeaderDigest);
 974DEF_TPG_PARAM(DataDigest);
 975DEF_TPG_PARAM(MaxConnections);
 976DEF_TPG_PARAM(TargetAlias);
 977DEF_TPG_PARAM(InitialR2T);
 978DEF_TPG_PARAM(ImmediateData);
 979DEF_TPG_PARAM(MaxRecvDataSegmentLength);
 980DEF_TPG_PARAM(MaxXmitDataSegmentLength);
 981DEF_TPG_PARAM(MaxBurstLength);
 982DEF_TPG_PARAM(FirstBurstLength);
 983DEF_TPG_PARAM(DefaultTime2Wait);
 984DEF_TPG_PARAM(DefaultTime2Retain);
 985DEF_TPG_PARAM(MaxOutstandingR2T);
 986DEF_TPG_PARAM(DataPDUInOrder);
 987DEF_TPG_PARAM(DataSequenceInOrder);
 988DEF_TPG_PARAM(ErrorRecoveryLevel);
 989DEF_TPG_PARAM(IFMarker);
 990DEF_TPG_PARAM(OFMarker);
 991DEF_TPG_PARAM(IFMarkInt);
 992DEF_TPG_PARAM(OFMarkInt);
 993
 994static struct configfs_attribute *lio_target_tpg_param_attrs[] = {
 995	&iscsi_tpg_param_attr_AuthMethod,
 996	&iscsi_tpg_param_attr_HeaderDigest,
 997	&iscsi_tpg_param_attr_DataDigest,
 998	&iscsi_tpg_param_attr_MaxConnections,
 999	&iscsi_tpg_param_attr_TargetAlias,
1000	&iscsi_tpg_param_attr_InitialR2T,
1001	&iscsi_tpg_param_attr_ImmediateData,
1002	&iscsi_tpg_param_attr_MaxRecvDataSegmentLength,
1003	&iscsi_tpg_param_attr_MaxXmitDataSegmentLength,
1004	&iscsi_tpg_param_attr_MaxBurstLength,
1005	&iscsi_tpg_param_attr_FirstBurstLength,
1006	&iscsi_tpg_param_attr_DefaultTime2Wait,
1007	&iscsi_tpg_param_attr_DefaultTime2Retain,
1008	&iscsi_tpg_param_attr_MaxOutstandingR2T,
1009	&iscsi_tpg_param_attr_DataPDUInOrder,
1010	&iscsi_tpg_param_attr_DataSequenceInOrder,
1011	&iscsi_tpg_param_attr_ErrorRecoveryLevel,
1012	&iscsi_tpg_param_attr_IFMarker,
1013	&iscsi_tpg_param_attr_OFMarker,
1014	&iscsi_tpg_param_attr_IFMarkInt,
1015	&iscsi_tpg_param_attr_OFMarkInt,
1016	NULL,
1017};
1018
1019/* End items for lio_target_tpg_param_cit */
1020
1021/* Start items for lio_target_tpg_cit */
1022
1023static ssize_t lio_target_tpg_dynamic_sessions_show(struct config_item *item,
1024		char *page)
1025{
1026	return target_show_dynamic_sessions(to_tpg(item), page);
1027}
1028
1029CONFIGFS_ATTR_RO(lio_target_tpg_, dynamic_sessions);
1030
1031static struct configfs_attribute *lio_target_tpg_attrs[] = {
1032	&lio_target_tpg_attr_dynamic_sessions,
1033	NULL,
1034};
1035
1036/* End items for lio_target_tpg_cit */
1037
1038/* Start items for lio_target_tiqn_cit */
1039
1040static struct se_portal_group *lio_target_tiqn_addtpg(struct se_wwn *wwn,
1041						      const char *name)
1042{
1043	struct iscsi_portal_group *tpg;
1044	struct iscsi_tiqn *tiqn;
1045	char *tpgt_str;
1046	int ret;
1047	u16 tpgt;
1048
1049	tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
1050	/*
1051	 * Only tpgt_# directory groups can be created below
1052	 * target/iscsi/iqn.superturodiskarry/
1053	 */
1054	tpgt_str = strstr(name, "tpgt_");
1055	if (!tpgt_str) {
1056		pr_err("Unable to locate \"tpgt_#\" directory"
1057				" group\n");
1058		return NULL;
1059	}
1060	tpgt_str += 5; /* Skip ahead of "tpgt_" */
1061	ret = kstrtou16(tpgt_str, 0, &tpgt);
1062	if (ret)
1063		return NULL;
1064
1065	tpg = iscsit_alloc_portal_group(tiqn, tpgt);
1066	if (!tpg)
1067		return NULL;
1068
1069	ret = core_tpg_register(wwn, &tpg->tpg_se_tpg, SCSI_PROTOCOL_ISCSI);
1070	if (ret < 0)
1071		goto free_out;
1072
1073	ret = iscsit_tpg_add_portal_group(tiqn, tpg);
1074	if (ret != 0)
1075		goto out;
1076
1077	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
1078	pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated TPG: %s\n",
1079			name);
1080	return &tpg->tpg_se_tpg;
1081out:
1082	core_tpg_deregister(&tpg->tpg_se_tpg);
1083free_out:
1084	kfree(tpg);
1085	return NULL;
1086}
1087
1088static int lio_target_tiqn_enabletpg(struct se_portal_group *se_tpg,
1089				     bool enable)
1090{
1091	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);
1092	int ret;
1093
1094	ret = iscsit_get_tpg(tpg);
1095	if (ret < 0)
1096		return -EINVAL;
1097
1098	if (enable) {
1099		ret = iscsit_tpg_enable_portal_group(tpg);
1100		if (ret < 0)
1101			goto out;
1102	} else {
1103		/*
1104		 * iscsit_tpg_disable_portal_group() assumes force=1
1105		 */
1106		ret = iscsit_tpg_disable_portal_group(tpg, 1);
1107		if (ret < 0)
1108			goto out;
1109	}
1110
1111	iscsit_put_tpg(tpg);
1112	return 0;
1113out:
1114	iscsit_put_tpg(tpg);
1115	return -EINVAL;
1116}
1117
1118static void lio_target_tiqn_deltpg(struct se_portal_group *se_tpg)
1119{
1120	struct iscsi_portal_group *tpg;
1121	struct iscsi_tiqn *tiqn;
1122
1123	tpg = to_iscsi_tpg(se_tpg);
1124	tiqn = tpg->tpg_tiqn;
1125	/*
1126	 * iscsit_tpg_del_portal_group() assumes force=1
1127	 */
1128	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> Releasing TPG\n");
1129	iscsit_tpg_del_portal_group(tiqn, tpg, 1);
1130}
1131
1132/* End items for lio_target_tiqn_cit */
1133
1134/* Start LIO-Target TIQN struct config_item lio_target_cit */
1135
1136static ssize_t lio_target_wwn_lio_version_show(struct config_item *item,
1137		char *page)
1138{
1139	return sysfs_emit(page, "Datera Inc. iSCSI Target %s\n", ISCSIT_VERSION);
1140}
1141
1142CONFIGFS_ATTR_RO(lio_target_wwn_, lio_version);
1143
1144static ssize_t lio_target_wwn_cpus_allowed_list_show(
1145		struct config_item *item, char *page)
1146{
1147	return sysfs_emit(page, "%*pbl\n",
1148		       cpumask_pr_args(iscsit_global->allowed_cpumask));
1149}
1150
1151static ssize_t lio_target_wwn_cpus_allowed_list_store(
1152		struct config_item *item, const char *page, size_t count)
1153{
1154	int ret = -ENOMEM;
1155	char *orig;
1156	cpumask_var_t new_allowed_cpumask;
1157
1158	if (!zalloc_cpumask_var(&new_allowed_cpumask, GFP_KERNEL))
1159		goto out;
1160
1161	orig = kstrdup(page, GFP_KERNEL);
1162	if (!orig)
1163		goto out_free_cpumask;
1164
1165	ret = cpulist_parse(orig, new_allowed_cpumask);
1166	if (!ret)
1167		cpumask_copy(iscsit_global->allowed_cpumask,
1168			     new_allowed_cpumask);
1169
1170	kfree(orig);
1171out_free_cpumask:
1172	free_cpumask_var(new_allowed_cpumask);
1173out:
1174	return ret ? ret : count;
1175}
1176
1177CONFIGFS_ATTR(lio_target_wwn_, cpus_allowed_list);
1178
1179static struct configfs_attribute *lio_target_wwn_attrs[] = {
1180	&lio_target_wwn_attr_lio_version,
1181	&lio_target_wwn_attr_cpus_allowed_list,
1182	NULL,
1183};
1184
1185static struct se_wwn *lio_target_call_coreaddtiqn(
1186	struct target_fabric_configfs *tf,
1187	struct config_group *group,
1188	const char *name)
1189{
1190	struct iscsi_tiqn *tiqn;
1191
1192	tiqn = iscsit_add_tiqn((unsigned char *)name);
1193	if (IS_ERR(tiqn))
1194		return ERR_CAST(tiqn);
1195
1196	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
1197	pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:"
1198			" %s\n", name);
1199	return &tiqn->tiqn_wwn;
1200}
1201
1202static void lio_target_add_wwn_groups(struct se_wwn *wwn)
1203{
1204	struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
1205
1206	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group,
1207			"iscsi_instance", &iscsi_stat_instance_cit);
1208	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_instance_group,
1209			&tiqn->tiqn_wwn.fabric_stat_group);
1210
1211	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
1212			"iscsi_sess_err", &iscsi_stat_sess_err_cit);
1213	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
1214			&tiqn->tiqn_wwn.fabric_stat_group);
1215
1216	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
1217			"iscsi_tgt_attr", &iscsi_stat_tgt_attr_cit);
1218	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
1219			&tiqn->tiqn_wwn.fabric_stat_group);
1220
1221	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
1222			"iscsi_login_stats", &iscsi_stat_login_cit);
1223	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
1224			&tiqn->tiqn_wwn.fabric_stat_group);
1225
1226	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
1227			"iscsi_logout_stats", &iscsi_stat_logout_cit);
1228	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
1229			&tiqn->tiqn_wwn.fabric_stat_group);
1230}
1231
1232static void lio_target_call_coredeltiqn(
1233	struct se_wwn *wwn)
1234{
1235	struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
1236
1237	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n",
1238			tiqn->tiqn);
1239	iscsit_del_tiqn(tiqn);
1240}
1241
1242/* End LIO-Target TIQN struct contig_lio_target_cit */
1243
1244/* Start lio_target_discovery_auth_cit */
1245
1246#define DEF_DISC_AUTH_STR(name, flags)					\
1247	__DEF_NACL_AUTH_STR(disc, name, flags)				\
1248static ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \
1249{									\
1250	return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl,\
1251		page);							\
1252}									\
1253static ssize_t iscsi_disc_##name##_store(struct config_item *item,	\
1254		const char *page, size_t count)				\
1255{									\
1256	return __iscsi_disc_##name##_store(&iscsit_global->discovery_acl,	\
1257		page, count);						\
1258									\
1259}									\
1260CONFIGFS_ATTR(iscsi_disc_, name)
1261
1262DEF_DISC_AUTH_STR(userid, NAF_USERID_SET);
1263DEF_DISC_AUTH_STR(password, NAF_PASSWORD_SET);
1264DEF_DISC_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
1265DEF_DISC_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
1266
1267#define DEF_DISC_AUTH_INT(name)						\
1268	__DEF_NACL_AUTH_INT(disc, name)					\
1269static ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \
1270{									\
1271	return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl, \
1272			page);						\
1273}									\
1274CONFIGFS_ATTR_RO(iscsi_disc_, name)
1275
1276DEF_DISC_AUTH_INT(authenticate_target);
1277
1278
1279static ssize_t iscsi_disc_enforce_discovery_auth_show(struct config_item *item,
1280		char *page)
1281{
1282	struct iscsi_node_auth *discovery_auth = &iscsit_global->discovery_acl.node_auth;
1283
1284	return sysfs_emit(page, "%d\n", discovery_auth->enforce_discovery_auth);
1285}
1286
1287static ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item,
1288		const char *page, size_t count)
1289{
1290	struct iscsi_param *param;
1291	struct iscsi_portal_group *discovery_tpg = iscsit_global->discovery_tpg;
1292	u32 op;
1293	int err;
1294
1295	err = kstrtou32(page, 0, &op);
1296	if (err)
1297		return -EINVAL;
1298	if ((op != 1) && (op != 0)) {
1299		pr_err("Illegal value for enforce_discovery_auth:"
1300				" %u\n", op);
1301		return -EINVAL;
1302	}
1303
1304	if (!discovery_tpg) {
1305		pr_err("iscsit_global->discovery_tpg is NULL\n");
1306		return -EINVAL;
1307	}
1308
1309	param = iscsi_find_param_from_key(AUTHMETHOD,
1310				discovery_tpg->param_list);
1311	if (!param)
1312		return -EINVAL;
1313
1314	if (op) {
1315		/*
1316		 * Reset the AuthMethod key to CHAP.
1317		 */
1318		if (iscsi_update_param_value(param, CHAP) < 0)
1319			return -EINVAL;
1320
1321		discovery_tpg->tpg_attrib.authentication = 1;
1322		iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 1;
1323		pr_debug("LIO-CORE[0] Successfully enabled"
1324			" authentication enforcement for iSCSI"
1325			" Discovery TPG\n");
1326	} else {
1327		/*
1328		 * Reset the AuthMethod key to CHAP,None
1329		 */
1330		if (iscsi_update_param_value(param, "CHAP,None") < 0)
1331			return -EINVAL;
1332
1333		discovery_tpg->tpg_attrib.authentication = 0;
1334		iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 0;
1335		pr_debug("LIO-CORE[0] Successfully disabled"
1336			" authentication enforcement for iSCSI"
1337			" Discovery TPG\n");
1338	}
1339
1340	return count;
1341}
1342
1343CONFIGFS_ATTR(iscsi_disc_, enforce_discovery_auth);
1344
1345static struct configfs_attribute *lio_target_discovery_auth_attrs[] = {
1346	&iscsi_disc_attr_userid,
1347	&iscsi_disc_attr_password,
1348	&iscsi_disc_attr_authenticate_target,
1349	&iscsi_disc_attr_userid_mutual,
1350	&iscsi_disc_attr_password_mutual,
1351	&iscsi_disc_attr_enforce_discovery_auth,
1352	NULL,
1353};
1354
1355/* End lio_target_discovery_auth_cit */
1356
1357/* Start functions for target_core_fabric_ops */
1358
1359static int iscsi_get_cmd_state(struct se_cmd *se_cmd)
1360{
1361	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1362
1363	return cmd->i_state;
1364}
1365
1366static u32 lio_sess_get_index(struct se_session *se_sess)
1367{
1368	struct iscsit_session *sess = se_sess->fabric_sess_ptr;
1369
1370	return sess->session_index;
1371}
1372
1373static u32 lio_sess_get_initiator_sid(
1374	struct se_session *se_sess,
1375	unsigned char *buf,
1376	u32 size)
1377{
1378	struct iscsit_session *sess = se_sess->fabric_sess_ptr;
1379	/*
1380	 * iSCSI Initiator Session Identifier from RFC-3720.
1381	 */
1382	return snprintf(buf, size, "%6phN", sess->isid);
1383}
1384
1385static int lio_queue_data_in(struct se_cmd *se_cmd)
1386{
1387	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1388	struct iscsit_conn *conn = cmd->conn;
1389
1390	cmd->i_state = ISTATE_SEND_DATAIN;
1391	return conn->conn_transport->iscsit_queue_data_in(conn, cmd);
1392}
1393
1394static int lio_write_pending(struct se_cmd *se_cmd)
1395{
1396	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1397	struct iscsit_conn *conn = cmd->conn;
1398
1399	if (!cmd->immediate_data && !cmd->unsolicited_data)
1400		return conn->conn_transport->iscsit_get_dataout(conn, cmd, false);
1401
1402	return 0;
1403}
1404
1405static int lio_queue_status(struct se_cmd *se_cmd)
1406{
1407	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1408	struct iscsit_conn *conn = cmd->conn;
1409
1410	cmd->i_state = ISTATE_SEND_STATUS;
1411
1412	if (cmd->se_cmd.scsi_status || cmd->sense_reason) {
1413		return iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
1414	}
1415	return conn->conn_transport->iscsit_queue_status(conn, cmd);
1416}
1417
1418static void lio_queue_tm_rsp(struct se_cmd *se_cmd)
1419{
1420	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1421
1422	cmd->i_state = ISTATE_SEND_TASKMGTRSP;
1423	iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state);
1424}
1425
1426static void lio_aborted_task(struct se_cmd *se_cmd)
1427{
1428	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1429
1430	cmd->conn->conn_transport->iscsit_aborted_task(cmd->conn, cmd);
1431}
1432
1433static char *lio_tpg_get_endpoint_wwn(struct se_portal_group *se_tpg)
1434{
1435	return to_iscsi_tpg(se_tpg)->tpg_tiqn->tiqn;
1436}
1437
1438static u16 lio_tpg_get_tag(struct se_portal_group *se_tpg)
1439{
1440	return to_iscsi_tpg(se_tpg)->tpgt;
1441}
1442
1443static u32 lio_tpg_get_default_depth(struct se_portal_group *se_tpg)
1444{
1445	return to_iscsi_tpg(se_tpg)->tpg_attrib.default_cmdsn_depth;
1446}
1447
1448static int lio_tpg_check_demo_mode(struct se_portal_group *se_tpg)
1449{
1450	return to_iscsi_tpg(se_tpg)->tpg_attrib.generate_node_acls;
1451}
1452
1453static int lio_tpg_check_demo_mode_cache(struct se_portal_group *se_tpg)
1454{
1455	return to_iscsi_tpg(se_tpg)->tpg_attrib.cache_dynamic_acls;
1456}
1457
1458static int lio_tpg_check_demo_mode_write_protect(
1459	struct se_portal_group *se_tpg)
1460{
1461	return to_iscsi_tpg(se_tpg)->tpg_attrib.demo_mode_write_protect;
1462}
1463
1464static int lio_tpg_check_prod_mode_write_protect(
1465	struct se_portal_group *se_tpg)
1466{
1467	return to_iscsi_tpg(se_tpg)->tpg_attrib.prod_mode_write_protect;
1468}
1469
1470static int lio_tpg_check_prot_fabric_only(
1471	struct se_portal_group *se_tpg)
1472{
1473	/*
1474	 * Only report fabric_prot_type if t10_pi has also been enabled
1475	 * for incoming ib_isert sessions.
1476	 */
1477	if (!to_iscsi_tpg(se_tpg)->tpg_attrib.t10_pi)
1478		return 0;
1479	return to_iscsi_tpg(se_tpg)->tpg_attrib.fabric_prot_type;
1480}
1481
1482/*
1483 * This function calls iscsit_inc_session_usage_count() on the
1484 * struct iscsit_session in question.
1485 */
1486static void lio_tpg_close_session(struct se_session *se_sess)
1487{
1488	struct iscsit_session *sess = se_sess->fabric_sess_ptr;
1489	struct se_portal_group *se_tpg = &sess->tpg->tpg_se_tpg;
1490
1491	spin_lock_bh(&se_tpg->session_lock);
1492	spin_lock(&sess->conn_lock);
1493	if (atomic_read(&sess->session_fall_back_to_erl0) ||
1494	    atomic_read(&sess->session_logout) ||
1495	    atomic_read(&sess->session_close) ||
1496	    (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
1497		spin_unlock(&sess->conn_lock);
1498		spin_unlock_bh(&se_tpg->session_lock);
1499		return;
1500	}
1501	iscsit_inc_session_usage_count(sess);
1502	atomic_set(&sess->session_reinstatement, 1);
1503	atomic_set(&sess->session_fall_back_to_erl0, 1);
1504	atomic_set(&sess->session_close, 1);
1505	spin_unlock(&sess->conn_lock);
1506
1507	iscsit_stop_time2retain_timer(sess);
1508	spin_unlock_bh(&se_tpg->session_lock);
1509
1510	iscsit_stop_session(sess, 1, 1);
1511	iscsit_dec_session_usage_count(sess);
1512}
1513
1514static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg)
1515{
1516	return to_iscsi_tpg(se_tpg)->tpg_tiqn->tiqn_index;
1517}
1518
1519static void lio_set_default_node_attributes(struct se_node_acl *se_acl)
1520{
1521	struct iscsi_node_acl *acl = to_iscsi_nacl(se_acl);
1522	struct se_portal_group *se_tpg = se_acl->se_tpg;
1523	struct iscsi_portal_group *tpg = to_iscsi_tpg(se_tpg);
1524
1525	acl->node_attrib.nacl = acl;
1526	iscsit_set_default_node_attribues(acl, tpg);
1527}
1528
1529static int lio_check_stop_free(struct se_cmd *se_cmd)
1530{
1531	return target_put_sess_cmd(se_cmd);
1532}
1533
1534static void lio_release_cmd(struct se_cmd *se_cmd)
1535{
1536	struct iscsit_cmd *cmd = container_of(se_cmd, struct iscsit_cmd, se_cmd);
1537
1538	pr_debug("Entering lio_release_cmd for se_cmd: %p\n", se_cmd);
1539	iscsit_release_cmd(cmd);
1540}
1541
1542const struct target_core_fabric_ops iscsi_ops = {
1543	.module				= THIS_MODULE,
1544	.fabric_alias			= "iscsi",
1545	.fabric_name			= "iSCSI",
1546	.node_acl_size			= sizeof(struct iscsi_node_acl),
1547	.tpg_get_wwn			= lio_tpg_get_endpoint_wwn,
1548	.tpg_get_tag			= lio_tpg_get_tag,
1549	.tpg_get_default_depth		= lio_tpg_get_default_depth,
1550	.tpg_check_demo_mode		= lio_tpg_check_demo_mode,
1551	.tpg_check_demo_mode_cache	= lio_tpg_check_demo_mode_cache,
1552	.tpg_check_demo_mode_write_protect =
1553			lio_tpg_check_demo_mode_write_protect,
1554	.tpg_check_prod_mode_write_protect =
1555			lio_tpg_check_prod_mode_write_protect,
1556	.tpg_check_prot_fabric_only	= &lio_tpg_check_prot_fabric_only,
1557	.tpg_get_inst_index		= lio_tpg_get_inst_index,
1558	.check_stop_free		= lio_check_stop_free,
1559	.release_cmd			= lio_release_cmd,
1560	.close_session			= lio_tpg_close_session,
1561	.sess_get_index			= lio_sess_get_index,
1562	.sess_get_initiator_sid		= lio_sess_get_initiator_sid,
1563	.write_pending			= lio_write_pending,
1564	.set_default_node_attributes	= lio_set_default_node_attributes,
1565	.get_cmd_state			= iscsi_get_cmd_state,
1566	.queue_data_in			= lio_queue_data_in,
1567	.queue_status			= lio_queue_status,
1568	.queue_tm_rsp			= lio_queue_tm_rsp,
1569	.aborted_task			= lio_aborted_task,
1570	.fabric_make_wwn		= lio_target_call_coreaddtiqn,
1571	.fabric_drop_wwn		= lio_target_call_coredeltiqn,
1572	.add_wwn_groups			= lio_target_add_wwn_groups,
1573	.fabric_make_tpg		= lio_target_tiqn_addtpg,
1574	.fabric_enable_tpg		= lio_target_tiqn_enabletpg,
1575	.fabric_drop_tpg		= lio_target_tiqn_deltpg,
1576	.fabric_make_np			= lio_target_call_addnptotpg,
1577	.fabric_drop_np			= lio_target_call_delnpfromtpg,
1578	.fabric_init_nodeacl		= lio_target_init_nodeacl,
1579
1580	.tfc_discovery_attrs		= lio_target_discovery_auth_attrs,
1581	.tfc_wwn_attrs			= lio_target_wwn_attrs,
1582	.tfc_tpg_base_attrs		= lio_target_tpg_attrs,
1583	.tfc_tpg_attrib_attrs		= lio_target_tpg_attrib_attrs,
1584	.tfc_tpg_auth_attrs		= lio_target_tpg_auth_attrs,
1585	.tfc_tpg_param_attrs		= lio_target_tpg_param_attrs,
1586	.tfc_tpg_np_base_attrs		= lio_target_portal_attrs,
1587	.tfc_tpg_nacl_base_attrs	= lio_target_initiator_attrs,
1588	.tfc_tpg_nacl_attrib_attrs	= lio_target_nacl_attrib_attrs,
1589	.tfc_tpg_nacl_auth_attrs	= lio_target_nacl_auth_attrs,
1590	.tfc_tpg_nacl_param_attrs	= lio_target_nacl_param_attrs,
1591
1592	.write_pending_must_be_called	= 1,
1593
1594	.default_submit_type		= TARGET_DIRECT_SUBMIT,
1595	.direct_submit_supp		= 1,
1596};
~/ Read-only file preview.