brintos

brintos / linux-shallow public Read only

0
0
Text · 45.2 KiB · 88db94f Raw
1597 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*******************************************************************************3 * This file contains the configfs implementation for iSCSI Target mode4 * 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	else50		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		256153 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 other224	 * 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 under232	 * 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 userid422 */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 locatel 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 below1052	 * 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=11105		 */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=11127	 */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 contig_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,None1329		 */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 enabled1475	 * 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 the1484 * 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};1597