1 /*******************************************************************************
2  * This file contains the configfs implementation for iSCSI Target mode
3  * from the LIO-Target Project.
4  *
5  * (c) Copyright 2007-2013 Datera, Inc.
6  *
7  * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  ****************************************************************************/
19 
20 #include <linux/configfs.h>
21 #include <linux/ctype.h>
22 #include <linux/export.h>
23 #include <linux/inet.h>
24 #include <target/target_core_base.h>
25 #include <target/target_core_fabric.h>
26 #include <target/target_core_fabric_configfs.h>
27 #include <target/target_core_configfs.h>
28 #include <target/configfs_macros.h>
29 #include <target/iscsi/iscsi_transport.h>
30 
31 #include <target/iscsi/iscsi_target_core.h>
32 #include "iscsi_target_parameters.h"
33 #include "iscsi_target_device.h"
34 #include "iscsi_target_erl0.h"
35 #include "iscsi_target_nodeattrib.h"
36 #include "iscsi_target_tpg.h"
37 #include "iscsi_target_util.h"
38 #include "iscsi_target.h"
39 #include <target/iscsi/iscsi_target_stat.h>
40 
41 struct lio_target_configfs_attribute {
42 	struct configfs_attribute attr;
43 	ssize_t (*show)(void *, char *);
44 	ssize_t (*store)(void *, const char *, size_t);
45 };
46 
47 /* Start items for lio_target_portal_cit */
48 
49 static ssize_t lio_target_np_show_sctp(
50 	struct se_tpg_np *se_tpg_np,
51 	char *page)
52 {
53 	struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
54 				struct iscsi_tpg_np, se_tpg_np);
55 	struct iscsi_tpg_np *tpg_np_sctp;
56 	ssize_t rb;
57 
58 	tpg_np_sctp = iscsit_tpg_locate_child_np(tpg_np, ISCSI_SCTP_TCP);
59 	if (tpg_np_sctp)
60 		rb = sprintf(page, "1\n");
61 	else
62 		rb = sprintf(page, "0\n");
63 
64 	return rb;
65 }
66 
67 static ssize_t lio_target_np_store_sctp(
68 	struct se_tpg_np *se_tpg_np,
69 	const char *page,
70 	size_t count)
71 {
72 	struct iscsi_np *np;
73 	struct iscsi_portal_group *tpg;
74 	struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
75 				struct iscsi_tpg_np, se_tpg_np);
76 	struct iscsi_tpg_np *tpg_np_sctp = NULL;
77 	u32 op;
78 	int ret;
79 
80 	ret = kstrtou32(page, 0, &op);
81 	if (ret)
82 		return ret;
83 	if ((op != 1) && (op != 0)) {
84 		pr_err("Illegal value for tpg_enable: %u\n", op);
85 		return -EINVAL;
86 	}
87 	np = tpg_np->tpg_np;
88 	if (!np) {
89 		pr_err("Unable to locate struct iscsi_np from"
90 				" struct iscsi_tpg_np\n");
91 		return -EINVAL;
92 	}
93 
94 	tpg = tpg_np->tpg;
95 	if (iscsit_get_tpg(tpg) < 0)
96 		return -EINVAL;
97 
98 	if (op) {
99 		/*
100 		 * Use existing np->np_sockaddr for SCTP network portal reference
101 		 */
102 		tpg_np_sctp = iscsit_tpg_add_network_portal(tpg, &np->np_sockaddr,
103 					np->np_ip, tpg_np, ISCSI_SCTP_TCP);
104 		if (!tpg_np_sctp || IS_ERR(tpg_np_sctp))
105 			goto out;
106 	} else {
107 		tpg_np_sctp = iscsit_tpg_locate_child_np(tpg_np, ISCSI_SCTP_TCP);
108 		if (!tpg_np_sctp)
109 			goto out;
110 
111 		ret = iscsit_tpg_del_network_portal(tpg, tpg_np_sctp);
112 		if (ret < 0)
113 			goto out;
114 	}
115 
116 	iscsit_put_tpg(tpg);
117 	return count;
118 out:
119 	iscsit_put_tpg(tpg);
120 	return -EINVAL;
121 }
122 
123 TF_NP_BASE_ATTR(lio_target, sctp, S_IRUGO | S_IWUSR);
124 
125 static ssize_t lio_target_np_show_iser(
126 	struct se_tpg_np *se_tpg_np,
127 	char *page)
128 {
129 	struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
130 				struct iscsi_tpg_np, se_tpg_np);
131 	struct iscsi_tpg_np *tpg_np_iser;
132 	ssize_t rb;
133 
134 	tpg_np_iser = iscsit_tpg_locate_child_np(tpg_np, ISCSI_INFINIBAND);
135 	if (tpg_np_iser)
136 		rb = sprintf(page, "1\n");
137 	else
138 		rb = sprintf(page, "0\n");
139 
140 	return rb;
141 }
142 
143 static ssize_t lio_target_np_store_iser(
144 	struct se_tpg_np *se_tpg_np,
145 	const char *page,
146 	size_t count)
147 {
148 	struct iscsi_np *np;
149 	struct iscsi_portal_group *tpg;
150 	struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
151 				struct iscsi_tpg_np, se_tpg_np);
152 	struct iscsi_tpg_np *tpg_np_iser = NULL;
153 	char *endptr;
154 	u32 op;
155 	int rc = 0;
156 
157 	op = simple_strtoul(page, &endptr, 0);
158 	if ((op != 1) && (op != 0)) {
159 		pr_err("Illegal value for tpg_enable: %u\n", op);
160 		return -EINVAL;
161 	}
162 	np = tpg_np->tpg_np;
163 	if (!np) {
164 		pr_err("Unable to locate struct iscsi_np from"
165 				" struct iscsi_tpg_np\n");
166 		return -EINVAL;
167 	}
168 
169 	tpg = tpg_np->tpg;
170 	if (iscsit_get_tpg(tpg) < 0)
171 		return -EINVAL;
172 
173 	if (op) {
174 		rc = request_module("ib_isert");
175 		if (rc != 0) {
176 			pr_warn("Unable to request_module for ib_isert\n");
177 			rc = 0;
178 		}
179 
180 		tpg_np_iser = iscsit_tpg_add_network_portal(tpg, &np->np_sockaddr,
181 				np->np_ip, tpg_np, ISCSI_INFINIBAND);
182 		if (IS_ERR(tpg_np_iser)) {
183 			rc = PTR_ERR(tpg_np_iser);
184 			goto out;
185 		}
186 	} else {
187 		tpg_np_iser = iscsit_tpg_locate_child_np(tpg_np, ISCSI_INFINIBAND);
188 		if (tpg_np_iser) {
189 			rc = iscsit_tpg_del_network_portal(tpg, tpg_np_iser);
190 			if (rc < 0)
191 				goto out;
192 		}
193 	}
194 
195 	iscsit_put_tpg(tpg);
196 	return count;
197 out:
198 	iscsit_put_tpg(tpg);
199 	return rc;
200 }
201 
202 TF_NP_BASE_ATTR(lio_target, iser, S_IRUGO | S_IWUSR);
203 
204 static struct configfs_attribute *lio_target_portal_attrs[] = {
205 	&lio_target_np_sctp.attr,
206 	&lio_target_np_iser.attr,
207 	NULL,
208 };
209 
210 /* Stop items for lio_target_portal_cit */
211 
212 /* Start items for lio_target_np_cit */
213 
214 #define MAX_PORTAL_LEN		256
215 
216 static struct se_tpg_np *lio_target_call_addnptotpg(
217 	struct se_portal_group *se_tpg,
218 	struct config_group *group,
219 	const char *name)
220 {
221 	struct iscsi_portal_group *tpg;
222 	struct iscsi_tpg_np *tpg_np;
223 	char *str, *str2, *ip_str, *port_str;
224 	struct __kernel_sockaddr_storage sockaddr;
225 	struct sockaddr_in *sock_in;
226 	struct sockaddr_in6 *sock_in6;
227 	unsigned long port;
228 	int ret;
229 	char buf[MAX_PORTAL_LEN + 1];
230 
231 	if (strlen(name) > MAX_PORTAL_LEN) {
232 		pr_err("strlen(name): %d exceeds MAX_PORTAL_LEN: %d\n",
233 			(int)strlen(name), MAX_PORTAL_LEN);
234 		return ERR_PTR(-EOVERFLOW);
235 	}
236 	memset(buf, 0, MAX_PORTAL_LEN + 1);
237 	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
238 
239 	memset(&sockaddr, 0, sizeof(struct __kernel_sockaddr_storage));
240 
241 	str = strstr(buf, "[");
242 	if (str) {
243 		const char *end;
244 
245 		str2 = strstr(str, "]");
246 		if (!str2) {
247 			pr_err("Unable to locate trailing \"]\""
248 				" in IPv6 iSCSI network portal address\n");
249 			return ERR_PTR(-EINVAL);
250 		}
251 		str++; /* Skip over leading "[" */
252 		*str2 = '\0'; /* Terminate the IPv6 address */
253 		str2++; /* Skip over the "]" */
254 		port_str = strstr(str2, ":");
255 		if (!port_str) {
256 			pr_err("Unable to locate \":port\""
257 				" in IPv6 iSCSI network portal address\n");
258 			return ERR_PTR(-EINVAL);
259 		}
260 		*port_str = '\0'; /* Terminate string for IP */
261 		port_str++; /* Skip over ":" */
262 
263 		ret = kstrtoul(port_str, 0, &port);
264 		if (ret < 0) {
265 			pr_err("kstrtoul() failed for port_str: %d\n", ret);
266 			return ERR_PTR(ret);
267 		}
268 		sock_in6 = (struct sockaddr_in6 *)&sockaddr;
269 		sock_in6->sin6_family = AF_INET6;
270 		sock_in6->sin6_port = htons((unsigned short)port);
271 		ret = in6_pton(str, IPV6_ADDRESS_SPACE,
272 				(void *)&sock_in6->sin6_addr.in6_u, -1, &end);
273 		if (ret <= 0) {
274 			pr_err("in6_pton returned: %d\n", ret);
275 			return ERR_PTR(-EINVAL);
276 		}
277 	} else {
278 		str = ip_str = &buf[0];
279 		port_str = strstr(ip_str, ":");
280 		if (!port_str) {
281 			pr_err("Unable to locate \":port\""
282 				" in IPv4 iSCSI network portal address\n");
283 			return ERR_PTR(-EINVAL);
284 		}
285 		*port_str = '\0'; /* Terminate string for IP */
286 		port_str++; /* Skip over ":" */
287 
288 		ret = kstrtoul(port_str, 0, &port);
289 		if (ret < 0) {
290 			pr_err("kstrtoul() failed for port_str: %d\n", ret);
291 			return ERR_PTR(ret);
292 		}
293 		sock_in = (struct sockaddr_in *)&sockaddr;
294 		sock_in->sin_family = AF_INET;
295 		sock_in->sin_port = htons((unsigned short)port);
296 		sock_in->sin_addr.s_addr = in_aton(ip_str);
297 	}
298 	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
299 	ret = iscsit_get_tpg(tpg);
300 	if (ret < 0)
301 		return ERR_PTR(-EINVAL);
302 
303 	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s TPGT: %hu"
304 		" PORTAL: %s\n",
305 		config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
306 		tpg->tpgt, name);
307 	/*
308 	 * Assume ISCSI_TCP by default.  Other network portals for other
309 	 * iSCSI fabrics:
310 	 *
311 	 * Traditional iSCSI over SCTP (initial support)
312 	 * iSER/TCP (TODO, hardware available)
313 	 * iSER/SCTP (TODO, software emulation with osc-iwarp)
314 	 * iSER/IB (TODO, hardware available)
315 	 *
316 	 * can be enabled with attributes under
317 	 * sys/kernel/config/iscsi/$IQN/$TPG/np/$IP:$PORT/
318 	 *
319 	 */
320 	tpg_np = iscsit_tpg_add_network_portal(tpg, &sockaddr, str, NULL,
321 				ISCSI_TCP);
322 	if (IS_ERR(tpg_np)) {
323 		iscsit_put_tpg(tpg);
324 		return ERR_CAST(tpg_np);
325 	}
326 	pr_debug("LIO_Target_ConfigFS: addnptotpg done!\n");
327 
328 	iscsit_put_tpg(tpg);
329 	return &tpg_np->se_tpg_np;
330 }
331 
332 static void lio_target_call_delnpfromtpg(
333 	struct se_tpg_np *se_tpg_np)
334 {
335 	struct iscsi_portal_group *tpg;
336 	struct iscsi_tpg_np *tpg_np;
337 	struct se_portal_group *se_tpg;
338 	int ret;
339 
340 	tpg_np = container_of(se_tpg_np, struct iscsi_tpg_np, se_tpg_np);
341 	tpg = tpg_np->tpg;
342 	ret = iscsit_get_tpg(tpg);
343 	if (ret < 0)
344 		return;
345 
346 	se_tpg = &tpg->tpg_se_tpg;
347 	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu"
348 		" PORTAL: %s:%hu\n", config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
349 		tpg->tpgt, tpg_np->tpg_np->np_ip, tpg_np->tpg_np->np_port);
350 
351 	ret = iscsit_tpg_del_network_portal(tpg, tpg_np);
352 	if (ret < 0)
353 		goto out;
354 
355 	pr_debug("LIO_Target_ConfigFS: delnpfromtpg done!\n");
356 out:
357 	iscsit_put_tpg(tpg);
358 }
359 
360 /* End items for lio_target_np_cit */
361 
362 /* Start items for lio_target_nacl_attrib_cit */
363 
364 #define DEF_NACL_ATTRIB(name)						\
365 static ssize_t iscsi_nacl_attrib_show_##name(				\
366 	struct se_node_acl *se_nacl,					\
367 	char *page)							\
368 {									\
369 	struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \
370 					se_node_acl);			\
371 									\
372 	return sprintf(page, "%u\n", nacl->node_attrib.name);		\
373 }									\
374 									\
375 static ssize_t iscsi_nacl_attrib_store_##name(				\
376 	struct se_node_acl *se_nacl,					\
377 	const char *page,						\
378 	size_t count)							\
379 {									\
380 	struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \
381 					se_node_acl);			\
382 	u32 val;							\
383 	int ret;							\
384 									\
385 	ret = kstrtou32(page, 0, &val);					\
386 	if (ret)							\
387 		return ret;						\
388 	ret = iscsit_na_##name(nacl, val);				\
389 	if (ret < 0)							\
390 		return ret;						\
391 									\
392 	return count;							\
393 }
394 
395 #define NACL_ATTR(_name, _mode) TF_NACL_ATTRIB_ATTR(iscsi, _name, _mode);
396 /*
397  * Define iscsi_node_attrib_s_dataout_timeout
398  */
399 DEF_NACL_ATTRIB(dataout_timeout);
400 NACL_ATTR(dataout_timeout, S_IRUGO | S_IWUSR);
401 /*
402  * Define iscsi_node_attrib_s_dataout_timeout_retries
403  */
404 DEF_NACL_ATTRIB(dataout_timeout_retries);
405 NACL_ATTR(dataout_timeout_retries, S_IRUGO | S_IWUSR);
406 /*
407  * Define iscsi_node_attrib_s_default_erl
408  */
409 DEF_NACL_ATTRIB(default_erl);
410 NACL_ATTR(default_erl, S_IRUGO | S_IWUSR);
411 /*
412  * Define iscsi_node_attrib_s_nopin_timeout
413  */
414 DEF_NACL_ATTRIB(nopin_timeout);
415 NACL_ATTR(nopin_timeout, S_IRUGO | S_IWUSR);
416 /*
417  * Define iscsi_node_attrib_s_nopin_response_timeout
418  */
419 DEF_NACL_ATTRIB(nopin_response_timeout);
420 NACL_ATTR(nopin_response_timeout, S_IRUGO | S_IWUSR);
421 /*
422  * Define iscsi_node_attrib_s_random_datain_pdu_offsets
423  */
424 DEF_NACL_ATTRIB(random_datain_pdu_offsets);
425 NACL_ATTR(random_datain_pdu_offsets, S_IRUGO | S_IWUSR);
426 /*
427  * Define iscsi_node_attrib_s_random_datain_seq_offsets
428  */
429 DEF_NACL_ATTRIB(random_datain_seq_offsets);
430 NACL_ATTR(random_datain_seq_offsets, S_IRUGO | S_IWUSR);
431 /*
432  * Define iscsi_node_attrib_s_random_r2t_offsets
433  */
434 DEF_NACL_ATTRIB(random_r2t_offsets);
435 NACL_ATTR(random_r2t_offsets, S_IRUGO | S_IWUSR);
436 
437 static struct configfs_attribute *lio_target_nacl_attrib_attrs[] = {
438 	&iscsi_nacl_attrib_dataout_timeout.attr,
439 	&iscsi_nacl_attrib_dataout_timeout_retries.attr,
440 	&iscsi_nacl_attrib_default_erl.attr,
441 	&iscsi_nacl_attrib_nopin_timeout.attr,
442 	&iscsi_nacl_attrib_nopin_response_timeout.attr,
443 	&iscsi_nacl_attrib_random_datain_pdu_offsets.attr,
444 	&iscsi_nacl_attrib_random_datain_seq_offsets.attr,
445 	&iscsi_nacl_attrib_random_r2t_offsets.attr,
446 	NULL,
447 };
448 
449 /* End items for lio_target_nacl_attrib_cit */
450 
451 /* Start items for lio_target_nacl_auth_cit */
452 
453 #define __DEF_NACL_AUTH_STR(prefix, name, flags)			\
454 static ssize_t __iscsi_##prefix##_show_##name(				\
455 	struct iscsi_node_acl *nacl,					\
456 	char *page)							\
457 {									\
458 	struct iscsi_node_auth *auth = &nacl->node_auth;		\
459 									\
460 	if (!capable(CAP_SYS_ADMIN))					\
461 		return -EPERM;						\
462 	return snprintf(page, PAGE_SIZE, "%s\n", auth->name);		\
463 }									\
464 									\
465 static ssize_t __iscsi_##prefix##_store_##name(				\
466 	struct iscsi_node_acl *nacl,					\
467 	const char *page,						\
468 	size_t count)							\
469 {									\
470 	struct iscsi_node_auth *auth = &nacl->node_auth;		\
471 									\
472 	if (!capable(CAP_SYS_ADMIN))					\
473 		return -EPERM;						\
474 	if (count >= sizeof(auth->name))				\
475 		return -EINVAL;						\
476 	snprintf(auth->name, sizeof(auth->name), "%s", page);		\
477 	if (!strncmp("NULL", auth->name, 4))				\
478 		auth->naf_flags &= ~flags;				\
479 	else								\
480 		auth->naf_flags |= flags;				\
481 									\
482 	if ((auth->naf_flags & NAF_USERID_IN_SET) &&			\
483 	    (auth->naf_flags & NAF_PASSWORD_IN_SET))			\
484 		auth->authenticate_target = 1;				\
485 	else								\
486 		auth->authenticate_target = 0;				\
487 									\
488 	return count;							\
489 }
490 
491 #define __DEF_NACL_AUTH_INT(prefix, name)				\
492 static ssize_t __iscsi_##prefix##_show_##name(				\
493 	struct iscsi_node_acl *nacl,					\
494 	char *page)							\
495 {									\
496 	struct iscsi_node_auth *auth = &nacl->node_auth;		\
497 									\
498 	if (!capable(CAP_SYS_ADMIN))					\
499 		return -EPERM;						\
500 									\
501 	return snprintf(page, PAGE_SIZE, "%d\n", auth->name);		\
502 }
503 
504 #define DEF_NACL_AUTH_STR(name, flags)					\
505 	__DEF_NACL_AUTH_STR(nacl_auth, name, flags)			\
506 static ssize_t iscsi_nacl_auth_show_##name(				\
507 	struct se_node_acl *nacl,					\
508 	char *page)							\
509 {									\
510 	return __iscsi_nacl_auth_show_##name(container_of(nacl,		\
511 			struct iscsi_node_acl, se_node_acl), page);		\
512 }									\
513 static ssize_t iscsi_nacl_auth_store_##name(				\
514 	struct se_node_acl *nacl,					\
515 	const char *page,						\
516 	size_t count)							\
517 {									\
518 	return __iscsi_nacl_auth_store_##name(container_of(nacl,	\
519 			struct iscsi_node_acl, se_node_acl), page, count);	\
520 }
521 
522 #define DEF_NACL_AUTH_INT(name)						\
523 	__DEF_NACL_AUTH_INT(nacl_auth, name)				\
524 static ssize_t iscsi_nacl_auth_show_##name(				\
525 	struct se_node_acl *nacl,					\
526 	char *page)							\
527 {									\
528 	return __iscsi_nacl_auth_show_##name(container_of(nacl,		\
529 			struct iscsi_node_acl, se_node_acl), page);		\
530 }
531 
532 #define AUTH_ATTR(_name, _mode)	TF_NACL_AUTH_ATTR(iscsi, _name, _mode);
533 #define AUTH_ATTR_RO(_name) TF_NACL_AUTH_ATTR_RO(iscsi, _name);
534 
535 /*
536  * One-way authentication userid
537  */
538 DEF_NACL_AUTH_STR(userid, NAF_USERID_SET);
539 AUTH_ATTR(userid, S_IRUGO | S_IWUSR);
540 /*
541  * One-way authentication password
542  */
543 DEF_NACL_AUTH_STR(password, NAF_PASSWORD_SET);
544 AUTH_ATTR(password, S_IRUGO | S_IWUSR);
545 /*
546  * Enforce mutual authentication
547  */
548 DEF_NACL_AUTH_INT(authenticate_target);
549 AUTH_ATTR_RO(authenticate_target);
550 /*
551  * Mutual authentication userid
552  */
553 DEF_NACL_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
554 AUTH_ATTR(userid_mutual, S_IRUGO | S_IWUSR);
555 /*
556  * Mutual authentication password
557  */
558 DEF_NACL_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
559 AUTH_ATTR(password_mutual, S_IRUGO | S_IWUSR);
560 
561 static struct configfs_attribute *lio_target_nacl_auth_attrs[] = {
562 	&iscsi_nacl_auth_userid.attr,
563 	&iscsi_nacl_auth_password.attr,
564 	&iscsi_nacl_auth_authenticate_target.attr,
565 	&iscsi_nacl_auth_userid_mutual.attr,
566 	&iscsi_nacl_auth_password_mutual.attr,
567 	NULL,
568 };
569 
570 /* End items for lio_target_nacl_auth_cit */
571 
572 /* Start items for lio_target_nacl_param_cit */
573 
574 #define DEF_NACL_PARAM(name)						\
575 static ssize_t iscsi_nacl_param_show_##name(				\
576 	struct se_node_acl *se_nacl,					\
577 	char *page)							\
578 {									\
579 	struct iscsi_session *sess;					\
580 	struct se_session *se_sess;					\
581 	ssize_t rb;							\
582 									\
583 	spin_lock_bh(&se_nacl->nacl_sess_lock);				\
584 	se_sess = se_nacl->nacl_sess;					\
585 	if (!se_sess) {							\
586 		rb = snprintf(page, PAGE_SIZE,				\
587 			"No Active iSCSI Session\n");			\
588 	} else {							\
589 		sess = se_sess->fabric_sess_ptr;			\
590 		rb = snprintf(page, PAGE_SIZE, "%u\n",			\
591 			(u32)sess->sess_ops->name);			\
592 	}								\
593 	spin_unlock_bh(&se_nacl->nacl_sess_lock);			\
594 									\
595 	return rb;							\
596 }
597 
598 #define NACL_PARAM_ATTR(_name) TF_NACL_PARAM_ATTR_RO(iscsi, _name);
599 
600 DEF_NACL_PARAM(MaxConnections);
601 NACL_PARAM_ATTR(MaxConnections);
602 
603 DEF_NACL_PARAM(InitialR2T);
604 NACL_PARAM_ATTR(InitialR2T);
605 
606 DEF_NACL_PARAM(ImmediateData);
607 NACL_PARAM_ATTR(ImmediateData);
608 
609 DEF_NACL_PARAM(MaxBurstLength);
610 NACL_PARAM_ATTR(MaxBurstLength);
611 
612 DEF_NACL_PARAM(FirstBurstLength);
613 NACL_PARAM_ATTR(FirstBurstLength);
614 
615 DEF_NACL_PARAM(DefaultTime2Wait);
616 NACL_PARAM_ATTR(DefaultTime2Wait);
617 
618 DEF_NACL_PARAM(DefaultTime2Retain);
619 NACL_PARAM_ATTR(DefaultTime2Retain);
620 
621 DEF_NACL_PARAM(MaxOutstandingR2T);
622 NACL_PARAM_ATTR(MaxOutstandingR2T);
623 
624 DEF_NACL_PARAM(DataPDUInOrder);
625 NACL_PARAM_ATTR(DataPDUInOrder);
626 
627 DEF_NACL_PARAM(DataSequenceInOrder);
628 NACL_PARAM_ATTR(DataSequenceInOrder);
629 
630 DEF_NACL_PARAM(ErrorRecoveryLevel);
631 NACL_PARAM_ATTR(ErrorRecoveryLevel);
632 
633 static struct configfs_attribute *lio_target_nacl_param_attrs[] = {
634 	&iscsi_nacl_param_MaxConnections.attr,
635 	&iscsi_nacl_param_InitialR2T.attr,
636 	&iscsi_nacl_param_ImmediateData.attr,
637 	&iscsi_nacl_param_MaxBurstLength.attr,
638 	&iscsi_nacl_param_FirstBurstLength.attr,
639 	&iscsi_nacl_param_DefaultTime2Wait.attr,
640 	&iscsi_nacl_param_DefaultTime2Retain.attr,
641 	&iscsi_nacl_param_MaxOutstandingR2T.attr,
642 	&iscsi_nacl_param_DataPDUInOrder.attr,
643 	&iscsi_nacl_param_DataSequenceInOrder.attr,
644 	&iscsi_nacl_param_ErrorRecoveryLevel.attr,
645 	NULL,
646 };
647 
648 /* End items for lio_target_nacl_param_cit */
649 
650 /* Start items for lio_target_acl_cit */
651 
652 static ssize_t lio_target_nacl_show_info(
653 	struct se_node_acl *se_nacl,
654 	char *page)
655 {
656 	struct iscsi_session *sess;
657 	struct iscsi_conn *conn;
658 	struct se_session *se_sess;
659 	ssize_t rb = 0;
660 
661 	spin_lock_bh(&se_nacl->nacl_sess_lock);
662 	se_sess = se_nacl->nacl_sess;
663 	if (!se_sess) {
664 		rb += sprintf(page+rb, "No active iSCSI Session for Initiator"
665 			" Endpoint: %s\n", se_nacl->initiatorname);
666 	} else {
667 		sess = se_sess->fabric_sess_ptr;
668 
669 		rb += sprintf(page+rb, "InitiatorName: %s\n",
670 			sess->sess_ops->InitiatorName);
671 		rb += sprintf(page+rb, "InitiatorAlias: %s\n",
672 			sess->sess_ops->InitiatorAlias);
673 
674 		rb += sprintf(page+rb,
675 			      "LIO Session ID: %u   ISID: 0x%6ph  TSIH: %hu  ",
676 			      sess->sid, sess->isid, sess->tsih);
677 		rb += sprintf(page+rb, "SessionType: %s\n",
678 				(sess->sess_ops->SessionType) ?
679 				"Discovery" : "Normal");
680 		rb += sprintf(page+rb, "Session State: ");
681 		switch (sess->session_state) {
682 		case TARG_SESS_STATE_FREE:
683 			rb += sprintf(page+rb, "TARG_SESS_FREE\n");
684 			break;
685 		case TARG_SESS_STATE_ACTIVE:
686 			rb += sprintf(page+rb, "TARG_SESS_STATE_ACTIVE\n");
687 			break;
688 		case TARG_SESS_STATE_LOGGED_IN:
689 			rb += sprintf(page+rb, "TARG_SESS_STATE_LOGGED_IN\n");
690 			break;
691 		case TARG_SESS_STATE_FAILED:
692 			rb += sprintf(page+rb, "TARG_SESS_STATE_FAILED\n");
693 			break;
694 		case TARG_SESS_STATE_IN_CONTINUE:
695 			rb += sprintf(page+rb, "TARG_SESS_STATE_IN_CONTINUE\n");
696 			break;
697 		default:
698 			rb += sprintf(page+rb, "ERROR: Unknown Session"
699 					" State!\n");
700 			break;
701 		}
702 
703 		rb += sprintf(page+rb, "---------------------[iSCSI Session"
704 				" Values]-----------------------\n");
705 		rb += sprintf(page+rb, "  CmdSN/WR  :  CmdSN/WC  :  ExpCmdSN"
706 				"  :  MaxCmdSN  :     ITT    :     TTT\n");
707 		rb += sprintf(page+rb, " 0x%08x   0x%08x   0x%08x   0x%08x"
708 				"   0x%08x   0x%08x\n",
709 			sess->cmdsn_window,
710 			(sess->max_cmd_sn - sess->exp_cmd_sn) + 1,
711 			sess->exp_cmd_sn, sess->max_cmd_sn,
712 			sess->init_task_tag, sess->targ_xfer_tag);
713 		rb += sprintf(page+rb, "----------------------[iSCSI"
714 				" Connections]-------------------------\n");
715 
716 		spin_lock(&sess->conn_lock);
717 		list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
718 			rb += sprintf(page+rb, "CID: %hu  Connection"
719 					" State: ", conn->cid);
720 			switch (conn->conn_state) {
721 			case TARG_CONN_STATE_FREE:
722 				rb += sprintf(page+rb,
723 					"TARG_CONN_STATE_FREE\n");
724 				break;
725 			case TARG_CONN_STATE_XPT_UP:
726 				rb += sprintf(page+rb,
727 					"TARG_CONN_STATE_XPT_UP\n");
728 				break;
729 			case TARG_CONN_STATE_IN_LOGIN:
730 				rb += sprintf(page+rb,
731 					"TARG_CONN_STATE_IN_LOGIN\n");
732 				break;
733 			case TARG_CONN_STATE_LOGGED_IN:
734 				rb += sprintf(page+rb,
735 					"TARG_CONN_STATE_LOGGED_IN\n");
736 				break;
737 			case TARG_CONN_STATE_IN_LOGOUT:
738 				rb += sprintf(page+rb,
739 					"TARG_CONN_STATE_IN_LOGOUT\n");
740 				break;
741 			case TARG_CONN_STATE_LOGOUT_REQUESTED:
742 				rb += sprintf(page+rb,
743 					"TARG_CONN_STATE_LOGOUT_REQUESTED\n");
744 				break;
745 			case TARG_CONN_STATE_CLEANUP_WAIT:
746 				rb += sprintf(page+rb,
747 					"TARG_CONN_STATE_CLEANUP_WAIT\n");
748 				break;
749 			default:
750 				rb += sprintf(page+rb,
751 					"ERROR: Unknown Connection State!\n");
752 				break;
753 			}
754 
755 			rb += sprintf(page+rb, "   Address %s %s", conn->login_ip,
756 				(conn->network_transport == ISCSI_TCP) ?
757 				"TCP" : "SCTP");
758 			rb += sprintf(page+rb, "  StatSN: 0x%08x\n",
759 				conn->stat_sn);
760 		}
761 		spin_unlock(&sess->conn_lock);
762 	}
763 	spin_unlock_bh(&se_nacl->nacl_sess_lock);
764 
765 	return rb;
766 }
767 
768 TF_NACL_BASE_ATTR_RO(lio_target, info);
769 
770 static ssize_t lio_target_nacl_show_cmdsn_depth(
771 	struct se_node_acl *se_nacl,
772 	char *page)
773 {
774 	return sprintf(page, "%u\n", se_nacl->queue_depth);
775 }
776 
777 static ssize_t lio_target_nacl_store_cmdsn_depth(
778 	struct se_node_acl *se_nacl,
779 	const char *page,
780 	size_t count)
781 {
782 	struct se_portal_group *se_tpg = se_nacl->se_tpg;
783 	struct iscsi_portal_group *tpg = container_of(se_tpg,
784 			struct iscsi_portal_group, tpg_se_tpg);
785 	struct config_item *acl_ci, *tpg_ci, *wwn_ci;
786 	u32 cmdsn_depth = 0;
787 	int ret;
788 
789 	ret = kstrtou32(page, 0, &cmdsn_depth);
790 	if (ret)
791 		return ret;
792 	if (cmdsn_depth > TA_DEFAULT_CMDSN_DEPTH_MAX) {
793 		pr_err("Passed cmdsn_depth: %u exceeds"
794 			" TA_DEFAULT_CMDSN_DEPTH_MAX: %u\n", cmdsn_depth,
795 			TA_DEFAULT_CMDSN_DEPTH_MAX);
796 		return -EINVAL;
797 	}
798 	acl_ci = &se_nacl->acl_group.cg_item;
799 	if (!acl_ci) {
800 		pr_err("Unable to locatel acl_ci\n");
801 		return -EINVAL;
802 	}
803 	tpg_ci = &acl_ci->ci_parent->ci_group->cg_item;
804 	if (!tpg_ci) {
805 		pr_err("Unable to locate tpg_ci\n");
806 		return -EINVAL;
807 	}
808 	wwn_ci = &tpg_ci->ci_group->cg_item;
809 	if (!wwn_ci) {
810 		pr_err("Unable to locate config_item wwn_ci\n");
811 		return -EINVAL;
812 	}
813 
814 	if (iscsit_get_tpg(tpg) < 0)
815 		return -EINVAL;
816 	/*
817 	 * iscsit_tpg_set_initiator_node_queue_depth() assumes force=1
818 	 */
819 	ret = iscsit_tpg_set_initiator_node_queue_depth(tpg,
820 				config_item_name(acl_ci), cmdsn_depth, 1);
821 
822 	pr_debug("LIO_Target_ConfigFS: %s/%s Set CmdSN Window: %u for"
823 		"InitiatorName: %s\n", config_item_name(wwn_ci),
824 		config_item_name(tpg_ci), cmdsn_depth,
825 		config_item_name(acl_ci));
826 
827 	iscsit_put_tpg(tpg);
828 	return (!ret) ? count : (ssize_t)ret;
829 }
830 
831 TF_NACL_BASE_ATTR(lio_target, cmdsn_depth, S_IRUGO | S_IWUSR);
832 
833 static ssize_t lio_target_nacl_show_tag(
834 	struct se_node_acl *se_nacl,
835 	char *page)
836 {
837 	return snprintf(page, PAGE_SIZE, "%s", se_nacl->acl_tag);
838 }
839 
840 static ssize_t lio_target_nacl_store_tag(
841 	struct se_node_acl *se_nacl,
842 	const char *page,
843 	size_t count)
844 {
845 	int ret;
846 
847 	ret = core_tpg_set_initiator_node_tag(se_nacl->se_tpg, se_nacl, page);
848 
849 	if (ret < 0)
850 		return ret;
851 	return count;
852 }
853 
854 TF_NACL_BASE_ATTR(lio_target, tag, S_IRUGO | S_IWUSR);
855 
856 static struct configfs_attribute *lio_target_initiator_attrs[] = {
857 	&lio_target_nacl_info.attr,
858 	&lio_target_nacl_cmdsn_depth.attr,
859 	&lio_target_nacl_tag.attr,
860 	NULL,
861 };
862 
863 static int lio_target_init_nodeacl(struct se_node_acl *se_nacl,
864 		const char *name)
865 {
866 	struct iscsi_node_acl *acl =
867 		container_of(se_nacl, struct iscsi_node_acl, se_node_acl);
868 	struct config_group *stats_cg = &se_nacl->acl_fabric_stat_group;
869 
870 	stats_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2,
871 				GFP_KERNEL);
872 	if (!stats_cg->default_groups) {
873 		pr_err("Unable to allocate memory for"
874 				" stats_cg->default_groups\n");
875 		return -ENOMEM;
876 	}
877 
878 	stats_cg->default_groups[0] = &acl->node_stat_grps.iscsi_sess_stats_group;
879 	stats_cg->default_groups[1] = NULL;
880 	config_group_init_type_name(&acl->node_stat_grps.iscsi_sess_stats_group,
881 			"iscsi_sess_stats", &iscsi_stat_sess_cit);
882 
883 	return 0;
884 }
885 
886 static void lio_target_cleanup_nodeacl( struct se_node_acl *se_nacl)
887 {
888 	struct iscsi_node_acl *acl = container_of(se_nacl,
889 			struct iscsi_node_acl, se_node_acl);
890 	struct config_item *df_item;
891 	struct config_group *stats_cg;
892 	int i;
893 
894 	stats_cg = &acl->se_node_acl.acl_fabric_stat_group;
895 	for (i = 0; stats_cg->default_groups[i]; i++) {
896 		df_item = &stats_cg->default_groups[i]->cg_item;
897 		stats_cg->default_groups[i] = NULL;
898 		config_item_put(df_item);
899 	}
900 	kfree(stats_cg->default_groups);
901 }
902 
903 /* End items for lio_target_acl_cit */
904 
905 /* Start items for lio_target_tpg_attrib_cit */
906 
907 #define DEF_TPG_ATTRIB(name)						\
908 									\
909 static ssize_t iscsi_tpg_attrib_show_##name(				\
910 	struct se_portal_group *se_tpg,				\
911 	char *page)							\
912 {									\
913 	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
914 			struct iscsi_portal_group, tpg_se_tpg);	\
915 	ssize_t rb;							\
916 									\
917 	if (iscsit_get_tpg(tpg) < 0)					\
918 		return -EINVAL;						\
919 									\
920 	rb = sprintf(page, "%u\n", tpg->tpg_attrib.name);		\
921 	iscsit_put_tpg(tpg);						\
922 	return rb;							\
923 }									\
924 									\
925 static ssize_t iscsi_tpg_attrib_store_##name(				\
926 	struct se_portal_group *se_tpg,				\
927 	const char *page,						\
928 	size_t count)							\
929 {									\
930 	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
931 			struct iscsi_portal_group, tpg_se_tpg);	\
932 	u32 val;							\
933 	int ret;							\
934 									\
935 	if (iscsit_get_tpg(tpg) < 0)					\
936 		return -EINVAL;						\
937 									\
938 	ret = kstrtou32(page, 0, &val);					\
939 	if (ret)							\
940 		goto out;						\
941 	ret = iscsit_ta_##name(tpg, val);				\
942 	if (ret < 0)							\
943 		goto out;						\
944 									\
945 	iscsit_put_tpg(tpg);						\
946 	return count;							\
947 out:									\
948 	iscsit_put_tpg(tpg);						\
949 	return ret;							\
950 }
951 
952 #define TPG_ATTR(_name, _mode) TF_TPG_ATTRIB_ATTR(iscsi, _name, _mode);
953 
954 /*
955  * Define iscsi_tpg_attrib_s_authentication
956  */
957 DEF_TPG_ATTRIB(authentication);
958 TPG_ATTR(authentication, S_IRUGO | S_IWUSR);
959 /*
960  * Define iscsi_tpg_attrib_s_login_timeout
961  */
962 DEF_TPG_ATTRIB(login_timeout);
963 TPG_ATTR(login_timeout, S_IRUGO | S_IWUSR);
964 /*
965  * Define iscsi_tpg_attrib_s_netif_timeout
966  */
967 DEF_TPG_ATTRIB(netif_timeout);
968 TPG_ATTR(netif_timeout, S_IRUGO | S_IWUSR);
969 /*
970  * Define iscsi_tpg_attrib_s_generate_node_acls
971  */
972 DEF_TPG_ATTRIB(generate_node_acls);
973 TPG_ATTR(generate_node_acls, S_IRUGO | S_IWUSR);
974 /*
975  * Define iscsi_tpg_attrib_s_default_cmdsn_depth
976  */
977 DEF_TPG_ATTRIB(default_cmdsn_depth);
978 TPG_ATTR(default_cmdsn_depth, S_IRUGO | S_IWUSR);
979 /*
980  Define iscsi_tpg_attrib_s_cache_dynamic_acls
981  */
982 DEF_TPG_ATTRIB(cache_dynamic_acls);
983 TPG_ATTR(cache_dynamic_acls, S_IRUGO | S_IWUSR);
984 /*
985  * Define iscsi_tpg_attrib_s_demo_mode_write_protect
986  */
987 DEF_TPG_ATTRIB(demo_mode_write_protect);
988 TPG_ATTR(demo_mode_write_protect, S_IRUGO | S_IWUSR);
989 /*
990  * Define iscsi_tpg_attrib_s_prod_mode_write_protect
991  */
992 DEF_TPG_ATTRIB(prod_mode_write_protect);
993 TPG_ATTR(prod_mode_write_protect, S_IRUGO | S_IWUSR);
994 /*
995  * Define iscsi_tpg_attrib_s_demo_mode_discovery,
996  */
997 DEF_TPG_ATTRIB(demo_mode_discovery);
998 TPG_ATTR(demo_mode_discovery, S_IRUGO | S_IWUSR);
999 /*
1000  * Define iscsi_tpg_attrib_s_default_erl
1001  */
1002 DEF_TPG_ATTRIB(default_erl);
1003 TPG_ATTR(default_erl, S_IRUGO | S_IWUSR);
1004 /*
1005  * Define iscsi_tpg_attrib_s_t10_pi
1006  */
1007 DEF_TPG_ATTRIB(t10_pi);
1008 TPG_ATTR(t10_pi, S_IRUGO | S_IWUSR);
1009 /*
1010  * Define iscsi_tpg_attrib_s_fabric_prot_type
1011  */
1012 DEF_TPG_ATTRIB(fabric_prot_type);
1013 TPG_ATTR(fabric_prot_type, S_IRUGO | S_IWUSR);
1014 
1015 static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
1016 	&iscsi_tpg_attrib_authentication.attr,
1017 	&iscsi_tpg_attrib_login_timeout.attr,
1018 	&iscsi_tpg_attrib_netif_timeout.attr,
1019 	&iscsi_tpg_attrib_generate_node_acls.attr,
1020 	&iscsi_tpg_attrib_default_cmdsn_depth.attr,
1021 	&iscsi_tpg_attrib_cache_dynamic_acls.attr,
1022 	&iscsi_tpg_attrib_demo_mode_write_protect.attr,
1023 	&iscsi_tpg_attrib_prod_mode_write_protect.attr,
1024 	&iscsi_tpg_attrib_demo_mode_discovery.attr,
1025 	&iscsi_tpg_attrib_default_erl.attr,
1026 	&iscsi_tpg_attrib_t10_pi.attr,
1027 	&iscsi_tpg_attrib_fabric_prot_type.attr,
1028 	NULL,
1029 };
1030 
1031 /* End items for lio_target_tpg_attrib_cit */
1032 
1033 /* Start items for lio_target_tpg_auth_cit */
1034 
1035 #define __DEF_TPG_AUTH_STR(prefix, name, flags)					\
1036 static ssize_t __iscsi_##prefix##_show_##name(					\
1037 	struct se_portal_group *se_tpg,						\
1038 	char *page)								\
1039 {										\
1040 	struct iscsi_portal_group *tpg = container_of(se_tpg,			\
1041 				struct iscsi_portal_group, tpg_se_tpg);		\
1042 	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
1043 										\
1044 	if (!capable(CAP_SYS_ADMIN))						\
1045 		return -EPERM;							\
1046 										\
1047 	return snprintf(page, PAGE_SIZE, "%s\n", auth->name);			\
1048 }										\
1049 										\
1050 static ssize_t __iscsi_##prefix##_store_##name(					\
1051 	struct se_portal_group *se_tpg,						\
1052 	const char *page,							\
1053 	size_t count)								\
1054 {										\
1055 	struct iscsi_portal_group *tpg = container_of(se_tpg,			\
1056 				struct iscsi_portal_group, tpg_se_tpg);		\
1057 	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
1058 										\
1059 	if (!capable(CAP_SYS_ADMIN))						\
1060 		return -EPERM;							\
1061 										\
1062 	snprintf(auth->name, sizeof(auth->name), "%s", page);			\
1063 	if (!(strncmp("NULL", auth->name, 4)))					\
1064 		auth->naf_flags &= ~flags;					\
1065 	else									\
1066 		auth->naf_flags |= flags;					\
1067 										\
1068 	if ((auth->naf_flags & NAF_USERID_IN_SET) &&				\
1069 	    (auth->naf_flags & NAF_PASSWORD_IN_SET))				\
1070 		auth->authenticate_target = 1;					\
1071 	else									\
1072 		auth->authenticate_target = 0;					\
1073 										\
1074 	return count;								\
1075 }
1076 
1077 #define __DEF_TPG_AUTH_INT(prefix, name)					\
1078 static ssize_t __iscsi_##prefix##_show_##name(					\
1079 	struct se_portal_group *se_tpg,						\
1080 	char *page)								\
1081 {										\
1082 	struct iscsi_portal_group *tpg = container_of(se_tpg,			\
1083 				struct iscsi_portal_group, tpg_se_tpg);		\
1084 	struct iscsi_node_auth *auth = &tpg->tpg_demo_auth;			\
1085 										\
1086 	if (!capable(CAP_SYS_ADMIN))						\
1087 		return -EPERM;							\
1088 										\
1089 	return snprintf(page, PAGE_SIZE, "%d\n", auth->name);			\
1090 }
1091 
1092 #define DEF_TPG_AUTH_STR(name, flags)						\
1093 	__DEF_TPG_AUTH_STR(tpg_auth, name, flags)				\
1094 static ssize_t iscsi_tpg_auth_show_##name(					\
1095 	struct se_portal_group *se_tpg,						\
1096 	char *page)								\
1097 {										\
1098 	return __iscsi_tpg_auth_show_##name(se_tpg, page);			\
1099 }										\
1100 										\
1101 static ssize_t iscsi_tpg_auth_store_##name(					\
1102 	struct se_portal_group *se_tpg,						\
1103 	const char *page,							\
1104 	size_t count)								\
1105 {										\
1106 	return __iscsi_tpg_auth_store_##name(se_tpg, page, count);		\
1107 }
1108 
1109 #define DEF_TPG_AUTH_INT(name)							\
1110 	__DEF_TPG_AUTH_INT(tpg_auth, name)					\
1111 static ssize_t iscsi_tpg_auth_show_##name(					\
1112 	struct se_portal_group *se_tpg,						\
1113 	char *page)								\
1114 {										\
1115 	return __iscsi_tpg_auth_show_##name(se_tpg, page);			\
1116 }
1117 
1118 #define TPG_AUTH_ATTR(_name, _mode) TF_TPG_AUTH_ATTR(iscsi, _name, _mode);
1119 #define TPG_AUTH_ATTR_RO(_name) TF_TPG_AUTH_ATTR_RO(iscsi, _name);
1120 
1121 /*
1122  *  * One-way authentication userid
1123  *   */
1124 DEF_TPG_AUTH_STR(userid, NAF_USERID_SET);
1125 TPG_AUTH_ATTR(userid, S_IRUGO | S_IWUSR);
1126 /*
1127  *  * One-way authentication password
1128  *   */
1129 DEF_TPG_AUTH_STR(password, NAF_PASSWORD_SET);
1130 TPG_AUTH_ATTR(password, S_IRUGO | S_IWUSR);
1131 /*
1132  *  * Enforce mutual authentication
1133  *   */
1134 DEF_TPG_AUTH_INT(authenticate_target);
1135 TPG_AUTH_ATTR_RO(authenticate_target);
1136 /*
1137  *  * Mutual authentication userid
1138  *   */
1139 DEF_TPG_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
1140 TPG_AUTH_ATTR(userid_mutual, S_IRUGO | S_IWUSR);
1141 /*
1142  *  * Mutual authentication password
1143  *   */
1144 DEF_TPG_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
1145 TPG_AUTH_ATTR(password_mutual, S_IRUGO | S_IWUSR);
1146 
1147 static struct configfs_attribute *lio_target_tpg_auth_attrs[] = {
1148 	&iscsi_tpg_auth_userid.attr,
1149 	&iscsi_tpg_auth_password.attr,
1150 	&iscsi_tpg_auth_authenticate_target.attr,
1151 	&iscsi_tpg_auth_userid_mutual.attr,
1152 	&iscsi_tpg_auth_password_mutual.attr,
1153 	NULL,
1154 };
1155 
1156 /* End items for lio_target_tpg_auth_cit */
1157 
1158 /* Start items for lio_target_tpg_param_cit */
1159 
1160 #define DEF_TPG_PARAM(name)						\
1161 static ssize_t iscsi_tpg_param_show_##name(				\
1162 	struct se_portal_group *se_tpg,					\
1163 	char *page)							\
1164 {									\
1165 	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
1166 			struct iscsi_portal_group, tpg_se_tpg);		\
1167 	struct iscsi_param *param;					\
1168 	ssize_t rb;							\
1169 									\
1170 	if (iscsit_get_tpg(tpg) < 0)					\
1171 		return -EINVAL;						\
1172 									\
1173 	param = iscsi_find_param_from_key(__stringify(name),		\
1174 				tpg->param_list);			\
1175 	if (!param) {							\
1176 		iscsit_put_tpg(tpg);					\
1177 		return -EINVAL;						\
1178 	}								\
1179 	rb = snprintf(page, PAGE_SIZE, "%s\n", param->value);		\
1180 									\
1181 	iscsit_put_tpg(tpg);						\
1182 	return rb;							\
1183 }									\
1184 static ssize_t iscsi_tpg_param_store_##name(				\
1185 	struct se_portal_group *se_tpg,				\
1186 	const char *page,						\
1187 	size_t count)							\
1188 {									\
1189 	struct iscsi_portal_group *tpg = container_of(se_tpg,		\
1190 			struct iscsi_portal_group, tpg_se_tpg);		\
1191 	char *buf;							\
1192 	int ret, len;							\
1193 									\
1194 	buf = kzalloc(PAGE_SIZE, GFP_KERNEL);				\
1195 	if (!buf)							\
1196 		return -ENOMEM;						\
1197 	len = snprintf(buf, PAGE_SIZE, "%s=%s", __stringify(name), page);	\
1198 	if (isspace(buf[len-1]))					\
1199 		buf[len-1] = '\0'; /* Kill newline */			\
1200 									\
1201 	if (iscsit_get_tpg(tpg) < 0) {					\
1202 		kfree(buf);						\
1203 		return -EINVAL;						\
1204 	}								\
1205 									\
1206 	ret = iscsi_change_param_value(buf, tpg->param_list, 1);	\
1207 	if (ret < 0)							\
1208 		goto out;						\
1209 									\
1210 	kfree(buf);							\
1211 	iscsit_put_tpg(tpg);						\
1212 	return count;							\
1213 out:									\
1214 	kfree(buf);							\
1215 	iscsit_put_tpg(tpg);						\
1216 	return -EINVAL;						\
1217 }
1218 
1219 #define TPG_PARAM_ATTR(_name, _mode) TF_TPG_PARAM_ATTR(iscsi, _name, _mode);
1220 
1221 DEF_TPG_PARAM(AuthMethod);
1222 TPG_PARAM_ATTR(AuthMethod, S_IRUGO | S_IWUSR);
1223 
1224 DEF_TPG_PARAM(HeaderDigest);
1225 TPG_PARAM_ATTR(HeaderDigest, S_IRUGO | S_IWUSR);
1226 
1227 DEF_TPG_PARAM(DataDigest);
1228 TPG_PARAM_ATTR(DataDigest, S_IRUGO | S_IWUSR);
1229 
1230 DEF_TPG_PARAM(MaxConnections);
1231 TPG_PARAM_ATTR(MaxConnections, S_IRUGO | S_IWUSR);
1232 
1233 DEF_TPG_PARAM(TargetAlias);
1234 TPG_PARAM_ATTR(TargetAlias, S_IRUGO | S_IWUSR);
1235 
1236 DEF_TPG_PARAM(InitialR2T);
1237 TPG_PARAM_ATTR(InitialR2T, S_IRUGO | S_IWUSR);
1238 
1239 DEF_TPG_PARAM(ImmediateData);
1240 TPG_PARAM_ATTR(ImmediateData, S_IRUGO | S_IWUSR);
1241 
1242 DEF_TPG_PARAM(MaxRecvDataSegmentLength);
1243 TPG_PARAM_ATTR(MaxRecvDataSegmentLength, S_IRUGO | S_IWUSR);
1244 
1245 DEF_TPG_PARAM(MaxXmitDataSegmentLength);
1246 TPG_PARAM_ATTR(MaxXmitDataSegmentLength, S_IRUGO | S_IWUSR);
1247 
1248 DEF_TPG_PARAM(MaxBurstLength);
1249 TPG_PARAM_ATTR(MaxBurstLength, S_IRUGO | S_IWUSR);
1250 
1251 DEF_TPG_PARAM(FirstBurstLength);
1252 TPG_PARAM_ATTR(FirstBurstLength, S_IRUGO | S_IWUSR);
1253 
1254 DEF_TPG_PARAM(DefaultTime2Wait);
1255 TPG_PARAM_ATTR(DefaultTime2Wait, S_IRUGO | S_IWUSR);
1256 
1257 DEF_TPG_PARAM(DefaultTime2Retain);
1258 TPG_PARAM_ATTR(DefaultTime2Retain, S_IRUGO | S_IWUSR);
1259 
1260 DEF_TPG_PARAM(MaxOutstandingR2T);
1261 TPG_PARAM_ATTR(MaxOutstandingR2T, S_IRUGO | S_IWUSR);
1262 
1263 DEF_TPG_PARAM(DataPDUInOrder);
1264 TPG_PARAM_ATTR(DataPDUInOrder, S_IRUGO | S_IWUSR);
1265 
1266 DEF_TPG_PARAM(DataSequenceInOrder);
1267 TPG_PARAM_ATTR(DataSequenceInOrder, S_IRUGO | S_IWUSR);
1268 
1269 DEF_TPG_PARAM(ErrorRecoveryLevel);
1270 TPG_PARAM_ATTR(ErrorRecoveryLevel, S_IRUGO | S_IWUSR);
1271 
1272 DEF_TPG_PARAM(IFMarker);
1273 TPG_PARAM_ATTR(IFMarker, S_IRUGO | S_IWUSR);
1274 
1275 DEF_TPG_PARAM(OFMarker);
1276 TPG_PARAM_ATTR(OFMarker, S_IRUGO | S_IWUSR);
1277 
1278 DEF_TPG_PARAM(IFMarkInt);
1279 TPG_PARAM_ATTR(IFMarkInt, S_IRUGO | S_IWUSR);
1280 
1281 DEF_TPG_PARAM(OFMarkInt);
1282 TPG_PARAM_ATTR(OFMarkInt, S_IRUGO | S_IWUSR);
1283 
1284 static struct configfs_attribute *lio_target_tpg_param_attrs[] = {
1285 	&iscsi_tpg_param_AuthMethod.attr,
1286 	&iscsi_tpg_param_HeaderDigest.attr,
1287 	&iscsi_tpg_param_DataDigest.attr,
1288 	&iscsi_tpg_param_MaxConnections.attr,
1289 	&iscsi_tpg_param_TargetAlias.attr,
1290 	&iscsi_tpg_param_InitialR2T.attr,
1291 	&iscsi_tpg_param_ImmediateData.attr,
1292 	&iscsi_tpg_param_MaxRecvDataSegmentLength.attr,
1293 	&iscsi_tpg_param_MaxXmitDataSegmentLength.attr,
1294 	&iscsi_tpg_param_MaxBurstLength.attr,
1295 	&iscsi_tpg_param_FirstBurstLength.attr,
1296 	&iscsi_tpg_param_DefaultTime2Wait.attr,
1297 	&iscsi_tpg_param_DefaultTime2Retain.attr,
1298 	&iscsi_tpg_param_MaxOutstandingR2T.attr,
1299 	&iscsi_tpg_param_DataPDUInOrder.attr,
1300 	&iscsi_tpg_param_DataSequenceInOrder.attr,
1301 	&iscsi_tpg_param_ErrorRecoveryLevel.attr,
1302 	&iscsi_tpg_param_IFMarker.attr,
1303 	&iscsi_tpg_param_OFMarker.attr,
1304 	&iscsi_tpg_param_IFMarkInt.attr,
1305 	&iscsi_tpg_param_OFMarkInt.attr,
1306 	NULL,
1307 };
1308 
1309 /* End items for lio_target_tpg_param_cit */
1310 
1311 /* Start items for lio_target_tpg_cit */
1312 
1313 static ssize_t lio_target_tpg_show_enable(
1314 	struct se_portal_group *se_tpg,
1315 	char *page)
1316 {
1317 	struct iscsi_portal_group *tpg = container_of(se_tpg,
1318 			struct iscsi_portal_group, tpg_se_tpg);
1319 	ssize_t len;
1320 
1321 	spin_lock(&tpg->tpg_state_lock);
1322 	len = sprintf(page, "%d\n",
1323 			(tpg->tpg_state == TPG_STATE_ACTIVE) ? 1 : 0);
1324 	spin_unlock(&tpg->tpg_state_lock);
1325 
1326 	return len;
1327 }
1328 
1329 static ssize_t lio_target_tpg_store_enable(
1330 	struct se_portal_group *se_tpg,
1331 	const char *page,
1332 	size_t count)
1333 {
1334 	struct iscsi_portal_group *tpg = container_of(se_tpg,
1335 			struct iscsi_portal_group, tpg_se_tpg);
1336 	u32 op;
1337 	int ret;
1338 
1339 	ret = kstrtou32(page, 0, &op);
1340 	if (ret)
1341 		return ret;
1342 	if ((op != 1) && (op != 0)) {
1343 		pr_err("Illegal value for tpg_enable: %u\n", op);
1344 		return -EINVAL;
1345 	}
1346 
1347 	ret = iscsit_get_tpg(tpg);
1348 	if (ret < 0)
1349 		return -EINVAL;
1350 
1351 	if (op) {
1352 		ret = iscsit_tpg_enable_portal_group(tpg);
1353 		if (ret < 0)
1354 			goto out;
1355 	} else {
1356 		/*
1357 		 * iscsit_tpg_disable_portal_group() assumes force=1
1358 		 */
1359 		ret = iscsit_tpg_disable_portal_group(tpg, 1);
1360 		if (ret < 0)
1361 			goto out;
1362 	}
1363 
1364 	iscsit_put_tpg(tpg);
1365 	return count;
1366 out:
1367 	iscsit_put_tpg(tpg);
1368 	return -EINVAL;
1369 }
1370 
1371 TF_TPG_BASE_ATTR(lio_target, enable, S_IRUGO | S_IWUSR);
1372 
1373 static ssize_t lio_target_tpg_show_dynamic_sessions(
1374 	struct se_portal_group *se_tpg,
1375 	char *page)
1376 {
1377 	return target_show_dynamic_sessions(se_tpg, page);
1378 }
1379 
1380 TF_TPG_BASE_ATTR_RO(lio_target, dynamic_sessions);
1381 
1382 static struct configfs_attribute *lio_target_tpg_attrs[] = {
1383 	&lio_target_tpg_enable.attr,
1384 	&lio_target_tpg_dynamic_sessions.attr,
1385 	NULL,
1386 };
1387 
1388 /* End items for lio_target_tpg_cit */
1389 
1390 /* Start items for lio_target_tiqn_cit */
1391 
1392 static struct se_portal_group *lio_target_tiqn_addtpg(
1393 	struct se_wwn *wwn,
1394 	struct config_group *group,
1395 	const char *name)
1396 {
1397 	struct iscsi_portal_group *tpg;
1398 	struct iscsi_tiqn *tiqn;
1399 	char *tpgt_str;
1400 	int ret;
1401 	u16 tpgt;
1402 
1403 	tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
1404 	/*
1405 	 * Only tpgt_# directory groups can be created below
1406 	 * target/iscsi/iqn.superturodiskarry/
1407 	 */
1408 	tpgt_str = strstr(name, "tpgt_");
1409 	if (!tpgt_str) {
1410 		pr_err("Unable to locate \"tpgt_#\" directory"
1411 				" group\n");
1412 		return NULL;
1413 	}
1414 	tpgt_str += 5; /* Skip ahead of "tpgt_" */
1415 	ret = kstrtou16(tpgt_str, 0, &tpgt);
1416 	if (ret)
1417 		return NULL;
1418 
1419 	tpg = iscsit_alloc_portal_group(tiqn, tpgt);
1420 	if (!tpg)
1421 		return NULL;
1422 
1423 	ret = core_tpg_register(&iscsi_ops, wwn, &tpg->tpg_se_tpg,
1424 				tpg, TRANSPORT_TPG_TYPE_NORMAL);
1425 	if (ret < 0)
1426 		return NULL;
1427 
1428 	ret = iscsit_tpg_add_portal_group(tiqn, tpg);
1429 	if (ret != 0)
1430 		goto out;
1431 
1432 	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
1433 	pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated TPG: %s\n",
1434 			name);
1435 	return &tpg->tpg_se_tpg;
1436 out:
1437 	core_tpg_deregister(&tpg->tpg_se_tpg);
1438 	kfree(tpg);
1439 	return NULL;
1440 }
1441 
1442 static void lio_target_tiqn_deltpg(struct se_portal_group *se_tpg)
1443 {
1444 	struct iscsi_portal_group *tpg;
1445 	struct iscsi_tiqn *tiqn;
1446 
1447 	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
1448 	tiqn = tpg->tpg_tiqn;
1449 	/*
1450 	 * iscsit_tpg_del_portal_group() assumes force=1
1451 	 */
1452 	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> Releasing TPG\n");
1453 	iscsit_tpg_del_portal_group(tiqn, tpg, 1);
1454 }
1455 
1456 /* End items for lio_target_tiqn_cit */
1457 
1458 /* Start LIO-Target TIQN struct contig_item lio_target_cit */
1459 
1460 static ssize_t lio_target_wwn_show_attr_lio_version(
1461 	struct target_fabric_configfs *tf,
1462 	char *page)
1463 {
1464 	return sprintf(page, "Datera Inc. iSCSI Target "ISCSIT_VERSION"\n");
1465 }
1466 
1467 TF_WWN_ATTR_RO(lio_target, lio_version);
1468 
1469 static struct configfs_attribute *lio_target_wwn_attrs[] = {
1470 	&lio_target_wwn_lio_version.attr,
1471 	NULL,
1472 };
1473 
1474 static struct se_wwn *lio_target_call_coreaddtiqn(
1475 	struct target_fabric_configfs *tf,
1476 	struct config_group *group,
1477 	const char *name)
1478 {
1479 	struct config_group *stats_cg;
1480 	struct iscsi_tiqn *tiqn;
1481 
1482 	tiqn = iscsit_add_tiqn((unsigned char *)name);
1483 	if (IS_ERR(tiqn))
1484 		return ERR_CAST(tiqn);
1485 	/*
1486 	 * Setup struct iscsi_wwn_stat_grps for se_wwn->fabric_stat_group.
1487 	 */
1488 	stats_cg = &tiqn->tiqn_wwn.fabric_stat_group;
1489 
1490 	stats_cg->default_groups = kmalloc(sizeof(struct config_group *) * 6,
1491 				GFP_KERNEL);
1492 	if (!stats_cg->default_groups) {
1493 		pr_err("Unable to allocate memory for"
1494 				" stats_cg->default_groups\n");
1495 		iscsit_del_tiqn(tiqn);
1496 		return ERR_PTR(-ENOMEM);
1497 	}
1498 
1499 	stats_cg->default_groups[0] = &tiqn->tiqn_stat_grps.iscsi_instance_group;
1500 	stats_cg->default_groups[1] = &tiqn->tiqn_stat_grps.iscsi_sess_err_group;
1501 	stats_cg->default_groups[2] = &tiqn->tiqn_stat_grps.iscsi_tgt_attr_group;
1502 	stats_cg->default_groups[3] = &tiqn->tiqn_stat_grps.iscsi_login_stats_group;
1503 	stats_cg->default_groups[4] = &tiqn->tiqn_stat_grps.iscsi_logout_stats_group;
1504 	stats_cg->default_groups[5] = NULL;
1505 	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group,
1506 			"iscsi_instance", &iscsi_stat_instance_cit);
1507 	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
1508 			"iscsi_sess_err", &iscsi_stat_sess_err_cit);
1509 	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
1510 			"iscsi_tgt_attr", &iscsi_stat_tgt_attr_cit);
1511 	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
1512 			"iscsi_login_stats", &iscsi_stat_login_cit);
1513 	config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
1514 			"iscsi_logout_stats", &iscsi_stat_logout_cit);
1515 
1516 	pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
1517 	pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:"
1518 			" %s\n", name);
1519 	return &tiqn->tiqn_wwn;
1520 }
1521 
1522 static void lio_target_call_coredeltiqn(
1523 	struct se_wwn *wwn)
1524 {
1525 	struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
1526 	struct config_item *df_item;
1527 	struct config_group *stats_cg;
1528 	int i;
1529 
1530 	stats_cg = &tiqn->tiqn_wwn.fabric_stat_group;
1531 	for (i = 0; stats_cg->default_groups[i]; i++) {
1532 		df_item = &stats_cg->default_groups[i]->cg_item;
1533 		stats_cg->default_groups[i] = NULL;
1534 		config_item_put(df_item);
1535 	}
1536 	kfree(stats_cg->default_groups);
1537 
1538 	pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n",
1539 			tiqn->tiqn);
1540 	iscsit_del_tiqn(tiqn);
1541 }
1542 
1543 /* End LIO-Target TIQN struct contig_lio_target_cit */
1544 
1545 /* Start lio_target_discovery_auth_cit */
1546 
1547 #define DEF_DISC_AUTH_STR(name, flags)					\
1548 	__DEF_NACL_AUTH_STR(disc, name, flags)				\
1549 static ssize_t iscsi_disc_show_##name(					\
1550 	struct target_fabric_configfs *tf,				\
1551 	char *page)							\
1552 {									\
1553 	return __iscsi_disc_show_##name(&iscsit_global->discovery_acl,	\
1554 		page);							\
1555 }									\
1556 static ssize_t iscsi_disc_store_##name(					\
1557 	struct target_fabric_configfs *tf,				\
1558 	const char *page,						\
1559 	size_t count)							\
1560 {									\
1561 	return __iscsi_disc_store_##name(&iscsit_global->discovery_acl,	\
1562 		page, count);						\
1563 }
1564 
1565 #define DEF_DISC_AUTH_INT(name)						\
1566 	__DEF_NACL_AUTH_INT(disc, name)					\
1567 static ssize_t iscsi_disc_show_##name(					\
1568 	struct target_fabric_configfs *tf,				\
1569 	char *page)							\
1570 {									\
1571 	return __iscsi_disc_show_##name(&iscsit_global->discovery_acl,	\
1572 			page);						\
1573 }
1574 
1575 #define DISC_AUTH_ATTR(_name, _mode) TF_DISC_ATTR(iscsi, _name, _mode)
1576 #define DISC_AUTH_ATTR_RO(_name) TF_DISC_ATTR_RO(iscsi, _name)
1577 
1578 /*
1579  * One-way authentication userid
1580  */
1581 DEF_DISC_AUTH_STR(userid, NAF_USERID_SET);
1582 DISC_AUTH_ATTR(userid, S_IRUGO | S_IWUSR);
1583 /*
1584  * One-way authentication password
1585  */
1586 DEF_DISC_AUTH_STR(password, NAF_PASSWORD_SET);
1587 DISC_AUTH_ATTR(password, S_IRUGO | S_IWUSR);
1588 /*
1589  * Enforce mutual authentication
1590  */
1591 DEF_DISC_AUTH_INT(authenticate_target);
1592 DISC_AUTH_ATTR_RO(authenticate_target);
1593 /*
1594  * Mutual authentication userid
1595  */
1596 DEF_DISC_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
1597 DISC_AUTH_ATTR(userid_mutual, S_IRUGO | S_IWUSR);
1598 /*
1599  * Mutual authentication password
1600  */
1601 DEF_DISC_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
1602 DISC_AUTH_ATTR(password_mutual, S_IRUGO | S_IWUSR);
1603 
1604 /*
1605  * enforce_discovery_auth
1606  */
1607 static ssize_t iscsi_disc_show_enforce_discovery_auth(
1608 	struct target_fabric_configfs *tf,
1609 	char *page)
1610 {
1611 	struct iscsi_node_auth *discovery_auth = &iscsit_global->discovery_acl.node_auth;
1612 
1613 	return sprintf(page, "%d\n", discovery_auth->enforce_discovery_auth);
1614 }
1615 
1616 static ssize_t iscsi_disc_store_enforce_discovery_auth(
1617 	struct target_fabric_configfs *tf,
1618 	const char *page,
1619 	size_t count)
1620 {
1621 	struct iscsi_param *param;
1622 	struct iscsi_portal_group *discovery_tpg = iscsit_global->discovery_tpg;
1623 	u32 op;
1624 	int err;
1625 
1626 	err = kstrtou32(page, 0, &op);
1627 	if (err)
1628 		return -EINVAL;
1629 	if ((op != 1) && (op != 0)) {
1630 		pr_err("Illegal value for enforce_discovery_auth:"
1631 				" %u\n", op);
1632 		return -EINVAL;
1633 	}
1634 
1635 	if (!discovery_tpg) {
1636 		pr_err("iscsit_global->discovery_tpg is NULL\n");
1637 		return -EINVAL;
1638 	}
1639 
1640 	param = iscsi_find_param_from_key(AUTHMETHOD,
1641 				discovery_tpg->param_list);
1642 	if (!param)
1643 		return -EINVAL;
1644 
1645 	if (op) {
1646 		/*
1647 		 * Reset the AuthMethod key to CHAP.
1648 		 */
1649 		if (iscsi_update_param_value(param, CHAP) < 0)
1650 			return -EINVAL;
1651 
1652 		discovery_tpg->tpg_attrib.authentication = 1;
1653 		iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 1;
1654 		pr_debug("LIO-CORE[0] Successfully enabled"
1655 			" authentication enforcement for iSCSI"
1656 			" Discovery TPG\n");
1657 	} else {
1658 		/*
1659 		 * Reset the AuthMethod key to CHAP,None
1660 		 */
1661 		if (iscsi_update_param_value(param, "CHAP,None") < 0)
1662 			return -EINVAL;
1663 
1664 		discovery_tpg->tpg_attrib.authentication = 0;
1665 		iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 0;
1666 		pr_debug("LIO-CORE[0] Successfully disabled"
1667 			" authentication enforcement for iSCSI"
1668 			" Discovery TPG\n");
1669 	}
1670 
1671 	return count;
1672 }
1673 
1674 DISC_AUTH_ATTR(enforce_discovery_auth, S_IRUGO | S_IWUSR);
1675 
1676 static struct configfs_attribute *lio_target_discovery_auth_attrs[] = {
1677 	&iscsi_disc_userid.attr,
1678 	&iscsi_disc_password.attr,
1679 	&iscsi_disc_authenticate_target.attr,
1680 	&iscsi_disc_userid_mutual.attr,
1681 	&iscsi_disc_password_mutual.attr,
1682 	&iscsi_disc_enforce_discovery_auth.attr,
1683 	NULL,
1684 };
1685 
1686 /* End lio_target_discovery_auth_cit */
1687 
1688 /* Start functions for target_core_fabric_ops */
1689 
1690 static char *iscsi_get_fabric_name(void)
1691 {
1692 	return "iSCSI";
1693 }
1694 
1695 static u32 iscsi_get_task_tag(struct se_cmd *se_cmd)
1696 {
1697 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1698 
1699 	/* only used for printks or comparism with ->ref_task_tag */
1700 	return (__force u32)cmd->init_task_tag;
1701 }
1702 
1703 static int iscsi_get_cmd_state(struct se_cmd *se_cmd)
1704 {
1705 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1706 
1707 	return cmd->i_state;
1708 }
1709 
1710 static u32 lio_sess_get_index(struct se_session *se_sess)
1711 {
1712 	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1713 
1714 	return sess->session_index;
1715 }
1716 
1717 static u32 lio_sess_get_initiator_sid(
1718 	struct se_session *se_sess,
1719 	unsigned char *buf,
1720 	u32 size)
1721 {
1722 	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1723 	/*
1724 	 * iSCSI Initiator Session Identifier from RFC-3720.
1725 	 */
1726 	return snprintf(buf, size, "%6phN", sess->isid);
1727 }
1728 
1729 static int lio_queue_data_in(struct se_cmd *se_cmd)
1730 {
1731 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1732 
1733 	cmd->i_state = ISTATE_SEND_DATAIN;
1734 	cmd->conn->conn_transport->iscsit_queue_data_in(cmd->conn, cmd);
1735 
1736 	return 0;
1737 }
1738 
1739 static int lio_write_pending(struct se_cmd *se_cmd)
1740 {
1741 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1742 	struct iscsi_conn *conn = cmd->conn;
1743 
1744 	if (!cmd->immediate_data && !cmd->unsolicited_data)
1745 		return conn->conn_transport->iscsit_get_dataout(conn, cmd, false);
1746 
1747 	return 0;
1748 }
1749 
1750 static int lio_write_pending_status(struct se_cmd *se_cmd)
1751 {
1752 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1753 	int ret;
1754 
1755 	spin_lock_bh(&cmd->istate_lock);
1756 	ret = !(cmd->cmd_flags & ICF_GOT_LAST_DATAOUT);
1757 	spin_unlock_bh(&cmd->istate_lock);
1758 
1759 	return ret;
1760 }
1761 
1762 static int lio_queue_status(struct se_cmd *se_cmd)
1763 {
1764 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1765 
1766 	cmd->i_state = ISTATE_SEND_STATUS;
1767 
1768 	if (cmd->se_cmd.scsi_status || cmd->sense_reason) {
1769 		iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state);
1770 		return 0;
1771 	}
1772 	cmd->conn->conn_transport->iscsit_queue_status(cmd->conn, cmd);
1773 
1774 	return 0;
1775 }
1776 
1777 static void lio_queue_tm_rsp(struct se_cmd *se_cmd)
1778 {
1779 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1780 
1781 	cmd->i_state = ISTATE_SEND_TASKMGTRSP;
1782 	iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state);
1783 }
1784 
1785 static void lio_aborted_task(struct se_cmd *se_cmd)
1786 {
1787 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1788 
1789 	cmd->conn->conn_transport->iscsit_aborted_task(cmd->conn, cmd);
1790 }
1791 
1792 static char *lio_tpg_get_endpoint_wwn(struct se_portal_group *se_tpg)
1793 {
1794 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1795 
1796 	return &tpg->tpg_tiqn->tiqn[0];
1797 }
1798 
1799 static u16 lio_tpg_get_tag(struct se_portal_group *se_tpg)
1800 {
1801 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1802 
1803 	return tpg->tpgt;
1804 }
1805 
1806 static u32 lio_tpg_get_default_depth(struct se_portal_group *se_tpg)
1807 {
1808 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1809 
1810 	return tpg->tpg_attrib.default_cmdsn_depth;
1811 }
1812 
1813 static int lio_tpg_check_demo_mode(struct se_portal_group *se_tpg)
1814 {
1815 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1816 
1817 	return tpg->tpg_attrib.generate_node_acls;
1818 }
1819 
1820 static int lio_tpg_check_demo_mode_cache(struct se_portal_group *se_tpg)
1821 {
1822 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1823 
1824 	return tpg->tpg_attrib.cache_dynamic_acls;
1825 }
1826 
1827 static int lio_tpg_check_demo_mode_write_protect(
1828 	struct se_portal_group *se_tpg)
1829 {
1830 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1831 
1832 	return tpg->tpg_attrib.demo_mode_write_protect;
1833 }
1834 
1835 static int lio_tpg_check_prod_mode_write_protect(
1836 	struct se_portal_group *se_tpg)
1837 {
1838 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1839 
1840 	return tpg->tpg_attrib.prod_mode_write_protect;
1841 }
1842 
1843 static int lio_tpg_check_prot_fabric_only(
1844 	struct se_portal_group *se_tpg)
1845 {
1846 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1847 	/*
1848 	 * Only report fabric_prot_type if t10_pi has also been enabled
1849 	 * for incoming ib_isert sessions.
1850 	 */
1851 	if (!tpg->tpg_attrib.t10_pi)
1852 		return 0;
1853 
1854 	return tpg->tpg_attrib.fabric_prot_type;
1855 }
1856 
1857 /*
1858  * Called with spin_lock_bh(struct se_portal_group->session_lock) held..
1859  *
1860  * Also, this function calls iscsit_inc_session_usage_count() on the
1861  * struct iscsi_session in question.
1862  */
1863 static int lio_tpg_shutdown_session(struct se_session *se_sess)
1864 {
1865 	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1866 
1867 	spin_lock(&sess->conn_lock);
1868 	if (atomic_read(&sess->session_fall_back_to_erl0) ||
1869 	    atomic_read(&sess->session_logout) ||
1870 	    (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
1871 		spin_unlock(&sess->conn_lock);
1872 		return 0;
1873 	}
1874 	atomic_set(&sess->session_reinstatement, 1);
1875 	spin_unlock(&sess->conn_lock);
1876 
1877 	iscsit_stop_time2retain_timer(sess);
1878 	iscsit_stop_session(sess, 1, 1);
1879 
1880 	return 1;
1881 }
1882 
1883 /*
1884  * Calls iscsit_dec_session_usage_count() as inverse of
1885  * lio_tpg_shutdown_session()
1886  */
1887 static void lio_tpg_close_session(struct se_session *se_sess)
1888 {
1889 	struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1890 	/*
1891 	 * If the iSCSI Session for the iSCSI Initiator Node exists,
1892 	 * forcefully shutdown the iSCSI NEXUS.
1893 	 */
1894 	iscsit_close_session(sess);
1895 }
1896 
1897 static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg)
1898 {
1899 	struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
1900 
1901 	return tpg->tpg_tiqn->tiqn_index;
1902 }
1903 
1904 static void lio_set_default_node_attributes(struct se_node_acl *se_acl)
1905 {
1906 	struct iscsi_node_acl *acl = container_of(se_acl, struct iscsi_node_acl,
1907 				se_node_acl);
1908 	struct se_portal_group *se_tpg = se_acl->se_tpg;
1909 	struct iscsi_portal_group *tpg = container_of(se_tpg,
1910 				struct iscsi_portal_group, tpg_se_tpg);
1911 
1912 	acl->node_attrib.nacl = acl;
1913 	iscsit_set_default_node_attribues(acl, tpg);
1914 }
1915 
1916 static int lio_check_stop_free(struct se_cmd *se_cmd)
1917 {
1918 	return target_put_sess_cmd(se_cmd);
1919 }
1920 
1921 static void lio_release_cmd(struct se_cmd *se_cmd)
1922 {
1923 	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1924 
1925 	pr_debug("Entering lio_release_cmd for se_cmd: %p\n", se_cmd);
1926 	iscsit_release_cmd(cmd);
1927 }
1928 
1929 const struct target_core_fabric_ops iscsi_ops = {
1930 	.module				= THIS_MODULE,
1931 	.name				= "iscsi",
1932 	.node_acl_size			= sizeof(struct iscsi_node_acl),
1933 	.get_fabric_name		= iscsi_get_fabric_name,
1934 	.get_fabric_proto_ident		= iscsi_get_fabric_proto_ident,
1935 	.tpg_get_wwn			= lio_tpg_get_endpoint_wwn,
1936 	.tpg_get_tag			= lio_tpg_get_tag,
1937 	.tpg_get_default_depth		= lio_tpg_get_default_depth,
1938 	.tpg_get_pr_transport_id	= iscsi_get_pr_transport_id,
1939 	.tpg_get_pr_transport_id_len	= iscsi_get_pr_transport_id_len,
1940 	.tpg_parse_pr_out_transport_id	= iscsi_parse_pr_out_transport_id,
1941 	.tpg_check_demo_mode		= lio_tpg_check_demo_mode,
1942 	.tpg_check_demo_mode_cache	= lio_tpg_check_demo_mode_cache,
1943 	.tpg_check_demo_mode_write_protect =
1944 			lio_tpg_check_demo_mode_write_protect,
1945 	.tpg_check_prod_mode_write_protect =
1946 			lio_tpg_check_prod_mode_write_protect,
1947 	.tpg_check_prot_fabric_only	= &lio_tpg_check_prot_fabric_only,
1948 	.tpg_get_inst_index		= lio_tpg_get_inst_index,
1949 	.check_stop_free		= lio_check_stop_free,
1950 	.release_cmd			= lio_release_cmd,
1951 	.shutdown_session		= lio_tpg_shutdown_session,
1952 	.close_session			= lio_tpg_close_session,
1953 	.sess_get_index			= lio_sess_get_index,
1954 	.sess_get_initiator_sid		= lio_sess_get_initiator_sid,
1955 	.write_pending			= lio_write_pending,
1956 	.write_pending_status		= lio_write_pending_status,
1957 	.set_default_node_attributes	= lio_set_default_node_attributes,
1958 	.get_task_tag			= iscsi_get_task_tag,
1959 	.get_cmd_state			= iscsi_get_cmd_state,
1960 	.queue_data_in			= lio_queue_data_in,
1961 	.queue_status			= lio_queue_status,
1962 	.queue_tm_rsp			= lio_queue_tm_rsp,
1963 	.aborted_task			= lio_aborted_task,
1964 	.fabric_make_wwn		= lio_target_call_coreaddtiqn,
1965 	.fabric_drop_wwn		= lio_target_call_coredeltiqn,
1966 	.fabric_make_tpg		= lio_target_tiqn_addtpg,
1967 	.fabric_drop_tpg		= lio_target_tiqn_deltpg,
1968 	.fabric_make_np			= lio_target_call_addnptotpg,
1969 	.fabric_drop_np			= lio_target_call_delnpfromtpg,
1970 	.fabric_init_nodeacl		= lio_target_init_nodeacl,
1971 	.fabric_cleanup_nodeacl		= lio_target_cleanup_nodeacl,
1972 
1973 	.tfc_discovery_attrs		= lio_target_discovery_auth_attrs,
1974 	.tfc_wwn_attrs			= lio_target_wwn_attrs,
1975 	.tfc_tpg_base_attrs		= lio_target_tpg_attrs,
1976 	.tfc_tpg_attrib_attrs		= lio_target_tpg_attrib_attrs,
1977 	.tfc_tpg_auth_attrs		= lio_target_tpg_auth_attrs,
1978 	.tfc_tpg_param_attrs		= lio_target_tpg_param_attrs,
1979 	.tfc_tpg_np_base_attrs		= lio_target_portal_attrs,
1980 	.tfc_tpg_nacl_base_attrs	= lio_target_initiator_attrs,
1981 	.tfc_tpg_nacl_attrib_attrs	= lio_target_nacl_attrib_attrs,
1982 	.tfc_tpg_nacl_auth_attrs	= lio_target_nacl_auth_attrs,
1983 	.tfc_tpg_nacl_param_attrs	= lio_target_nacl_param_attrs,
1984 };
1985