18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*******************************************************************************
38c2ecf20Sopenharmony_ci * This file contains the configfs implementation for iSCSI Target mode
48c2ecf20Sopenharmony_ci * from the LIO-Target Project.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * (c) Copyright 2007-2013 Datera, Inc.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci ****************************************************************************/
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/configfs.h>
138c2ecf20Sopenharmony_ci#include <linux/ctype.h>
148c2ecf20Sopenharmony_ci#include <linux/export.h>
158c2ecf20Sopenharmony_ci#include <linux/inet.h>
168c2ecf20Sopenharmony_ci#include <linux/module.h>
178c2ecf20Sopenharmony_ci#include <net/ipv6.h>
188c2ecf20Sopenharmony_ci#include <target/target_core_base.h>
198c2ecf20Sopenharmony_ci#include <target/target_core_fabric.h>
208c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_transport.h>
218c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_target_core.h>
228c2ecf20Sopenharmony_ci#include "iscsi_target_parameters.h"
238c2ecf20Sopenharmony_ci#include "iscsi_target_device.h"
248c2ecf20Sopenharmony_ci#include "iscsi_target_erl0.h"
258c2ecf20Sopenharmony_ci#include "iscsi_target_nodeattrib.h"
268c2ecf20Sopenharmony_ci#include "iscsi_target_tpg.h"
278c2ecf20Sopenharmony_ci#include "iscsi_target_util.h"
288c2ecf20Sopenharmony_ci#include "iscsi_target.h"
298c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_target_stat.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci/* Start items for lio_target_portal_cit */
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic inline struct iscsi_tpg_np *to_iscsi_tpg_np(struct config_item *item)
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	return container_of(to_tpg_np(item), struct iscsi_tpg_np, se_tpg_np);
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_driver_show(struct config_item *item, char *page,
408c2ecf20Sopenharmony_ci					 enum iscsit_transport_type type)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
438c2ecf20Sopenharmony_ci	struct iscsi_tpg_np *tpg_np_new;
448c2ecf20Sopenharmony_ci	ssize_t rb;
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type);
478c2ecf20Sopenharmony_ci	if (tpg_np_new)
488c2ecf20Sopenharmony_ci		rb = sprintf(page, "1\n");
498c2ecf20Sopenharmony_ci	else
508c2ecf20Sopenharmony_ci		rb = sprintf(page, "0\n");
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	return rb;
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_driver_store(struct config_item *item,
568c2ecf20Sopenharmony_ci		const char *page, size_t count, enum iscsit_transport_type type,
578c2ecf20Sopenharmony_ci		const char *mod_name)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
608c2ecf20Sopenharmony_ci	struct iscsi_np *np;
618c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg;
628c2ecf20Sopenharmony_ci	struct iscsi_tpg_np *tpg_np_new = NULL;
638c2ecf20Sopenharmony_ci	u32 op;
648c2ecf20Sopenharmony_ci	int rc;
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci	rc = kstrtou32(page, 0, &op);
678c2ecf20Sopenharmony_ci	if (rc)
688c2ecf20Sopenharmony_ci		return rc;
698c2ecf20Sopenharmony_ci	if ((op != 1) && (op != 0)) {
708c2ecf20Sopenharmony_ci		pr_err("Illegal value for tpg_enable: %u\n", op);
718c2ecf20Sopenharmony_ci		return -EINVAL;
728c2ecf20Sopenharmony_ci	}
738c2ecf20Sopenharmony_ci	np = tpg_np->tpg_np;
748c2ecf20Sopenharmony_ci	if (!np) {
758c2ecf20Sopenharmony_ci		pr_err("Unable to locate struct iscsi_np from"
768c2ecf20Sopenharmony_ci				" struct iscsi_tpg_np\n");
778c2ecf20Sopenharmony_ci		return -EINVAL;
788c2ecf20Sopenharmony_ci	}
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	tpg = tpg_np->tpg;
818c2ecf20Sopenharmony_ci	if (iscsit_get_tpg(tpg) < 0)
828c2ecf20Sopenharmony_ci		return -EINVAL;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	if (op) {
858c2ecf20Sopenharmony_ci		if (strlen(mod_name)) {
868c2ecf20Sopenharmony_ci			rc = request_module(mod_name);
878c2ecf20Sopenharmony_ci			if (rc != 0) {
888c2ecf20Sopenharmony_ci				pr_warn("Unable to request_module for %s\n",
898c2ecf20Sopenharmony_ci					mod_name);
908c2ecf20Sopenharmony_ci				rc = 0;
918c2ecf20Sopenharmony_ci			}
928c2ecf20Sopenharmony_ci		}
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci		tpg_np_new = iscsit_tpg_add_network_portal(tpg,
958c2ecf20Sopenharmony_ci					&np->np_sockaddr, tpg_np, type);
968c2ecf20Sopenharmony_ci		if (IS_ERR(tpg_np_new)) {
978c2ecf20Sopenharmony_ci			rc = PTR_ERR(tpg_np_new);
988c2ecf20Sopenharmony_ci			goto out;
998c2ecf20Sopenharmony_ci		}
1008c2ecf20Sopenharmony_ci	} else {
1018c2ecf20Sopenharmony_ci		tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type);
1028c2ecf20Sopenharmony_ci		if (tpg_np_new) {
1038c2ecf20Sopenharmony_ci			rc = iscsit_tpg_del_network_portal(tpg, tpg_np_new);
1048c2ecf20Sopenharmony_ci			if (rc < 0)
1058c2ecf20Sopenharmony_ci				goto out;
1068c2ecf20Sopenharmony_ci		}
1078c2ecf20Sopenharmony_ci	}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
1108c2ecf20Sopenharmony_ci	return count;
1118c2ecf20Sopenharmony_ciout:
1128c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
1138c2ecf20Sopenharmony_ci	return rc;
1148c2ecf20Sopenharmony_ci}
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_iser_show(struct config_item *item, char *page)
1178c2ecf20Sopenharmony_ci{
1188c2ecf20Sopenharmony_ci	return lio_target_np_driver_show(item, page, ISCSI_INFINIBAND);
1198c2ecf20Sopenharmony_ci}
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_iser_store(struct config_item *item,
1228c2ecf20Sopenharmony_ci					const char *page, size_t count)
1238c2ecf20Sopenharmony_ci{
1248c2ecf20Sopenharmony_ci	return lio_target_np_driver_store(item, page, count,
1258c2ecf20Sopenharmony_ci					  ISCSI_INFINIBAND, "ib_isert");
1268c2ecf20Sopenharmony_ci}
1278c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_np_, iser);
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_cxgbit_show(struct config_item *item, char *page)
1308c2ecf20Sopenharmony_ci{
1318c2ecf20Sopenharmony_ci	return lio_target_np_driver_show(item, page, ISCSI_CXGBIT);
1328c2ecf20Sopenharmony_ci}
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_cxgbit_store(struct config_item *item,
1358c2ecf20Sopenharmony_ci					  const char *page, size_t count)
1368c2ecf20Sopenharmony_ci{
1378c2ecf20Sopenharmony_ci	return lio_target_np_driver_store(item, page, count,
1388c2ecf20Sopenharmony_ci					  ISCSI_CXGBIT, "cxgbit");
1398c2ecf20Sopenharmony_ci}
1408c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_np_, cxgbit);
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_portal_attrs[] = {
1438c2ecf20Sopenharmony_ci	&lio_target_np_attr_iser,
1448c2ecf20Sopenharmony_ci	&lio_target_np_attr_cxgbit,
1458c2ecf20Sopenharmony_ci	NULL,
1468c2ecf20Sopenharmony_ci};
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci/* Stop items for lio_target_portal_cit */
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci/* Start items for lio_target_np_cit */
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci#define MAX_PORTAL_LEN		256
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_cistatic struct se_tpg_np *lio_target_call_addnptotpg(
1558c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg,
1568c2ecf20Sopenharmony_ci	struct config_group *group,
1578c2ecf20Sopenharmony_ci	const char *name)
1588c2ecf20Sopenharmony_ci{
1598c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg;
1608c2ecf20Sopenharmony_ci	struct iscsi_tpg_np *tpg_np;
1618c2ecf20Sopenharmony_ci	char *str, *str2, *ip_str, *port_str;
1628c2ecf20Sopenharmony_ci	struct sockaddr_storage sockaddr = { };
1638c2ecf20Sopenharmony_ci	int ret;
1648c2ecf20Sopenharmony_ci	char buf[MAX_PORTAL_LEN + 1];
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci	if (strlen(name) > MAX_PORTAL_LEN) {
1678c2ecf20Sopenharmony_ci		pr_err("strlen(name): %d exceeds MAX_PORTAL_LEN: %d\n",
1688c2ecf20Sopenharmony_ci			(int)strlen(name), MAX_PORTAL_LEN);
1698c2ecf20Sopenharmony_ci		return ERR_PTR(-EOVERFLOW);
1708c2ecf20Sopenharmony_ci	}
1718c2ecf20Sopenharmony_ci	memset(buf, 0, MAX_PORTAL_LEN + 1);
1728c2ecf20Sopenharmony_ci	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	str = strstr(buf, "[");
1758c2ecf20Sopenharmony_ci	if (str) {
1768c2ecf20Sopenharmony_ci		str2 = strstr(str, "]");
1778c2ecf20Sopenharmony_ci		if (!str2) {
1788c2ecf20Sopenharmony_ci			pr_err("Unable to locate trailing \"]\""
1798c2ecf20Sopenharmony_ci				" in IPv6 iSCSI network portal address\n");
1808c2ecf20Sopenharmony_ci			return ERR_PTR(-EINVAL);
1818c2ecf20Sopenharmony_ci		}
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci		ip_str = str + 1; /* Skip over leading "[" */
1848c2ecf20Sopenharmony_ci		*str2 = '\0'; /* Terminate the unbracketed IPv6 address */
1858c2ecf20Sopenharmony_ci		str2++; /* Skip over the \0 */
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci		port_str = strstr(str2, ":");
1888c2ecf20Sopenharmony_ci		if (!port_str) {
1898c2ecf20Sopenharmony_ci			pr_err("Unable to locate \":port\""
1908c2ecf20Sopenharmony_ci				" in IPv6 iSCSI network portal address\n");
1918c2ecf20Sopenharmony_ci			return ERR_PTR(-EINVAL);
1928c2ecf20Sopenharmony_ci		}
1938c2ecf20Sopenharmony_ci		*port_str = '\0'; /* Terminate string for IP */
1948c2ecf20Sopenharmony_ci		port_str++; /* Skip over ":" */
1958c2ecf20Sopenharmony_ci	} else {
1968c2ecf20Sopenharmony_ci		ip_str = &buf[0];
1978c2ecf20Sopenharmony_ci		port_str = strstr(ip_str, ":");
1988c2ecf20Sopenharmony_ci		if (!port_str) {
1998c2ecf20Sopenharmony_ci			pr_err("Unable to locate \":port\""
2008c2ecf20Sopenharmony_ci				" in IPv4 iSCSI network portal address\n");
2018c2ecf20Sopenharmony_ci			return ERR_PTR(-EINVAL);
2028c2ecf20Sopenharmony_ci		}
2038c2ecf20Sopenharmony_ci		*port_str = '\0'; /* Terminate string for IP */
2048c2ecf20Sopenharmony_ci		port_str++; /* Skip over ":" */
2058c2ecf20Sopenharmony_ci	}
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str,
2088c2ecf20Sopenharmony_ci			port_str, &sockaddr);
2098c2ecf20Sopenharmony_ci	if (ret) {
2108c2ecf20Sopenharmony_ci		pr_err("malformed ip/port passed: %s\n", name);
2118c2ecf20Sopenharmony_ci		return ERR_PTR(ret);
2128c2ecf20Sopenharmony_ci	}
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
2158c2ecf20Sopenharmony_ci	ret = iscsit_get_tpg(tpg);
2168c2ecf20Sopenharmony_ci	if (ret < 0)
2178c2ecf20Sopenharmony_ci		return ERR_PTR(-EINVAL);
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s TPGT: %hu"
2208c2ecf20Sopenharmony_ci		" PORTAL: %s\n",
2218c2ecf20Sopenharmony_ci		config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
2228c2ecf20Sopenharmony_ci		tpg->tpgt, name);
2238c2ecf20Sopenharmony_ci	/*
2248c2ecf20Sopenharmony_ci	 * Assume ISCSI_TCP by default.  Other network portals for other
2258c2ecf20Sopenharmony_ci	 * iSCSI fabrics:
2268c2ecf20Sopenharmony_ci	 *
2278c2ecf20Sopenharmony_ci	 * Traditional iSCSI over SCTP (initial support)
2288c2ecf20Sopenharmony_ci	 * iSER/TCP (TODO, hardware available)
2298c2ecf20Sopenharmony_ci	 * iSER/SCTP (TODO, software emulation with osc-iwarp)
2308c2ecf20Sopenharmony_ci	 * iSER/IB (TODO, hardware available)
2318c2ecf20Sopenharmony_ci	 *
2328c2ecf20Sopenharmony_ci	 * can be enabled with attributes under
2338c2ecf20Sopenharmony_ci	 * sys/kernel/config/iscsi/$IQN/$TPG/np/$IP:$PORT/
2348c2ecf20Sopenharmony_ci	 *
2358c2ecf20Sopenharmony_ci	 */
2368c2ecf20Sopenharmony_ci	tpg_np = iscsit_tpg_add_network_portal(tpg, &sockaddr, NULL,
2378c2ecf20Sopenharmony_ci				ISCSI_TCP);
2388c2ecf20Sopenharmony_ci	if (IS_ERR(tpg_np)) {
2398c2ecf20Sopenharmony_ci		iscsit_put_tpg(tpg);
2408c2ecf20Sopenharmony_ci		return ERR_CAST(tpg_np);
2418c2ecf20Sopenharmony_ci	}
2428c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: addnptotpg done!\n");
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
2458c2ecf20Sopenharmony_ci	return &tpg_np->se_tpg_np;
2468c2ecf20Sopenharmony_ci}
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_cistatic void lio_target_call_delnpfromtpg(
2498c2ecf20Sopenharmony_ci	struct se_tpg_np *se_tpg_np)
2508c2ecf20Sopenharmony_ci{
2518c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg;
2528c2ecf20Sopenharmony_ci	struct iscsi_tpg_np *tpg_np;
2538c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg;
2548c2ecf20Sopenharmony_ci	int ret;
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	tpg_np = container_of(se_tpg_np, struct iscsi_tpg_np, se_tpg_np);
2578c2ecf20Sopenharmony_ci	tpg = tpg_np->tpg;
2588c2ecf20Sopenharmony_ci	ret = iscsit_get_tpg(tpg);
2598c2ecf20Sopenharmony_ci	if (ret < 0)
2608c2ecf20Sopenharmony_ci		return;
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	se_tpg = &tpg->tpg_se_tpg;
2638c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu"
2648c2ecf20Sopenharmony_ci		" PORTAL: %pISpc\n", config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
2658c2ecf20Sopenharmony_ci		tpg->tpgt, &tpg_np->tpg_np->np_sockaddr);
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	ret = iscsit_tpg_del_network_portal(tpg, tpg_np);
2688c2ecf20Sopenharmony_ci	if (ret < 0)
2698c2ecf20Sopenharmony_ci		goto out;
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: delnpfromtpg done!\n");
2728c2ecf20Sopenharmony_ciout:
2738c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
2748c2ecf20Sopenharmony_ci}
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci/* End items for lio_target_np_cit */
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci/* Start items for lio_target_nacl_attrib_cit */
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci#define ISCSI_NACL_ATTR(name)						\
2818c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_attrib_##name##_show(struct config_item *item,\
2828c2ecf20Sopenharmony_ci		char *page)						\
2838c2ecf20Sopenharmony_ci{									\
2848c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl = attrib_to_nacl(item);		\
2858c2ecf20Sopenharmony_ci	struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \
2868c2ecf20Sopenharmony_ci					se_node_acl);			\
2878c2ecf20Sopenharmony_ci									\
2888c2ecf20Sopenharmony_ci	return sprintf(page, "%u\n", nacl->node_attrib.name);		\
2898c2ecf20Sopenharmony_ci}									\
2908c2ecf20Sopenharmony_ci									\
2918c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_attrib_##name##_store(struct config_item *item,\
2928c2ecf20Sopenharmony_ci		const char *page, size_t count)				\
2938c2ecf20Sopenharmony_ci{									\
2948c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl = attrib_to_nacl(item);		\
2958c2ecf20Sopenharmony_ci	struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \
2968c2ecf20Sopenharmony_ci					se_node_acl);			\
2978c2ecf20Sopenharmony_ci	u32 val;							\
2988c2ecf20Sopenharmony_ci	int ret;							\
2998c2ecf20Sopenharmony_ci									\
3008c2ecf20Sopenharmony_ci	ret = kstrtou32(page, 0, &val);					\
3018c2ecf20Sopenharmony_ci	if (ret)							\
3028c2ecf20Sopenharmony_ci		return ret;						\
3038c2ecf20Sopenharmony_ci	ret = iscsit_na_##name(nacl, val);				\
3048c2ecf20Sopenharmony_ci	if (ret < 0)							\
3058c2ecf20Sopenharmony_ci		return ret;						\
3068c2ecf20Sopenharmony_ci									\
3078c2ecf20Sopenharmony_ci	return count;							\
3088c2ecf20Sopenharmony_ci}									\
3098c2ecf20Sopenharmony_ci									\
3108c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_nacl_attrib_, name)
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(dataout_timeout);
3138c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(dataout_timeout_retries);
3148c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(default_erl);
3158c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(nopin_timeout);
3168c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(nopin_response_timeout);
3178c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(random_datain_pdu_offsets);
3188c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(random_datain_seq_offsets);
3198c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(random_r2t_offsets);
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_nacl_attrib_attrs[] = {
3228c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_dataout_timeout,
3238c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_dataout_timeout_retries,
3248c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_default_erl,
3258c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_nopin_timeout,
3268c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_nopin_response_timeout,
3278c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_random_datain_pdu_offsets,
3288c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_random_datain_seq_offsets,
3298c2ecf20Sopenharmony_ci	&iscsi_nacl_attrib_attr_random_r2t_offsets,
3308c2ecf20Sopenharmony_ci	NULL,
3318c2ecf20Sopenharmony_ci};
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci/* End items for lio_target_nacl_attrib_cit */
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_ci/* Start items for lio_target_nacl_auth_cit */
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci#define __DEF_NACL_AUTH_STR(prefix, name, flags)			\
3388c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show(			\
3398c2ecf20Sopenharmony_ci	struct iscsi_node_acl *nacl,					\
3408c2ecf20Sopenharmony_ci	char *page)							\
3418c2ecf20Sopenharmony_ci{									\
3428c2ecf20Sopenharmony_ci	struct iscsi_node_auth *auth = &nacl->node_auth;		\
3438c2ecf20Sopenharmony_ci									\
3448c2ecf20Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN))					\
3458c2ecf20Sopenharmony_ci		return -EPERM;						\
3468c2ecf20Sopenharmony_ci	return snprintf(page, PAGE_SIZE, "%s\n", auth->name);		\
3478c2ecf20Sopenharmony_ci}									\
3488c2ecf20Sopenharmony_ci									\
3498c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_store(			\
3508c2ecf20Sopenharmony_ci	struct iscsi_node_acl *nacl,					\
3518c2ecf20Sopenharmony_ci	const char *page,						\
3528c2ecf20Sopenharmony_ci	size_t count)							\
3538c2ecf20Sopenharmony_ci{									\
3548c2ecf20Sopenharmony_ci	struct iscsi_node_auth *auth = &nacl->node_auth;		\
3558c2ecf20Sopenharmony_ci									\
3568c2ecf20Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN))					\
3578c2ecf20Sopenharmony_ci		return -EPERM;						\
3588c2ecf20Sopenharmony_ci	if (count >= sizeof(auth->name))				\
3598c2ecf20Sopenharmony_ci		return -EINVAL;						\
3608c2ecf20Sopenharmony_ci	snprintf(auth->name, sizeof(auth->name), "%s", page);		\
3618c2ecf20Sopenharmony_ci	if (!strncmp("NULL", auth->name, 4))				\
3628c2ecf20Sopenharmony_ci		auth->naf_flags &= ~flags;				\
3638c2ecf20Sopenharmony_ci	else								\
3648c2ecf20Sopenharmony_ci		auth->naf_flags |= flags;				\
3658c2ecf20Sopenharmony_ci									\
3668c2ecf20Sopenharmony_ci	if ((auth->naf_flags & NAF_USERID_IN_SET) &&			\
3678c2ecf20Sopenharmony_ci	    (auth->naf_flags & NAF_PASSWORD_IN_SET))			\
3688c2ecf20Sopenharmony_ci		auth->authenticate_target = 1;				\
3698c2ecf20Sopenharmony_ci	else								\
3708c2ecf20Sopenharmony_ci		auth->authenticate_target = 0;				\
3718c2ecf20Sopenharmony_ci									\
3728c2ecf20Sopenharmony_ci	return count;							\
3738c2ecf20Sopenharmony_ci}
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci#define DEF_NACL_AUTH_STR(name, flags)					\
3768c2ecf20Sopenharmony_ci	__DEF_NACL_AUTH_STR(nacl_auth, name, flags)			\
3778c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item,	\
3788c2ecf20Sopenharmony_ci		char *page)						\
3798c2ecf20Sopenharmony_ci{									\
3808c2ecf20Sopenharmony_ci	struct se_node_acl *nacl = auth_to_nacl(item);			\
3818c2ecf20Sopenharmony_ci	return __iscsi_nacl_auth_##name##_show(container_of(nacl,	\
3828c2ecf20Sopenharmony_ci			struct iscsi_node_acl, se_node_acl), page);	\
3838c2ecf20Sopenharmony_ci}									\
3848c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_auth_##name##_store(struct config_item *item,	\
3858c2ecf20Sopenharmony_ci		const char *page, size_t count)				\
3868c2ecf20Sopenharmony_ci{									\
3878c2ecf20Sopenharmony_ci	struct se_node_acl *nacl = auth_to_nacl(item);			\
3888c2ecf20Sopenharmony_ci	return __iscsi_nacl_auth_##name##_store(container_of(nacl,	\
3898c2ecf20Sopenharmony_ci			struct iscsi_node_acl, se_node_acl), page, count); \
3908c2ecf20Sopenharmony_ci}									\
3918c2ecf20Sopenharmony_ci									\
3928c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_nacl_auth_, name)
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci/*
3958c2ecf20Sopenharmony_ci * One-way authentication userid
3968c2ecf20Sopenharmony_ci */
3978c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(userid, NAF_USERID_SET);
3988c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(password, NAF_PASSWORD_SET);
3998c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
4008c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ci#define __DEF_NACL_AUTH_INT(prefix, name)				\
4038c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show(				\
4048c2ecf20Sopenharmony_ci	struct iscsi_node_acl *nacl,					\
4058c2ecf20Sopenharmony_ci	char *page)							\
4068c2ecf20Sopenharmony_ci{									\
4078c2ecf20Sopenharmony_ci	struct iscsi_node_auth *auth = &nacl->node_auth;		\
4088c2ecf20Sopenharmony_ci									\
4098c2ecf20Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN))					\
4108c2ecf20Sopenharmony_ci		return -EPERM;						\
4118c2ecf20Sopenharmony_ci									\
4128c2ecf20Sopenharmony_ci	return snprintf(page, PAGE_SIZE, "%d\n", auth->name);		\
4138c2ecf20Sopenharmony_ci}
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_ci#define DEF_NACL_AUTH_INT(name)						\
4168c2ecf20Sopenharmony_ci	__DEF_NACL_AUTH_INT(nacl_auth, name)				\
4178c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item,	\
4188c2ecf20Sopenharmony_ci		char *page)						\
4198c2ecf20Sopenharmony_ci{									\
4208c2ecf20Sopenharmony_ci	struct se_node_acl *nacl = auth_to_nacl(item);			\
4218c2ecf20Sopenharmony_ci	return __iscsi_nacl_auth_##name##_show(container_of(nacl,	\
4228c2ecf20Sopenharmony_ci			struct iscsi_node_acl, se_node_acl), page);	\
4238c2ecf20Sopenharmony_ci}									\
4248c2ecf20Sopenharmony_ci									\
4258c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_nacl_auth_, name)
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_ciDEF_NACL_AUTH_INT(authenticate_target);
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_nacl_auth_attrs[] = {
4308c2ecf20Sopenharmony_ci	&iscsi_nacl_auth_attr_userid,
4318c2ecf20Sopenharmony_ci	&iscsi_nacl_auth_attr_password,
4328c2ecf20Sopenharmony_ci	&iscsi_nacl_auth_attr_authenticate_target,
4338c2ecf20Sopenharmony_ci	&iscsi_nacl_auth_attr_userid_mutual,
4348c2ecf20Sopenharmony_ci	&iscsi_nacl_auth_attr_password_mutual,
4358c2ecf20Sopenharmony_ci	NULL,
4368c2ecf20Sopenharmony_ci};
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci/* End items for lio_target_nacl_auth_cit */
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci/* Start items for lio_target_nacl_param_cit */
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci#define ISCSI_NACL_PARAM(name)						\
4438c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_param_##name##_show(struct config_item *item,	\
4448c2ecf20Sopenharmony_ci		char *page)						\
4458c2ecf20Sopenharmony_ci{									\
4468c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl = param_to_nacl(item);		\
4478c2ecf20Sopenharmony_ci	struct iscsi_session *sess;					\
4488c2ecf20Sopenharmony_ci	struct se_session *se_sess;					\
4498c2ecf20Sopenharmony_ci	ssize_t rb;							\
4508c2ecf20Sopenharmony_ci									\
4518c2ecf20Sopenharmony_ci	spin_lock_bh(&se_nacl->nacl_sess_lock);				\
4528c2ecf20Sopenharmony_ci	se_sess = se_nacl->nacl_sess;					\
4538c2ecf20Sopenharmony_ci	if (!se_sess) {							\
4548c2ecf20Sopenharmony_ci		rb = snprintf(page, PAGE_SIZE,				\
4558c2ecf20Sopenharmony_ci			"No Active iSCSI Session\n");			\
4568c2ecf20Sopenharmony_ci	} else {							\
4578c2ecf20Sopenharmony_ci		sess = se_sess->fabric_sess_ptr;			\
4588c2ecf20Sopenharmony_ci		rb = snprintf(page, PAGE_SIZE, "%u\n",			\
4598c2ecf20Sopenharmony_ci			(u32)sess->sess_ops->name);			\
4608c2ecf20Sopenharmony_ci	}								\
4618c2ecf20Sopenharmony_ci	spin_unlock_bh(&se_nacl->nacl_sess_lock);			\
4628c2ecf20Sopenharmony_ci									\
4638c2ecf20Sopenharmony_ci	return rb;							\
4648c2ecf20Sopenharmony_ci}									\
4658c2ecf20Sopenharmony_ci									\
4668c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_nacl_param_, name)
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(MaxConnections);
4698c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(InitialR2T);
4708c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(ImmediateData);
4718c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(MaxBurstLength);
4728c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(FirstBurstLength);
4738c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DefaultTime2Wait);
4748c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DefaultTime2Retain);
4758c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(MaxOutstandingR2T);
4768c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DataPDUInOrder);
4778c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DataSequenceInOrder);
4788c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(ErrorRecoveryLevel);
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_nacl_param_attrs[] = {
4818c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_MaxConnections,
4828c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_InitialR2T,
4838c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_ImmediateData,
4848c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_MaxBurstLength,
4858c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_FirstBurstLength,
4868c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_DefaultTime2Wait,
4878c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_DefaultTime2Retain,
4888c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_MaxOutstandingR2T,
4898c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_DataPDUInOrder,
4908c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_DataSequenceInOrder,
4918c2ecf20Sopenharmony_ci	&iscsi_nacl_param_attr_ErrorRecoveryLevel,
4928c2ecf20Sopenharmony_ci	NULL,
4938c2ecf20Sopenharmony_ci};
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci/* End items for lio_target_nacl_param_cit */
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci/* Start items for lio_target_acl_cit */
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_info_show(struct config_item *item, char *page)
5008c2ecf20Sopenharmony_ci{
5018c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl = acl_to_nacl(item);
5028c2ecf20Sopenharmony_ci	struct iscsi_session *sess;
5038c2ecf20Sopenharmony_ci	struct iscsi_conn *conn;
5048c2ecf20Sopenharmony_ci	struct se_session *se_sess;
5058c2ecf20Sopenharmony_ci	ssize_t rb = 0;
5068c2ecf20Sopenharmony_ci	u32 max_cmd_sn;
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	spin_lock_bh(&se_nacl->nacl_sess_lock);
5098c2ecf20Sopenharmony_ci	se_sess = se_nacl->nacl_sess;
5108c2ecf20Sopenharmony_ci	if (!se_sess) {
5118c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "No active iSCSI Session for Initiator"
5128c2ecf20Sopenharmony_ci			" Endpoint: %s\n", se_nacl->initiatorname);
5138c2ecf20Sopenharmony_ci	} else {
5148c2ecf20Sopenharmony_ci		sess = se_sess->fabric_sess_ptr;
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "InitiatorName: %s\n",
5178c2ecf20Sopenharmony_ci			sess->sess_ops->InitiatorName);
5188c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "InitiatorAlias: %s\n",
5198c2ecf20Sopenharmony_ci			sess->sess_ops->InitiatorAlias);
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb,
5228c2ecf20Sopenharmony_ci			      "LIO Session ID: %u   ISID: 0x%6ph  TSIH: %hu  ",
5238c2ecf20Sopenharmony_ci			      sess->sid, sess->isid, sess->tsih);
5248c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "SessionType: %s\n",
5258c2ecf20Sopenharmony_ci				(sess->sess_ops->SessionType) ?
5268c2ecf20Sopenharmony_ci				"Discovery" : "Normal");
5278c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "Session State: ");
5288c2ecf20Sopenharmony_ci		switch (sess->session_state) {
5298c2ecf20Sopenharmony_ci		case TARG_SESS_STATE_FREE:
5308c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "TARG_SESS_FREE\n");
5318c2ecf20Sopenharmony_ci			break;
5328c2ecf20Sopenharmony_ci		case TARG_SESS_STATE_ACTIVE:
5338c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_ACTIVE\n");
5348c2ecf20Sopenharmony_ci			break;
5358c2ecf20Sopenharmony_ci		case TARG_SESS_STATE_LOGGED_IN:
5368c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_LOGGED_IN\n");
5378c2ecf20Sopenharmony_ci			break;
5388c2ecf20Sopenharmony_ci		case TARG_SESS_STATE_FAILED:
5398c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_FAILED\n");
5408c2ecf20Sopenharmony_ci			break;
5418c2ecf20Sopenharmony_ci		case TARG_SESS_STATE_IN_CONTINUE:
5428c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_IN_CONTINUE\n");
5438c2ecf20Sopenharmony_ci			break;
5448c2ecf20Sopenharmony_ci		default:
5458c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "ERROR: Unknown Session"
5468c2ecf20Sopenharmony_ci					" State!\n");
5478c2ecf20Sopenharmony_ci			break;
5488c2ecf20Sopenharmony_ci		}
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "---------------------[iSCSI Session"
5518c2ecf20Sopenharmony_ci				" Values]-----------------------\n");
5528c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "  CmdSN/WR  :  CmdSN/WC  :  ExpCmdSN"
5538c2ecf20Sopenharmony_ci				"  :  MaxCmdSN  :     ITT    :     TTT\n");
5548c2ecf20Sopenharmony_ci		max_cmd_sn = (u32) atomic_read(&sess->max_cmd_sn);
5558c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, " 0x%08x   0x%08x   0x%08x   0x%08x"
5568c2ecf20Sopenharmony_ci				"   0x%08x   0x%08x\n",
5578c2ecf20Sopenharmony_ci			sess->cmdsn_window,
5588c2ecf20Sopenharmony_ci			(max_cmd_sn - sess->exp_cmd_sn) + 1,
5598c2ecf20Sopenharmony_ci			sess->exp_cmd_sn, max_cmd_sn,
5608c2ecf20Sopenharmony_ci			sess->init_task_tag, sess->targ_xfer_tag);
5618c2ecf20Sopenharmony_ci		rb += sysfs_emit_at(page, rb, "----------------------[iSCSI"
5628c2ecf20Sopenharmony_ci				" Connections]-------------------------\n");
5638c2ecf20Sopenharmony_ci
5648c2ecf20Sopenharmony_ci		spin_lock(&sess->conn_lock);
5658c2ecf20Sopenharmony_ci		list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
5668c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "CID: %hu  Connection"
5678c2ecf20Sopenharmony_ci					" State: ", conn->cid);
5688c2ecf20Sopenharmony_ci			switch (conn->conn_state) {
5698c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_FREE:
5708c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5718c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_FREE\n");
5728c2ecf20Sopenharmony_ci				break;
5738c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_XPT_UP:
5748c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5758c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_XPT_UP\n");
5768c2ecf20Sopenharmony_ci				break;
5778c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_IN_LOGIN:
5788c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5798c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_IN_LOGIN\n");
5808c2ecf20Sopenharmony_ci				break;
5818c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_LOGGED_IN:
5828c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5838c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_LOGGED_IN\n");
5848c2ecf20Sopenharmony_ci				break;
5858c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_IN_LOGOUT:
5868c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5878c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_IN_LOGOUT\n");
5888c2ecf20Sopenharmony_ci				break;
5898c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_LOGOUT_REQUESTED:
5908c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5918c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_LOGOUT_REQUESTED\n");
5928c2ecf20Sopenharmony_ci				break;
5938c2ecf20Sopenharmony_ci			case TARG_CONN_STATE_CLEANUP_WAIT:
5948c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5958c2ecf20Sopenharmony_ci					"TARG_CONN_STATE_CLEANUP_WAIT\n");
5968c2ecf20Sopenharmony_ci				break;
5978c2ecf20Sopenharmony_ci			default:
5988c2ecf20Sopenharmony_ci				rb += sysfs_emit_at(page, rb,
5998c2ecf20Sopenharmony_ci					"ERROR: Unknown Connection State!\n");
6008c2ecf20Sopenharmony_ci				break;
6018c2ecf20Sopenharmony_ci			}
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "   Address %pISc %s", &conn->login_sockaddr,
6048c2ecf20Sopenharmony_ci				(conn->network_transport == ISCSI_TCP) ?
6058c2ecf20Sopenharmony_ci				"TCP" : "SCTP");
6068c2ecf20Sopenharmony_ci			rb += sysfs_emit_at(page, rb, "  StatSN: 0x%08x\n",
6078c2ecf20Sopenharmony_ci				conn->stat_sn);
6088c2ecf20Sopenharmony_ci		}
6098c2ecf20Sopenharmony_ci		spin_unlock(&sess->conn_lock);
6108c2ecf20Sopenharmony_ci	}
6118c2ecf20Sopenharmony_ci	spin_unlock_bh(&se_nacl->nacl_sess_lock);
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci	return rb;
6148c2ecf20Sopenharmony_ci}
6158c2ecf20Sopenharmony_ci
6168c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_cmdsn_depth_show(struct config_item *item,
6178c2ecf20Sopenharmony_ci		char *page)
6188c2ecf20Sopenharmony_ci{
6198c2ecf20Sopenharmony_ci	return sprintf(page, "%u\n", acl_to_nacl(item)->queue_depth);
6208c2ecf20Sopenharmony_ci}
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_cmdsn_depth_store(struct config_item *item,
6238c2ecf20Sopenharmony_ci		const char *page, size_t count)
6248c2ecf20Sopenharmony_ci{
6258c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl = acl_to_nacl(item);
6268c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = se_nacl->se_tpg;
6278c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,
6288c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);
6298c2ecf20Sopenharmony_ci	struct config_item *acl_ci, *tpg_ci, *wwn_ci;
6308c2ecf20Sopenharmony_ci	u32 cmdsn_depth = 0;
6318c2ecf20Sopenharmony_ci	int ret;
6328c2ecf20Sopenharmony_ci
6338c2ecf20Sopenharmony_ci	ret = kstrtou32(page, 0, &cmdsn_depth);
6348c2ecf20Sopenharmony_ci	if (ret)
6358c2ecf20Sopenharmony_ci		return ret;
6368c2ecf20Sopenharmony_ci	if (cmdsn_depth > TA_DEFAULT_CMDSN_DEPTH_MAX) {
6378c2ecf20Sopenharmony_ci		pr_err("Passed cmdsn_depth: %u exceeds"
6388c2ecf20Sopenharmony_ci			" TA_DEFAULT_CMDSN_DEPTH_MAX: %u\n", cmdsn_depth,
6398c2ecf20Sopenharmony_ci			TA_DEFAULT_CMDSN_DEPTH_MAX);
6408c2ecf20Sopenharmony_ci		return -EINVAL;
6418c2ecf20Sopenharmony_ci	}
6428c2ecf20Sopenharmony_ci	acl_ci = &se_nacl->acl_group.cg_item;
6438c2ecf20Sopenharmony_ci	if (!acl_ci) {
6448c2ecf20Sopenharmony_ci		pr_err("Unable to locatel acl_ci\n");
6458c2ecf20Sopenharmony_ci		return -EINVAL;
6468c2ecf20Sopenharmony_ci	}
6478c2ecf20Sopenharmony_ci	tpg_ci = &acl_ci->ci_parent->ci_group->cg_item;
6488c2ecf20Sopenharmony_ci	if (!tpg_ci) {
6498c2ecf20Sopenharmony_ci		pr_err("Unable to locate tpg_ci\n");
6508c2ecf20Sopenharmony_ci		return -EINVAL;
6518c2ecf20Sopenharmony_ci	}
6528c2ecf20Sopenharmony_ci	wwn_ci = &tpg_ci->ci_group->cg_item;
6538c2ecf20Sopenharmony_ci	if (!wwn_ci) {
6548c2ecf20Sopenharmony_ci		pr_err("Unable to locate config_item wwn_ci\n");
6558c2ecf20Sopenharmony_ci		return -EINVAL;
6568c2ecf20Sopenharmony_ci	}
6578c2ecf20Sopenharmony_ci
6588c2ecf20Sopenharmony_ci	if (iscsit_get_tpg(tpg) < 0)
6598c2ecf20Sopenharmony_ci		return -EINVAL;
6608c2ecf20Sopenharmony_ci
6618c2ecf20Sopenharmony_ci	ret = core_tpg_set_initiator_node_queue_depth(se_nacl, cmdsn_depth);
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: %s/%s Set CmdSN Window: %u for"
6648c2ecf20Sopenharmony_ci		"InitiatorName: %s\n", config_item_name(wwn_ci),
6658c2ecf20Sopenharmony_ci		config_item_name(tpg_ci), cmdsn_depth,
6668c2ecf20Sopenharmony_ci		config_item_name(acl_ci));
6678c2ecf20Sopenharmony_ci
6688c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
6698c2ecf20Sopenharmony_ci	return (!ret) ? count : (ssize_t)ret;
6708c2ecf20Sopenharmony_ci}
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_tag_show(struct config_item *item, char *page)
6738c2ecf20Sopenharmony_ci{
6748c2ecf20Sopenharmony_ci	return snprintf(page, PAGE_SIZE, "%s", acl_to_nacl(item)->acl_tag);
6758c2ecf20Sopenharmony_ci}
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_tag_store(struct config_item *item,
6788c2ecf20Sopenharmony_ci		const char *page, size_t count)
6798c2ecf20Sopenharmony_ci{
6808c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl = acl_to_nacl(item);
6818c2ecf20Sopenharmony_ci	int ret;
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_ci	ret = core_tpg_set_initiator_node_tag(se_nacl->se_tpg, se_nacl, page);
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci	if (ret < 0)
6868c2ecf20Sopenharmony_ci		return ret;
6878c2ecf20Sopenharmony_ci	return count;
6888c2ecf20Sopenharmony_ci}
6898c2ecf20Sopenharmony_ci
6908c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(lio_target_nacl_, info);
6918c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_nacl_, cmdsn_depth);
6928c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_nacl_, tag);
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_initiator_attrs[] = {
6958c2ecf20Sopenharmony_ci	&lio_target_nacl_attr_info,
6968c2ecf20Sopenharmony_ci	&lio_target_nacl_attr_cmdsn_depth,
6978c2ecf20Sopenharmony_ci	&lio_target_nacl_attr_tag,
6988c2ecf20Sopenharmony_ci	NULL,
6998c2ecf20Sopenharmony_ci};
7008c2ecf20Sopenharmony_ci
7018c2ecf20Sopenharmony_cistatic int lio_target_init_nodeacl(struct se_node_acl *se_nacl,
7028c2ecf20Sopenharmony_ci		const char *name)
7038c2ecf20Sopenharmony_ci{
7048c2ecf20Sopenharmony_ci	struct iscsi_node_acl *acl =
7058c2ecf20Sopenharmony_ci		container_of(se_nacl, struct iscsi_node_acl, se_node_acl);
7068c2ecf20Sopenharmony_ci
7078c2ecf20Sopenharmony_ci	config_group_init_type_name(&acl->node_stat_grps.iscsi_sess_stats_group,
7088c2ecf20Sopenharmony_ci			"iscsi_sess_stats", &iscsi_stat_sess_cit);
7098c2ecf20Sopenharmony_ci	configfs_add_default_group(&acl->node_stat_grps.iscsi_sess_stats_group,
7108c2ecf20Sopenharmony_ci			&se_nacl->acl_fabric_stat_group);
7118c2ecf20Sopenharmony_ci	return 0;
7128c2ecf20Sopenharmony_ci}
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci/* End items for lio_target_acl_cit */
7158c2ecf20Sopenharmony_ci
7168c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_attrib_cit */
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_ci#define DEF_TPG_ATTRIB(name)						\
7198c2ecf20Sopenharmony_ci									\
7208c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_attrib_##name##_show(struct config_item *item,	\
7218c2ecf20Sopenharmony_ci		char *page)						\
7228c2ecf20Sopenharmony_ci{									\
7238c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = attrib_to_tpg(item);		\
7248c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
7258c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);	\
7268c2ecf20Sopenharmony_ci	ssize_t rb;							\
7278c2ecf20Sopenharmony_ci									\
7288c2ecf20Sopenharmony_ci	if (iscsit_get_tpg(tpg) < 0)					\
7298c2ecf20Sopenharmony_ci		return -EINVAL;						\
7308c2ecf20Sopenharmony_ci									\
7318c2ecf20Sopenharmony_ci	rb = sprintf(page, "%u\n", tpg->tpg_attrib.name);		\
7328c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);						\
7338c2ecf20Sopenharmony_ci	return rb;							\
7348c2ecf20Sopenharmony_ci}									\
7358c2ecf20Sopenharmony_ci									\
7368c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_attrib_##name##_store(struct config_item *item,\
7378c2ecf20Sopenharmony_ci		const char *page, size_t count)				\
7388c2ecf20Sopenharmony_ci{									\
7398c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = attrib_to_tpg(item);		\
7408c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
7418c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);	\
7428c2ecf20Sopenharmony_ci	u32 val;							\
7438c2ecf20Sopenharmony_ci	int ret;							\
7448c2ecf20Sopenharmony_ci									\
7458c2ecf20Sopenharmony_ci	if (iscsit_get_tpg(tpg) < 0)					\
7468c2ecf20Sopenharmony_ci		return -EINVAL;						\
7478c2ecf20Sopenharmony_ci									\
7488c2ecf20Sopenharmony_ci	ret = kstrtou32(page, 0, &val);					\
7498c2ecf20Sopenharmony_ci	if (ret)							\
7508c2ecf20Sopenharmony_ci		goto out;						\
7518c2ecf20Sopenharmony_ci	ret = iscsit_ta_##name(tpg, val);				\
7528c2ecf20Sopenharmony_ci	if (ret < 0)							\
7538c2ecf20Sopenharmony_ci		goto out;						\
7548c2ecf20Sopenharmony_ci									\
7558c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);						\
7568c2ecf20Sopenharmony_ci	return count;							\
7578c2ecf20Sopenharmony_ciout:									\
7588c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);						\
7598c2ecf20Sopenharmony_ci	return ret;							\
7608c2ecf20Sopenharmony_ci}									\
7618c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_tpg_attrib_, name)
7628c2ecf20Sopenharmony_ci
7638c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(authentication);
7648c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(login_timeout);
7658c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(netif_timeout);
7668c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(generate_node_acls);
7678c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(default_cmdsn_depth);
7688c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(cache_dynamic_acls);
7698c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(demo_mode_write_protect);
7708c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(prod_mode_write_protect);
7718c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(demo_mode_discovery);
7728c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(default_erl);
7738c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(t10_pi);
7748c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(fabric_prot_type);
7758c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(tpg_enabled_sendtargets);
7768c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(login_keys_workaround);
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
7798c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_authentication,
7808c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_login_timeout,
7818c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_netif_timeout,
7828c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_generate_node_acls,
7838c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_default_cmdsn_depth,
7848c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_cache_dynamic_acls,
7858c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_demo_mode_write_protect,
7868c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_prod_mode_write_protect,
7878c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_demo_mode_discovery,
7888c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_default_erl,
7898c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_t10_pi,
7908c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_fabric_prot_type,
7918c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_tpg_enabled_sendtargets,
7928c2ecf20Sopenharmony_ci	&iscsi_tpg_attrib_attr_login_keys_workaround,
7938c2ecf20Sopenharmony_ci	NULL,
7948c2ecf20Sopenharmony_ci};
7958c2ecf20Sopenharmony_ci
7968c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_attrib_cit */
7978c2ecf20Sopenharmony_ci
7988c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_auth_cit */
7998c2ecf20Sopenharmony_ci
8008c2ecf20Sopenharmony_ci#define __DEF_TPG_AUTH_STR(prefix, name, flags)					\
8018c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg,	\
8028c2ecf20Sopenharmony_ci		char *page)							\
8038c2ecf20Sopenharmony_ci{										\
8048c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,			\
8058c2ecf20Sopenharmony_ci				struct iscsi_portal_group, tpg_se_tpg);		\
8068c2ecf20Sopenharmony_ci	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
8078c2ecf20Sopenharmony_ci										\
8088c2ecf20Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN))						\
8098c2ecf20Sopenharmony_ci		return -EPERM;							\
8108c2ecf20Sopenharmony_ci										\
8118c2ecf20Sopenharmony_ci	return snprintf(page, PAGE_SIZE, "%s\n", auth->name);			\
8128c2ecf20Sopenharmony_ci}										\
8138c2ecf20Sopenharmony_ci										\
8148c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_store(struct se_portal_group *se_tpg,\
8158c2ecf20Sopenharmony_ci		const char *page, size_t count)					\
8168c2ecf20Sopenharmony_ci{										\
8178c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,			\
8188c2ecf20Sopenharmony_ci				struct iscsi_portal_group, tpg_se_tpg);		\
8198c2ecf20Sopenharmony_ci	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
8208c2ecf20Sopenharmony_ci										\
8218c2ecf20Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN))						\
8228c2ecf20Sopenharmony_ci		return -EPERM;							\
8238c2ecf20Sopenharmony_ci										\
8248c2ecf20Sopenharmony_ci	snprintf(auth->name, sizeof(auth->name), "%s", page);			\
8258c2ecf20Sopenharmony_ci	if (!(strncmp("NULL", auth->name, 4)))					\
8268c2ecf20Sopenharmony_ci		auth->naf_flags &= ~flags;					\
8278c2ecf20Sopenharmony_ci	else									\
8288c2ecf20Sopenharmony_ci		auth->naf_flags |= flags;					\
8298c2ecf20Sopenharmony_ci										\
8308c2ecf20Sopenharmony_ci	if ((auth->naf_flags & NAF_USERID_IN_SET) &&				\
8318c2ecf20Sopenharmony_ci	    (auth->naf_flags & NAF_PASSWORD_IN_SET))				\
8328c2ecf20Sopenharmony_ci		auth->authenticate_target = 1;					\
8338c2ecf20Sopenharmony_ci	else									\
8348c2ecf20Sopenharmony_ci		auth->authenticate_target = 0;					\
8358c2ecf20Sopenharmony_ci										\
8368c2ecf20Sopenharmony_ci	return count;								\
8378c2ecf20Sopenharmony_ci}
8388c2ecf20Sopenharmony_ci
8398c2ecf20Sopenharmony_ci#define DEF_TPG_AUTH_STR(name, flags)						\
8408c2ecf20Sopenharmony_ci	__DEF_TPG_AUTH_STR(tpg_auth, name, flags)				\
8418c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item,		\
8428c2ecf20Sopenharmony_ci		char *page)							\
8438c2ecf20Sopenharmony_ci{										\
8448c2ecf20Sopenharmony_ci	return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page);		\
8458c2ecf20Sopenharmony_ci}										\
8468c2ecf20Sopenharmony_ci										\
8478c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_auth_##name##_store(struct config_item *item,		\
8488c2ecf20Sopenharmony_ci		const char *page, size_t count)					\
8498c2ecf20Sopenharmony_ci{										\
8508c2ecf20Sopenharmony_ci	return __iscsi_tpg_auth_##name##_store(auth_to_tpg(item), page, count);	\
8518c2ecf20Sopenharmony_ci}										\
8528c2ecf20Sopenharmony_ci										\
8538c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_tpg_auth_, name);
8548c2ecf20Sopenharmony_ci
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(userid, NAF_USERID_SET);
8578c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(password, NAF_PASSWORD_SET);
8588c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
8598c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
8608c2ecf20Sopenharmony_ci
8618c2ecf20Sopenharmony_ci#define __DEF_TPG_AUTH_INT(prefix, name)					\
8628c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg,	\
8638c2ecf20Sopenharmony_ci		char *page)								\
8648c2ecf20Sopenharmony_ci{										\
8658c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,			\
8668c2ecf20Sopenharmony_ci				struct iscsi_portal_group, tpg_se_tpg);		\
8678c2ecf20Sopenharmony_ci	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
8688c2ecf20Sopenharmony_ci										\
8698c2ecf20Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN))						\
8708c2ecf20Sopenharmony_ci		return -EPERM;							\
8718c2ecf20Sopenharmony_ci										\
8728c2ecf20Sopenharmony_ci	return snprintf(page, PAGE_SIZE, "%d\n", auth->name);			\
8738c2ecf20Sopenharmony_ci}
8748c2ecf20Sopenharmony_ci
8758c2ecf20Sopenharmony_ci#define DEF_TPG_AUTH_INT(name)							\
8768c2ecf20Sopenharmony_ci	__DEF_TPG_AUTH_INT(tpg_auth, name)					\
8778c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item,		\
8788c2ecf20Sopenharmony_ci		char *page) \
8798c2ecf20Sopenharmony_ci{										\
8808c2ecf20Sopenharmony_ci	return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page);		\
8818c2ecf20Sopenharmony_ci}										\
8828c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_tpg_auth_, name);
8838c2ecf20Sopenharmony_ci
8848c2ecf20Sopenharmony_ciDEF_TPG_AUTH_INT(authenticate_target);
8858c2ecf20Sopenharmony_ci
8868c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_auth_attrs[] = {
8878c2ecf20Sopenharmony_ci	&iscsi_tpg_auth_attr_userid,
8888c2ecf20Sopenharmony_ci	&iscsi_tpg_auth_attr_password,
8898c2ecf20Sopenharmony_ci	&iscsi_tpg_auth_attr_authenticate_target,
8908c2ecf20Sopenharmony_ci	&iscsi_tpg_auth_attr_userid_mutual,
8918c2ecf20Sopenharmony_ci	&iscsi_tpg_auth_attr_password_mutual,
8928c2ecf20Sopenharmony_ci	NULL,
8938c2ecf20Sopenharmony_ci};
8948c2ecf20Sopenharmony_ci
8958c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_auth_cit */
8968c2ecf20Sopenharmony_ci
8978c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_param_cit */
8988c2ecf20Sopenharmony_ci
8998c2ecf20Sopenharmony_ci#define DEF_TPG_PARAM(name)						\
9008c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_param_##name##_show(struct config_item *item,	\
9018c2ecf20Sopenharmony_ci		char *page)						\
9028c2ecf20Sopenharmony_ci{									\
9038c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = param_to_tpg(item);		\
9048c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
9058c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);		\
9068c2ecf20Sopenharmony_ci	struct iscsi_param *param;					\
9078c2ecf20Sopenharmony_ci	ssize_t rb;							\
9088c2ecf20Sopenharmony_ci									\
9098c2ecf20Sopenharmony_ci	if (iscsit_get_tpg(tpg) < 0)					\
9108c2ecf20Sopenharmony_ci		return -EINVAL;						\
9118c2ecf20Sopenharmony_ci									\
9128c2ecf20Sopenharmony_ci	param = iscsi_find_param_from_key(__stringify(name),		\
9138c2ecf20Sopenharmony_ci				tpg->param_list);			\
9148c2ecf20Sopenharmony_ci	if (!param) {							\
9158c2ecf20Sopenharmony_ci		iscsit_put_tpg(tpg);					\
9168c2ecf20Sopenharmony_ci		return -EINVAL;						\
9178c2ecf20Sopenharmony_ci	}								\
9188c2ecf20Sopenharmony_ci	rb = snprintf(page, PAGE_SIZE, "%s\n", param->value);		\
9198c2ecf20Sopenharmony_ci									\
9208c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);						\
9218c2ecf20Sopenharmony_ci	return rb;							\
9228c2ecf20Sopenharmony_ci}									\
9238c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_param_##name##_store(struct config_item *item, \
9248c2ecf20Sopenharmony_ci		const char *page, size_t count)				\
9258c2ecf20Sopenharmony_ci{									\
9268c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = param_to_tpg(item);		\
9278c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
9288c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);		\
9298c2ecf20Sopenharmony_ci	char *buf;							\
9308c2ecf20Sopenharmony_ci	int ret, len;							\
9318c2ecf20Sopenharmony_ci									\
9328c2ecf20Sopenharmony_ci	buf = kzalloc(PAGE_SIZE, GFP_KERNEL);				\
9338c2ecf20Sopenharmony_ci	if (!buf)							\
9348c2ecf20Sopenharmony_ci		return -ENOMEM;						\
9358c2ecf20Sopenharmony_ci	len = snprintf(buf, PAGE_SIZE, "%s=%s", __stringify(name), page);	\
9368c2ecf20Sopenharmony_ci	if (isspace(buf[len-1]))					\
9378c2ecf20Sopenharmony_ci		buf[len-1] = '\0'; /* Kill newline */			\
9388c2ecf20Sopenharmony_ci									\
9398c2ecf20Sopenharmony_ci	if (iscsit_get_tpg(tpg) < 0) {					\
9408c2ecf20Sopenharmony_ci		kfree(buf);						\
9418c2ecf20Sopenharmony_ci		return -EINVAL;						\
9428c2ecf20Sopenharmony_ci	}								\
9438c2ecf20Sopenharmony_ci									\
9448c2ecf20Sopenharmony_ci	ret = iscsi_change_param_value(buf, tpg->param_list, 1);	\
9458c2ecf20Sopenharmony_ci	if (ret < 0)							\
9468c2ecf20Sopenharmony_ci		goto out;						\
9478c2ecf20Sopenharmony_ci									\
9488c2ecf20Sopenharmony_ci	kfree(buf);							\
9498c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);						\
9508c2ecf20Sopenharmony_ci	return count;							\
9518c2ecf20Sopenharmony_ciout:									\
9528c2ecf20Sopenharmony_ci	kfree(buf);							\
9538c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);						\
9548c2ecf20Sopenharmony_ci	return -EINVAL;							\
9558c2ecf20Sopenharmony_ci}									\
9568c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_tpg_param_, name)
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ciDEF_TPG_PARAM(AuthMethod);
9598c2ecf20Sopenharmony_ciDEF_TPG_PARAM(HeaderDigest);
9608c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DataDigest);
9618c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxConnections);
9628c2ecf20Sopenharmony_ciDEF_TPG_PARAM(TargetAlias);
9638c2ecf20Sopenharmony_ciDEF_TPG_PARAM(InitialR2T);
9648c2ecf20Sopenharmony_ciDEF_TPG_PARAM(ImmediateData);
9658c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxRecvDataSegmentLength);
9668c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxXmitDataSegmentLength);
9678c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxBurstLength);
9688c2ecf20Sopenharmony_ciDEF_TPG_PARAM(FirstBurstLength);
9698c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DefaultTime2Wait);
9708c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DefaultTime2Retain);
9718c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxOutstandingR2T);
9728c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DataPDUInOrder);
9738c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DataSequenceInOrder);
9748c2ecf20Sopenharmony_ciDEF_TPG_PARAM(ErrorRecoveryLevel);
9758c2ecf20Sopenharmony_ciDEF_TPG_PARAM(IFMarker);
9768c2ecf20Sopenharmony_ciDEF_TPG_PARAM(OFMarker);
9778c2ecf20Sopenharmony_ciDEF_TPG_PARAM(IFMarkInt);
9788c2ecf20Sopenharmony_ciDEF_TPG_PARAM(OFMarkInt);
9798c2ecf20Sopenharmony_ci
9808c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_param_attrs[] = {
9818c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_AuthMethod,
9828c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_HeaderDigest,
9838c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_DataDigest,
9848c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_MaxConnections,
9858c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_TargetAlias,
9868c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_InitialR2T,
9878c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_ImmediateData,
9888c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_MaxRecvDataSegmentLength,
9898c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_MaxXmitDataSegmentLength,
9908c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_MaxBurstLength,
9918c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_FirstBurstLength,
9928c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_DefaultTime2Wait,
9938c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_DefaultTime2Retain,
9948c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_MaxOutstandingR2T,
9958c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_DataPDUInOrder,
9968c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_DataSequenceInOrder,
9978c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_ErrorRecoveryLevel,
9988c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_IFMarker,
9998c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_OFMarker,
10008c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_IFMarkInt,
10018c2ecf20Sopenharmony_ci	&iscsi_tpg_param_attr_OFMarkInt,
10028c2ecf20Sopenharmony_ci	NULL,
10038c2ecf20Sopenharmony_ci};
10048c2ecf20Sopenharmony_ci
10058c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_param_cit */
10068c2ecf20Sopenharmony_ci
10078c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_cit */
10088c2ecf20Sopenharmony_ci
10098c2ecf20Sopenharmony_cistatic ssize_t lio_target_tpg_enable_show(struct config_item *item, char *page)
10108c2ecf20Sopenharmony_ci{
10118c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = to_tpg(item);
10128c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,
10138c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);
10148c2ecf20Sopenharmony_ci	ssize_t len;
10158c2ecf20Sopenharmony_ci
10168c2ecf20Sopenharmony_ci	spin_lock(&tpg->tpg_state_lock);
10178c2ecf20Sopenharmony_ci	len = sprintf(page, "%d\n",
10188c2ecf20Sopenharmony_ci			(tpg->tpg_state == TPG_STATE_ACTIVE) ? 1 : 0);
10198c2ecf20Sopenharmony_ci	spin_unlock(&tpg->tpg_state_lock);
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	return len;
10228c2ecf20Sopenharmony_ci}
10238c2ecf20Sopenharmony_ci
10248c2ecf20Sopenharmony_cistatic ssize_t lio_target_tpg_enable_store(struct config_item *item,
10258c2ecf20Sopenharmony_ci		const char *page, size_t count)
10268c2ecf20Sopenharmony_ci{
10278c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = to_tpg(item);
10288c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,
10298c2ecf20Sopenharmony_ci			struct iscsi_portal_group, tpg_se_tpg);
10308c2ecf20Sopenharmony_ci	u32 op;
10318c2ecf20Sopenharmony_ci	int ret;
10328c2ecf20Sopenharmony_ci
10338c2ecf20Sopenharmony_ci	ret = kstrtou32(page, 0, &op);
10348c2ecf20Sopenharmony_ci	if (ret)
10358c2ecf20Sopenharmony_ci		return ret;
10368c2ecf20Sopenharmony_ci	if ((op != 1) && (op != 0)) {
10378c2ecf20Sopenharmony_ci		pr_err("Illegal value for tpg_enable: %u\n", op);
10388c2ecf20Sopenharmony_ci		return -EINVAL;
10398c2ecf20Sopenharmony_ci	}
10408c2ecf20Sopenharmony_ci
10418c2ecf20Sopenharmony_ci	ret = iscsit_get_tpg(tpg);
10428c2ecf20Sopenharmony_ci	if (ret < 0)
10438c2ecf20Sopenharmony_ci		return -EINVAL;
10448c2ecf20Sopenharmony_ci
10458c2ecf20Sopenharmony_ci	if (op) {
10468c2ecf20Sopenharmony_ci		ret = iscsit_tpg_enable_portal_group(tpg);
10478c2ecf20Sopenharmony_ci		if (ret < 0)
10488c2ecf20Sopenharmony_ci			goto out;
10498c2ecf20Sopenharmony_ci	} else {
10508c2ecf20Sopenharmony_ci		/*
10518c2ecf20Sopenharmony_ci		 * iscsit_tpg_disable_portal_group() assumes force=1
10528c2ecf20Sopenharmony_ci		 */
10538c2ecf20Sopenharmony_ci		ret = iscsit_tpg_disable_portal_group(tpg, 1);
10548c2ecf20Sopenharmony_ci		if (ret < 0)
10558c2ecf20Sopenharmony_ci			goto out;
10568c2ecf20Sopenharmony_ci	}
10578c2ecf20Sopenharmony_ci
10588c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
10598c2ecf20Sopenharmony_ci	return count;
10608c2ecf20Sopenharmony_ciout:
10618c2ecf20Sopenharmony_ci	iscsit_put_tpg(tpg);
10628c2ecf20Sopenharmony_ci	return -EINVAL;
10638c2ecf20Sopenharmony_ci}
10648c2ecf20Sopenharmony_ci
10658c2ecf20Sopenharmony_ci
10668c2ecf20Sopenharmony_cistatic ssize_t lio_target_tpg_dynamic_sessions_show(struct config_item *item,
10678c2ecf20Sopenharmony_ci		char *page)
10688c2ecf20Sopenharmony_ci{
10698c2ecf20Sopenharmony_ci	return target_show_dynamic_sessions(to_tpg(item), page);
10708c2ecf20Sopenharmony_ci}
10718c2ecf20Sopenharmony_ci
10728c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_tpg_, enable);
10738c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(lio_target_tpg_, dynamic_sessions);
10748c2ecf20Sopenharmony_ci
10758c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_attrs[] = {
10768c2ecf20Sopenharmony_ci	&lio_target_tpg_attr_enable,
10778c2ecf20Sopenharmony_ci	&lio_target_tpg_attr_dynamic_sessions,
10788c2ecf20Sopenharmony_ci	NULL,
10798c2ecf20Sopenharmony_ci};
10808c2ecf20Sopenharmony_ci
10818c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_cit */
10828c2ecf20Sopenharmony_ci
10838c2ecf20Sopenharmony_ci/* Start items for lio_target_tiqn_cit */
10848c2ecf20Sopenharmony_ci
10858c2ecf20Sopenharmony_cistatic struct se_portal_group *lio_target_tiqn_addtpg(struct se_wwn *wwn,
10868c2ecf20Sopenharmony_ci						      const char *name)
10878c2ecf20Sopenharmony_ci{
10888c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg;
10898c2ecf20Sopenharmony_ci	struct iscsi_tiqn *tiqn;
10908c2ecf20Sopenharmony_ci	char *tpgt_str;
10918c2ecf20Sopenharmony_ci	int ret;
10928c2ecf20Sopenharmony_ci	u16 tpgt;
10938c2ecf20Sopenharmony_ci
10948c2ecf20Sopenharmony_ci	tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
10958c2ecf20Sopenharmony_ci	/*
10968c2ecf20Sopenharmony_ci	 * Only tpgt_# directory groups can be created below
10978c2ecf20Sopenharmony_ci	 * target/iscsi/iqn.superturodiskarry/
10988c2ecf20Sopenharmony_ci	 */
10998c2ecf20Sopenharmony_ci	tpgt_str = strstr(name, "tpgt_");
11008c2ecf20Sopenharmony_ci	if (!tpgt_str) {
11018c2ecf20Sopenharmony_ci		pr_err("Unable to locate \"tpgt_#\" directory"
11028c2ecf20Sopenharmony_ci				" group\n");
11038c2ecf20Sopenharmony_ci		return NULL;
11048c2ecf20Sopenharmony_ci	}
11058c2ecf20Sopenharmony_ci	tpgt_str += 5; /* Skip ahead of "tpgt_" */
11068c2ecf20Sopenharmony_ci	ret = kstrtou16(tpgt_str, 0, &tpgt);
11078c2ecf20Sopenharmony_ci	if (ret)
11088c2ecf20Sopenharmony_ci		return NULL;
11098c2ecf20Sopenharmony_ci
11108c2ecf20Sopenharmony_ci	tpg = iscsit_alloc_portal_group(tiqn, tpgt);
11118c2ecf20Sopenharmony_ci	if (!tpg)
11128c2ecf20Sopenharmony_ci		return NULL;
11138c2ecf20Sopenharmony_ci
11148c2ecf20Sopenharmony_ci	ret = core_tpg_register(wwn, &tpg->tpg_se_tpg, SCSI_PROTOCOL_ISCSI);
11158c2ecf20Sopenharmony_ci	if (ret < 0)
11168c2ecf20Sopenharmony_ci		goto free_out;
11178c2ecf20Sopenharmony_ci
11188c2ecf20Sopenharmony_ci	ret = iscsit_tpg_add_portal_group(tiqn, tpg);
11198c2ecf20Sopenharmony_ci	if (ret != 0)
11208c2ecf20Sopenharmony_ci		goto out;
11218c2ecf20Sopenharmony_ci
11228c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
11238c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated TPG: %s\n",
11248c2ecf20Sopenharmony_ci			name);
11258c2ecf20Sopenharmony_ci	return &tpg->tpg_se_tpg;
11268c2ecf20Sopenharmony_ciout:
11278c2ecf20Sopenharmony_ci	core_tpg_deregister(&tpg->tpg_se_tpg);
11288c2ecf20Sopenharmony_cifree_out:
11298c2ecf20Sopenharmony_ci	kfree(tpg);
11308c2ecf20Sopenharmony_ci	return NULL;
11318c2ecf20Sopenharmony_ci}
11328c2ecf20Sopenharmony_ci
11338c2ecf20Sopenharmony_cistatic void lio_target_tiqn_deltpg(struct se_portal_group *se_tpg)
11348c2ecf20Sopenharmony_ci{
11358c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg;
11368c2ecf20Sopenharmony_ci	struct iscsi_tiqn *tiqn;
11378c2ecf20Sopenharmony_ci
11388c2ecf20Sopenharmony_ci	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
11398c2ecf20Sopenharmony_ci	tiqn = tpg->tpg_tiqn;
11408c2ecf20Sopenharmony_ci	/*
11418c2ecf20Sopenharmony_ci	 * iscsit_tpg_del_portal_group() assumes force=1
11428c2ecf20Sopenharmony_ci	 */
11438c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> Releasing TPG\n");
11448c2ecf20Sopenharmony_ci	iscsit_tpg_del_portal_group(tiqn, tpg, 1);
11458c2ecf20Sopenharmony_ci}
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_ci/* End items for lio_target_tiqn_cit */
11488c2ecf20Sopenharmony_ci
11498c2ecf20Sopenharmony_ci/* Start LIO-Target TIQN struct contig_item lio_target_cit */
11508c2ecf20Sopenharmony_ci
11518c2ecf20Sopenharmony_cistatic ssize_t lio_target_wwn_lio_version_show(struct config_item *item,
11528c2ecf20Sopenharmony_ci		char *page)
11538c2ecf20Sopenharmony_ci{
11548c2ecf20Sopenharmony_ci	return sprintf(page, "Datera Inc. iSCSI Target "ISCSIT_VERSION"\n");
11558c2ecf20Sopenharmony_ci}
11568c2ecf20Sopenharmony_ci
11578c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(lio_target_wwn_, lio_version);
11588c2ecf20Sopenharmony_ci
11598c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_wwn_attrs[] = {
11608c2ecf20Sopenharmony_ci	&lio_target_wwn_attr_lio_version,
11618c2ecf20Sopenharmony_ci	NULL,
11628c2ecf20Sopenharmony_ci};
11638c2ecf20Sopenharmony_ci
11648c2ecf20Sopenharmony_cistatic struct se_wwn *lio_target_call_coreaddtiqn(
11658c2ecf20Sopenharmony_ci	struct target_fabric_configfs *tf,
11668c2ecf20Sopenharmony_ci	struct config_group *group,
11678c2ecf20Sopenharmony_ci	const char *name)
11688c2ecf20Sopenharmony_ci{
11698c2ecf20Sopenharmony_ci	struct iscsi_tiqn *tiqn;
11708c2ecf20Sopenharmony_ci
11718c2ecf20Sopenharmony_ci	tiqn = iscsit_add_tiqn((unsigned char *)name);
11728c2ecf20Sopenharmony_ci	if (IS_ERR(tiqn))
11738c2ecf20Sopenharmony_ci		return ERR_CAST(tiqn);
11748c2ecf20Sopenharmony_ci
11758c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
11768c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:"
11778c2ecf20Sopenharmony_ci			" %s\n", name);
11788c2ecf20Sopenharmony_ci	return &tiqn->tiqn_wwn;
11798c2ecf20Sopenharmony_ci}
11808c2ecf20Sopenharmony_ci
11818c2ecf20Sopenharmony_cistatic void lio_target_add_wwn_groups(struct se_wwn *wwn)
11828c2ecf20Sopenharmony_ci{
11838c2ecf20Sopenharmony_ci	struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
11848c2ecf20Sopenharmony_ci
11858c2ecf20Sopenharmony_ci	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group,
11868c2ecf20Sopenharmony_ci			"iscsi_instance", &iscsi_stat_instance_cit);
11878c2ecf20Sopenharmony_ci	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_instance_group,
11888c2ecf20Sopenharmony_ci			&tiqn->tiqn_wwn.fabric_stat_group);
11898c2ecf20Sopenharmony_ci
11908c2ecf20Sopenharmony_ci	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
11918c2ecf20Sopenharmony_ci			"iscsi_sess_err", &iscsi_stat_sess_err_cit);
11928c2ecf20Sopenharmony_ci	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
11938c2ecf20Sopenharmony_ci			&tiqn->tiqn_wwn.fabric_stat_group);
11948c2ecf20Sopenharmony_ci
11958c2ecf20Sopenharmony_ci	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
11968c2ecf20Sopenharmony_ci			"iscsi_tgt_attr", &iscsi_stat_tgt_attr_cit);
11978c2ecf20Sopenharmony_ci	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
11988c2ecf20Sopenharmony_ci			&tiqn->tiqn_wwn.fabric_stat_group);
11998c2ecf20Sopenharmony_ci
12008c2ecf20Sopenharmony_ci	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
12018c2ecf20Sopenharmony_ci			"iscsi_login_stats", &iscsi_stat_login_cit);
12028c2ecf20Sopenharmony_ci	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
12038c2ecf20Sopenharmony_ci			&tiqn->tiqn_wwn.fabric_stat_group);
12048c2ecf20Sopenharmony_ci
12058c2ecf20Sopenharmony_ci	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
12068c2ecf20Sopenharmony_ci			"iscsi_logout_stats", &iscsi_stat_logout_cit);
12078c2ecf20Sopenharmony_ci	configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
12088c2ecf20Sopenharmony_ci			&tiqn->tiqn_wwn.fabric_stat_group);
12098c2ecf20Sopenharmony_ci}
12108c2ecf20Sopenharmony_ci
12118c2ecf20Sopenharmony_cistatic void lio_target_call_coredeltiqn(
12128c2ecf20Sopenharmony_ci	struct se_wwn *wwn)
12138c2ecf20Sopenharmony_ci{
12148c2ecf20Sopenharmony_ci	struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
12158c2ecf20Sopenharmony_ci
12168c2ecf20Sopenharmony_ci	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n",
12178c2ecf20Sopenharmony_ci			tiqn->tiqn);
12188c2ecf20Sopenharmony_ci	iscsit_del_tiqn(tiqn);
12198c2ecf20Sopenharmony_ci}
12208c2ecf20Sopenharmony_ci
12218c2ecf20Sopenharmony_ci/* End LIO-Target TIQN struct contig_lio_target_cit */
12228c2ecf20Sopenharmony_ci
12238c2ecf20Sopenharmony_ci/* Start lio_target_discovery_auth_cit */
12248c2ecf20Sopenharmony_ci
12258c2ecf20Sopenharmony_ci#define DEF_DISC_AUTH_STR(name, flags)					\
12268c2ecf20Sopenharmony_ci	__DEF_NACL_AUTH_STR(disc, name, flags)				\
12278c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \
12288c2ecf20Sopenharmony_ci{									\
12298c2ecf20Sopenharmony_ci	return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl,\
12308c2ecf20Sopenharmony_ci		page);							\
12318c2ecf20Sopenharmony_ci}									\
12328c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_##name##_store(struct config_item *item,	\
12338c2ecf20Sopenharmony_ci		const char *page, size_t count)				\
12348c2ecf20Sopenharmony_ci{									\
12358c2ecf20Sopenharmony_ci	return __iscsi_disc_##name##_store(&iscsit_global->discovery_acl,	\
12368c2ecf20Sopenharmony_ci		page, count);						\
12378c2ecf20Sopenharmony_ci									\
12388c2ecf20Sopenharmony_ci}									\
12398c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_disc_, name)
12408c2ecf20Sopenharmony_ci
12418c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(userid, NAF_USERID_SET);
12428c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(password, NAF_PASSWORD_SET);
12438c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
12448c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
12458c2ecf20Sopenharmony_ci
12468c2ecf20Sopenharmony_ci#define DEF_DISC_AUTH_INT(name)						\
12478c2ecf20Sopenharmony_ci	__DEF_NACL_AUTH_INT(disc, name)					\
12488c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \
12498c2ecf20Sopenharmony_ci{									\
12508c2ecf20Sopenharmony_ci	return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl, \
12518c2ecf20Sopenharmony_ci			page);						\
12528c2ecf20Sopenharmony_ci}									\
12538c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_disc_, name)
12548c2ecf20Sopenharmony_ci
12558c2ecf20Sopenharmony_ciDEF_DISC_AUTH_INT(authenticate_target);
12568c2ecf20Sopenharmony_ci
12578c2ecf20Sopenharmony_ci
12588c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_enforce_discovery_auth_show(struct config_item *item,
12598c2ecf20Sopenharmony_ci		char *page)
12608c2ecf20Sopenharmony_ci{
12618c2ecf20Sopenharmony_ci	struct iscsi_node_auth *discovery_auth = &iscsit_global->discovery_acl.node_auth;
12628c2ecf20Sopenharmony_ci
12638c2ecf20Sopenharmony_ci	return sprintf(page, "%d\n", discovery_auth->enforce_discovery_auth);
12648c2ecf20Sopenharmony_ci}
12658c2ecf20Sopenharmony_ci
12668c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item,
12678c2ecf20Sopenharmony_ci		const char *page, size_t count)
12688c2ecf20Sopenharmony_ci{
12698c2ecf20Sopenharmony_ci	struct iscsi_param *param;
12708c2ecf20Sopenharmony_ci	struct iscsi_portal_group *discovery_tpg = iscsit_global->discovery_tpg;
12718c2ecf20Sopenharmony_ci	u32 op;
12728c2ecf20Sopenharmony_ci	int err;
12738c2ecf20Sopenharmony_ci
12748c2ecf20Sopenharmony_ci	err = kstrtou32(page, 0, &op);
12758c2ecf20Sopenharmony_ci	if (err)
12768c2ecf20Sopenharmony_ci		return -EINVAL;
12778c2ecf20Sopenharmony_ci	if ((op != 1) && (op != 0)) {
12788c2ecf20Sopenharmony_ci		pr_err("Illegal value for enforce_discovery_auth:"
12798c2ecf20Sopenharmony_ci				" %u\n", op);
12808c2ecf20Sopenharmony_ci		return -EINVAL;
12818c2ecf20Sopenharmony_ci	}
12828c2ecf20Sopenharmony_ci
12838c2ecf20Sopenharmony_ci	if (!discovery_tpg) {
12848c2ecf20Sopenharmony_ci		pr_err("iscsit_global->discovery_tpg is NULL\n");
12858c2ecf20Sopenharmony_ci		return -EINVAL;
12868c2ecf20Sopenharmony_ci	}
12878c2ecf20Sopenharmony_ci
12888c2ecf20Sopenharmony_ci	param = iscsi_find_param_from_key(AUTHMETHOD,
12898c2ecf20Sopenharmony_ci				discovery_tpg->param_list);
12908c2ecf20Sopenharmony_ci	if (!param)
12918c2ecf20Sopenharmony_ci		return -EINVAL;
12928c2ecf20Sopenharmony_ci
12938c2ecf20Sopenharmony_ci	if (op) {
12948c2ecf20Sopenharmony_ci		/*
12958c2ecf20Sopenharmony_ci		 * Reset the AuthMethod key to CHAP.
12968c2ecf20Sopenharmony_ci		 */
12978c2ecf20Sopenharmony_ci		if (iscsi_update_param_value(param, CHAP) < 0)
12988c2ecf20Sopenharmony_ci			return -EINVAL;
12998c2ecf20Sopenharmony_ci
13008c2ecf20Sopenharmony_ci		discovery_tpg->tpg_attrib.authentication = 1;
13018c2ecf20Sopenharmony_ci		iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 1;
13028c2ecf20Sopenharmony_ci		pr_debug("LIO-CORE[0] Successfully enabled"
13038c2ecf20Sopenharmony_ci			" authentication enforcement for iSCSI"
13048c2ecf20Sopenharmony_ci			" Discovery TPG\n");
13058c2ecf20Sopenharmony_ci	} else {
13068c2ecf20Sopenharmony_ci		/*
13078c2ecf20Sopenharmony_ci		 * Reset the AuthMethod key to CHAP,None
13088c2ecf20Sopenharmony_ci		 */
13098c2ecf20Sopenharmony_ci		if (iscsi_update_param_value(param, "CHAP,None") < 0)
13108c2ecf20Sopenharmony_ci			return -EINVAL;
13118c2ecf20Sopenharmony_ci
13128c2ecf20Sopenharmony_ci		discovery_tpg->tpg_attrib.authentication = 0;
13138c2ecf20Sopenharmony_ci		iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 0;
13148c2ecf20Sopenharmony_ci		pr_debug("LIO-CORE[0] Successfully disabled"
13158c2ecf20Sopenharmony_ci			" authentication enforcement for iSCSI"
13168c2ecf20Sopenharmony_ci			" Discovery TPG\n");
13178c2ecf20Sopenharmony_ci	}
13188c2ecf20Sopenharmony_ci
13198c2ecf20Sopenharmony_ci	return count;
13208c2ecf20Sopenharmony_ci}
13218c2ecf20Sopenharmony_ci
13228c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_disc_, enforce_discovery_auth);
13238c2ecf20Sopenharmony_ci
13248c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_discovery_auth_attrs[] = {
13258c2ecf20Sopenharmony_ci	&iscsi_disc_attr_userid,
13268c2ecf20Sopenharmony_ci	&iscsi_disc_attr_password,
13278c2ecf20Sopenharmony_ci	&iscsi_disc_attr_authenticate_target,
13288c2ecf20Sopenharmony_ci	&iscsi_disc_attr_userid_mutual,
13298c2ecf20Sopenharmony_ci	&iscsi_disc_attr_password_mutual,
13308c2ecf20Sopenharmony_ci	&iscsi_disc_attr_enforce_discovery_auth,
13318c2ecf20Sopenharmony_ci	NULL,
13328c2ecf20Sopenharmony_ci};
13338c2ecf20Sopenharmony_ci
13348c2ecf20Sopenharmony_ci/* End lio_target_discovery_auth_cit */
13358c2ecf20Sopenharmony_ci
13368c2ecf20Sopenharmony_ci/* Start functions for target_core_fabric_ops */
13378c2ecf20Sopenharmony_ci
13388c2ecf20Sopenharmony_cistatic int iscsi_get_cmd_state(struct se_cmd *se_cmd)
13398c2ecf20Sopenharmony_ci{
13408c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
13418c2ecf20Sopenharmony_ci
13428c2ecf20Sopenharmony_ci	return cmd->i_state;
13438c2ecf20Sopenharmony_ci}
13448c2ecf20Sopenharmony_ci
13458c2ecf20Sopenharmony_cistatic u32 lio_sess_get_index(struct se_session *se_sess)
13468c2ecf20Sopenharmony_ci{
13478c2ecf20Sopenharmony_ci	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
13488c2ecf20Sopenharmony_ci
13498c2ecf20Sopenharmony_ci	return sess->session_index;
13508c2ecf20Sopenharmony_ci}
13518c2ecf20Sopenharmony_ci
13528c2ecf20Sopenharmony_cistatic u32 lio_sess_get_initiator_sid(
13538c2ecf20Sopenharmony_ci	struct se_session *se_sess,
13548c2ecf20Sopenharmony_ci	unsigned char *buf,
13558c2ecf20Sopenharmony_ci	u32 size)
13568c2ecf20Sopenharmony_ci{
13578c2ecf20Sopenharmony_ci	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
13588c2ecf20Sopenharmony_ci	/*
13598c2ecf20Sopenharmony_ci	 * iSCSI Initiator Session Identifier from RFC-3720.
13608c2ecf20Sopenharmony_ci	 */
13618c2ecf20Sopenharmony_ci	return snprintf(buf, size, "%6phN", sess->isid);
13628c2ecf20Sopenharmony_ci}
13638c2ecf20Sopenharmony_ci
13648c2ecf20Sopenharmony_cistatic int lio_queue_data_in(struct se_cmd *se_cmd)
13658c2ecf20Sopenharmony_ci{
13668c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
13678c2ecf20Sopenharmony_ci	struct iscsi_conn *conn = cmd->conn;
13688c2ecf20Sopenharmony_ci
13698c2ecf20Sopenharmony_ci	cmd->i_state = ISTATE_SEND_DATAIN;
13708c2ecf20Sopenharmony_ci	return conn->conn_transport->iscsit_queue_data_in(conn, cmd);
13718c2ecf20Sopenharmony_ci}
13728c2ecf20Sopenharmony_ci
13738c2ecf20Sopenharmony_cistatic int lio_write_pending(struct se_cmd *se_cmd)
13748c2ecf20Sopenharmony_ci{
13758c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
13768c2ecf20Sopenharmony_ci	struct iscsi_conn *conn = cmd->conn;
13778c2ecf20Sopenharmony_ci
13788c2ecf20Sopenharmony_ci	if (!cmd->immediate_data && !cmd->unsolicited_data)
13798c2ecf20Sopenharmony_ci		return conn->conn_transport->iscsit_get_dataout(conn, cmd, false);
13808c2ecf20Sopenharmony_ci
13818c2ecf20Sopenharmony_ci	return 0;
13828c2ecf20Sopenharmony_ci}
13838c2ecf20Sopenharmony_ci
13848c2ecf20Sopenharmony_cistatic int lio_queue_status(struct se_cmd *se_cmd)
13858c2ecf20Sopenharmony_ci{
13868c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
13878c2ecf20Sopenharmony_ci	struct iscsi_conn *conn = cmd->conn;
13888c2ecf20Sopenharmony_ci
13898c2ecf20Sopenharmony_ci	cmd->i_state = ISTATE_SEND_STATUS;
13908c2ecf20Sopenharmony_ci
13918c2ecf20Sopenharmony_ci	if (cmd->se_cmd.scsi_status || cmd->sense_reason) {
13928c2ecf20Sopenharmony_ci		return iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
13938c2ecf20Sopenharmony_ci	}
13948c2ecf20Sopenharmony_ci	return conn->conn_transport->iscsit_queue_status(conn, cmd);
13958c2ecf20Sopenharmony_ci}
13968c2ecf20Sopenharmony_ci
13978c2ecf20Sopenharmony_cistatic void lio_queue_tm_rsp(struct se_cmd *se_cmd)
13988c2ecf20Sopenharmony_ci{
13998c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
14008c2ecf20Sopenharmony_ci
14018c2ecf20Sopenharmony_ci	cmd->i_state = ISTATE_SEND_TASKMGTRSP;
14028c2ecf20Sopenharmony_ci	iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state);
14038c2ecf20Sopenharmony_ci}
14048c2ecf20Sopenharmony_ci
14058c2ecf20Sopenharmony_cistatic void lio_aborted_task(struct se_cmd *se_cmd)
14068c2ecf20Sopenharmony_ci{
14078c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
14088c2ecf20Sopenharmony_ci
14098c2ecf20Sopenharmony_ci	cmd->conn->conn_transport->iscsit_aborted_task(cmd->conn, cmd);
14108c2ecf20Sopenharmony_ci}
14118c2ecf20Sopenharmony_ci
14128c2ecf20Sopenharmony_cistatic inline struct iscsi_portal_group *iscsi_tpg(struct se_portal_group *se_tpg)
14138c2ecf20Sopenharmony_ci{
14148c2ecf20Sopenharmony_ci	return container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
14158c2ecf20Sopenharmony_ci}
14168c2ecf20Sopenharmony_ci
14178c2ecf20Sopenharmony_cistatic char *lio_tpg_get_endpoint_wwn(struct se_portal_group *se_tpg)
14188c2ecf20Sopenharmony_ci{
14198c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_tiqn->tiqn;
14208c2ecf20Sopenharmony_ci}
14218c2ecf20Sopenharmony_ci
14228c2ecf20Sopenharmony_cistatic u16 lio_tpg_get_tag(struct se_portal_group *se_tpg)
14238c2ecf20Sopenharmony_ci{
14248c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpgt;
14258c2ecf20Sopenharmony_ci}
14268c2ecf20Sopenharmony_ci
14278c2ecf20Sopenharmony_cistatic u32 lio_tpg_get_default_depth(struct se_portal_group *se_tpg)
14288c2ecf20Sopenharmony_ci{
14298c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_attrib.default_cmdsn_depth;
14308c2ecf20Sopenharmony_ci}
14318c2ecf20Sopenharmony_ci
14328c2ecf20Sopenharmony_cistatic int lio_tpg_check_demo_mode(struct se_portal_group *se_tpg)
14338c2ecf20Sopenharmony_ci{
14348c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_attrib.generate_node_acls;
14358c2ecf20Sopenharmony_ci}
14368c2ecf20Sopenharmony_ci
14378c2ecf20Sopenharmony_cistatic int lio_tpg_check_demo_mode_cache(struct se_portal_group *se_tpg)
14388c2ecf20Sopenharmony_ci{
14398c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_attrib.cache_dynamic_acls;
14408c2ecf20Sopenharmony_ci}
14418c2ecf20Sopenharmony_ci
14428c2ecf20Sopenharmony_cistatic int lio_tpg_check_demo_mode_write_protect(
14438c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg)
14448c2ecf20Sopenharmony_ci{
14458c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_attrib.demo_mode_write_protect;
14468c2ecf20Sopenharmony_ci}
14478c2ecf20Sopenharmony_ci
14488c2ecf20Sopenharmony_cistatic int lio_tpg_check_prod_mode_write_protect(
14498c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg)
14508c2ecf20Sopenharmony_ci{
14518c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_attrib.prod_mode_write_protect;
14528c2ecf20Sopenharmony_ci}
14538c2ecf20Sopenharmony_ci
14548c2ecf20Sopenharmony_cistatic int lio_tpg_check_prot_fabric_only(
14558c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg)
14568c2ecf20Sopenharmony_ci{
14578c2ecf20Sopenharmony_ci	/*
14588c2ecf20Sopenharmony_ci	 * Only report fabric_prot_type if t10_pi has also been enabled
14598c2ecf20Sopenharmony_ci	 * for incoming ib_isert sessions.
14608c2ecf20Sopenharmony_ci	 */
14618c2ecf20Sopenharmony_ci	if (!iscsi_tpg(se_tpg)->tpg_attrib.t10_pi)
14628c2ecf20Sopenharmony_ci		return 0;
14638c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_attrib.fabric_prot_type;
14648c2ecf20Sopenharmony_ci}
14658c2ecf20Sopenharmony_ci
14668c2ecf20Sopenharmony_ci/*
14678c2ecf20Sopenharmony_ci * This function calls iscsit_inc_session_usage_count() on the
14688c2ecf20Sopenharmony_ci * struct iscsi_session in question.
14698c2ecf20Sopenharmony_ci */
14708c2ecf20Sopenharmony_cistatic void lio_tpg_close_session(struct se_session *se_sess)
14718c2ecf20Sopenharmony_ci{
14728c2ecf20Sopenharmony_ci	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
14738c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = &sess->tpg->tpg_se_tpg;
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_ci	spin_lock_bh(&se_tpg->session_lock);
14768c2ecf20Sopenharmony_ci	spin_lock(&sess->conn_lock);
14778c2ecf20Sopenharmony_ci	if (atomic_read(&sess->session_fall_back_to_erl0) ||
14788c2ecf20Sopenharmony_ci	    atomic_read(&sess->session_logout) ||
14798c2ecf20Sopenharmony_ci	    atomic_read(&sess->session_close) ||
14808c2ecf20Sopenharmony_ci	    (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
14818c2ecf20Sopenharmony_ci		spin_unlock(&sess->conn_lock);
14828c2ecf20Sopenharmony_ci		spin_unlock_bh(&se_tpg->session_lock);
14838c2ecf20Sopenharmony_ci		return;
14848c2ecf20Sopenharmony_ci	}
14858c2ecf20Sopenharmony_ci	iscsit_inc_session_usage_count(sess);
14868c2ecf20Sopenharmony_ci	atomic_set(&sess->session_reinstatement, 1);
14878c2ecf20Sopenharmony_ci	atomic_set(&sess->session_fall_back_to_erl0, 1);
14888c2ecf20Sopenharmony_ci	atomic_set(&sess->session_close, 1);
14898c2ecf20Sopenharmony_ci	spin_unlock(&sess->conn_lock);
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_ci	iscsit_stop_time2retain_timer(sess);
14928c2ecf20Sopenharmony_ci	spin_unlock_bh(&se_tpg->session_lock);
14938c2ecf20Sopenharmony_ci
14948c2ecf20Sopenharmony_ci	iscsit_stop_session(sess, 1, 1);
14958c2ecf20Sopenharmony_ci	iscsit_dec_session_usage_count(sess);
14968c2ecf20Sopenharmony_ci}
14978c2ecf20Sopenharmony_ci
14988c2ecf20Sopenharmony_cistatic u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg)
14998c2ecf20Sopenharmony_ci{
15008c2ecf20Sopenharmony_ci	return iscsi_tpg(se_tpg)->tpg_tiqn->tiqn_index;
15018c2ecf20Sopenharmony_ci}
15028c2ecf20Sopenharmony_ci
15038c2ecf20Sopenharmony_cistatic void lio_set_default_node_attributes(struct se_node_acl *se_acl)
15048c2ecf20Sopenharmony_ci{
15058c2ecf20Sopenharmony_ci	struct iscsi_node_acl *acl = container_of(se_acl, struct iscsi_node_acl,
15068c2ecf20Sopenharmony_ci				se_node_acl);
15078c2ecf20Sopenharmony_ci	struct se_portal_group *se_tpg = se_acl->se_tpg;
15088c2ecf20Sopenharmony_ci	struct iscsi_portal_group *tpg = container_of(se_tpg,
15098c2ecf20Sopenharmony_ci				struct iscsi_portal_group, tpg_se_tpg);
15108c2ecf20Sopenharmony_ci
15118c2ecf20Sopenharmony_ci	acl->node_attrib.nacl = acl;
15128c2ecf20Sopenharmony_ci	iscsit_set_default_node_attribues(acl, tpg);
15138c2ecf20Sopenharmony_ci}
15148c2ecf20Sopenharmony_ci
15158c2ecf20Sopenharmony_cistatic int lio_check_stop_free(struct se_cmd *se_cmd)
15168c2ecf20Sopenharmony_ci{
15178c2ecf20Sopenharmony_ci	return target_put_sess_cmd(se_cmd);
15188c2ecf20Sopenharmony_ci}
15198c2ecf20Sopenharmony_ci
15208c2ecf20Sopenharmony_cistatic void lio_release_cmd(struct se_cmd *se_cmd)
15218c2ecf20Sopenharmony_ci{
15228c2ecf20Sopenharmony_ci	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
15238c2ecf20Sopenharmony_ci
15248c2ecf20Sopenharmony_ci	pr_debug("Entering lio_release_cmd for se_cmd: %p\n", se_cmd);
15258c2ecf20Sopenharmony_ci	iscsit_release_cmd(cmd);
15268c2ecf20Sopenharmony_ci}
15278c2ecf20Sopenharmony_ci
15288c2ecf20Sopenharmony_ciconst struct target_core_fabric_ops iscsi_ops = {
15298c2ecf20Sopenharmony_ci	.module				= THIS_MODULE,
15308c2ecf20Sopenharmony_ci	.fabric_alias			= "iscsi",
15318c2ecf20Sopenharmony_ci	.fabric_name			= "iSCSI",
15328c2ecf20Sopenharmony_ci	.node_acl_size			= sizeof(struct iscsi_node_acl),
15338c2ecf20Sopenharmony_ci	.tpg_get_wwn			= lio_tpg_get_endpoint_wwn,
15348c2ecf20Sopenharmony_ci	.tpg_get_tag			= lio_tpg_get_tag,
15358c2ecf20Sopenharmony_ci	.tpg_get_default_depth		= lio_tpg_get_default_depth,
15368c2ecf20Sopenharmony_ci	.tpg_check_demo_mode		= lio_tpg_check_demo_mode,
15378c2ecf20Sopenharmony_ci	.tpg_check_demo_mode_cache	= lio_tpg_check_demo_mode_cache,
15388c2ecf20Sopenharmony_ci	.tpg_check_demo_mode_write_protect =
15398c2ecf20Sopenharmony_ci			lio_tpg_check_demo_mode_write_protect,
15408c2ecf20Sopenharmony_ci	.tpg_check_prod_mode_write_protect =
15418c2ecf20Sopenharmony_ci			lio_tpg_check_prod_mode_write_protect,
15428c2ecf20Sopenharmony_ci	.tpg_check_prot_fabric_only	= &lio_tpg_check_prot_fabric_only,
15438c2ecf20Sopenharmony_ci	.tpg_get_inst_index		= lio_tpg_get_inst_index,
15448c2ecf20Sopenharmony_ci	.check_stop_free		= lio_check_stop_free,
15458c2ecf20Sopenharmony_ci	.release_cmd			= lio_release_cmd,
15468c2ecf20Sopenharmony_ci	.close_session			= lio_tpg_close_session,
15478c2ecf20Sopenharmony_ci	.sess_get_index			= lio_sess_get_index,
15488c2ecf20Sopenharmony_ci	.sess_get_initiator_sid		= lio_sess_get_initiator_sid,
15498c2ecf20Sopenharmony_ci	.write_pending			= lio_write_pending,
15508c2ecf20Sopenharmony_ci	.set_default_node_attributes	= lio_set_default_node_attributes,
15518c2ecf20Sopenharmony_ci	.get_cmd_state			= iscsi_get_cmd_state,
15528c2ecf20Sopenharmony_ci	.queue_data_in			= lio_queue_data_in,
15538c2ecf20Sopenharmony_ci	.queue_status			= lio_queue_status,
15548c2ecf20Sopenharmony_ci	.queue_tm_rsp			= lio_queue_tm_rsp,
15558c2ecf20Sopenharmony_ci	.aborted_task			= lio_aborted_task,
15568c2ecf20Sopenharmony_ci	.fabric_make_wwn		= lio_target_call_coreaddtiqn,
15578c2ecf20Sopenharmony_ci	.fabric_drop_wwn		= lio_target_call_coredeltiqn,
15588c2ecf20Sopenharmony_ci	.add_wwn_groups			= lio_target_add_wwn_groups,
15598c2ecf20Sopenharmony_ci	.fabric_make_tpg		= lio_target_tiqn_addtpg,
15608c2ecf20Sopenharmony_ci	.fabric_drop_tpg		= lio_target_tiqn_deltpg,
15618c2ecf20Sopenharmony_ci	.fabric_make_np			= lio_target_call_addnptotpg,
15628c2ecf20Sopenharmony_ci	.fabric_drop_np			= lio_target_call_delnpfromtpg,
15638c2ecf20Sopenharmony_ci	.fabric_init_nodeacl		= lio_target_init_nodeacl,
15648c2ecf20Sopenharmony_ci
15658c2ecf20Sopenharmony_ci	.tfc_discovery_attrs		= lio_target_discovery_auth_attrs,
15668c2ecf20Sopenharmony_ci	.tfc_wwn_attrs			= lio_target_wwn_attrs,
15678c2ecf20Sopenharmony_ci	.tfc_tpg_base_attrs		= lio_target_tpg_attrs,
15688c2ecf20Sopenharmony_ci	.tfc_tpg_attrib_attrs		= lio_target_tpg_attrib_attrs,
15698c2ecf20Sopenharmony_ci	.tfc_tpg_auth_attrs		= lio_target_tpg_auth_attrs,
15708c2ecf20Sopenharmony_ci	.tfc_tpg_param_attrs		= lio_target_tpg_param_attrs,
15718c2ecf20Sopenharmony_ci	.tfc_tpg_np_base_attrs		= lio_target_portal_attrs,
15728c2ecf20Sopenharmony_ci	.tfc_tpg_nacl_base_attrs	= lio_target_initiator_attrs,
15738c2ecf20Sopenharmony_ci	.tfc_tpg_nacl_attrib_attrs	= lio_target_nacl_attrib_attrs,
15748c2ecf20Sopenharmony_ci	.tfc_tpg_nacl_auth_attrs	= lio_target_nacl_auth_attrs,
15758c2ecf20Sopenharmony_ci	.tfc_tpg_nacl_param_attrs	= lio_target_nacl_param_attrs,
15768c2ecf20Sopenharmony_ci
15778c2ecf20Sopenharmony_ci	.write_pending_must_be_called	= true,
15788c2ecf20Sopenharmony_ci};
1579