xref: /openbmc/linux/drivers/target/target_core_stat.c (revision 45471cd98decae5fced8b38e46c223f54a924814)
1 /*******************************************************************************
2  * Filename:  target_core_stat.c
3  *
4  * Modern ConfigFS group context specific statistics based on original
5  * target_core_mib.c code
6  *
7  * (c) Copyright 2006-2013 Datera, Inc.
8  *
9  * Nicholas A. Bellinger <nab@linux-iscsi.org>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24  *
25  ******************************************************************************/
26 
27 #include <linux/kernel.h>
28 #include <linux/module.h>
29 #include <linux/delay.h>
30 #include <linux/timer.h>
31 #include <linux/string.h>
32 #include <linux/utsname.h>
33 #include <linux/proc_fs.h>
34 #include <linux/seq_file.h>
35 #include <linux/configfs.h>
36 
37 #include <target/target_core_base.h>
38 #include <target/target_core_backend.h>
39 #include <target/target_core_fabric.h>
40 #include <target/target_core_configfs.h>
41 #include <target/configfs_macros.h>
42 
43 #include "target_core_internal.h"
44 
45 #ifndef INITIAL_JIFFIES
46 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
47 #endif
48 
49 #define NONE		"None"
50 #define ISPRINT(a)   ((a >= ' ') && (a <= '~'))
51 
52 #define SCSI_LU_INDEX			1
53 #define LU_COUNT			1
54 
55 /*
56  * SCSI Device Table
57  */
58 
59 CONFIGFS_EATTR_STRUCT(target_stat_scsi_dev, se_dev_stat_grps);
60 #define DEV_STAT_SCSI_DEV_ATTR(_name, _mode)				\
61 static struct target_stat_scsi_dev_attribute				\
62 			target_stat_scsi_dev_##_name =			\
63 	__CONFIGFS_EATTR(_name, _mode,					\
64 	target_stat_scsi_dev_show_attr_##_name,				\
65 	target_stat_scsi_dev_store_attr_##_name);
66 
67 #define DEV_STAT_SCSI_DEV_ATTR_RO(_name)				\
68 static struct target_stat_scsi_dev_attribute				\
69 			target_stat_scsi_dev_##_name =			\
70 	__CONFIGFS_EATTR_RO(_name,					\
71 	target_stat_scsi_dev_show_attr_##_name);
72 
73 static ssize_t target_stat_scsi_dev_show_attr_inst(
74 	struct se_dev_stat_grps *sgrps, char *page)
75 {
76 	struct se_device *dev =
77 		container_of(sgrps, struct se_device, dev_stat_grps);
78 	struct se_hba *hba = dev->se_hba;
79 
80 	return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
81 }
82 DEV_STAT_SCSI_DEV_ATTR_RO(inst);
83 
84 static ssize_t target_stat_scsi_dev_show_attr_indx(
85 	struct se_dev_stat_grps *sgrps, char *page)
86 {
87 	struct se_device *dev =
88 		container_of(sgrps, struct se_device, dev_stat_grps);
89 
90 	return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
91 }
92 DEV_STAT_SCSI_DEV_ATTR_RO(indx);
93 
94 static ssize_t target_stat_scsi_dev_show_attr_role(
95 	struct se_dev_stat_grps *sgrps, char *page)
96 {
97 	return snprintf(page, PAGE_SIZE, "Target\n");
98 }
99 DEV_STAT_SCSI_DEV_ATTR_RO(role);
100 
101 static ssize_t target_stat_scsi_dev_show_attr_ports(
102 	struct se_dev_stat_grps *sgrps, char *page)
103 {
104 	struct se_device *dev =
105 		container_of(sgrps, struct se_device, dev_stat_grps);
106 
107 	return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_port_count);
108 }
109 DEV_STAT_SCSI_DEV_ATTR_RO(ports);
110 
111 CONFIGFS_EATTR_OPS(target_stat_scsi_dev, se_dev_stat_grps, scsi_dev_group);
112 
113 static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
114 	&target_stat_scsi_dev_inst.attr,
115 	&target_stat_scsi_dev_indx.attr,
116 	&target_stat_scsi_dev_role.attr,
117 	&target_stat_scsi_dev_ports.attr,
118 	NULL,
119 };
120 
121 static struct configfs_item_operations target_stat_scsi_dev_attrib_ops = {
122 	.show_attribute		= target_stat_scsi_dev_attr_show,
123 	.store_attribute	= target_stat_scsi_dev_attr_store,
124 };
125 
126 static struct config_item_type target_stat_scsi_dev_cit = {
127 	.ct_item_ops		= &target_stat_scsi_dev_attrib_ops,
128 	.ct_attrs		= target_stat_scsi_dev_attrs,
129 	.ct_owner		= THIS_MODULE,
130 };
131 
132 /*
133  * SCSI Target Device Table
134  */
135 
136 CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_dev, se_dev_stat_grps);
137 #define DEV_STAT_SCSI_TGT_DEV_ATTR(_name, _mode)			\
138 static struct target_stat_scsi_tgt_dev_attribute			\
139 			target_stat_scsi_tgt_dev_##_name =		\
140 	__CONFIGFS_EATTR(_name, _mode,					\
141 	target_stat_scsi_tgt_dev_show_attr_##_name,			\
142 	target_stat_scsi_tgt_dev_store_attr_##_name);
143 
144 #define DEV_STAT_SCSI_TGT_DEV_ATTR_RO(_name)				\
145 static struct target_stat_scsi_tgt_dev_attribute			\
146 			target_stat_scsi_tgt_dev_##_name =		\
147 	__CONFIGFS_EATTR_RO(_name,					\
148 	target_stat_scsi_tgt_dev_show_attr_##_name);
149 
150 static ssize_t target_stat_scsi_tgt_dev_show_attr_inst(
151 	struct se_dev_stat_grps *sgrps, char *page)
152 {
153 	struct se_device *dev =
154 		container_of(sgrps, struct se_device, dev_stat_grps);
155 	struct se_hba *hba = dev->se_hba;
156 
157 	return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
158 }
159 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(inst);
160 
161 static ssize_t target_stat_scsi_tgt_dev_show_attr_indx(
162 	struct se_dev_stat_grps *sgrps, char *page)
163 {
164 	struct se_device *dev =
165 		container_of(sgrps, struct se_device, dev_stat_grps);
166 
167 	return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
168 }
169 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(indx);
170 
171 static ssize_t target_stat_scsi_tgt_dev_show_attr_num_lus(
172 	struct se_dev_stat_grps *sgrps, char *page)
173 {
174 	return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
175 }
176 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(num_lus);
177 
178 static ssize_t target_stat_scsi_tgt_dev_show_attr_status(
179 	struct se_dev_stat_grps *sgrps, char *page)
180 {
181 	struct se_device *dev =
182 		container_of(sgrps, struct se_device, dev_stat_grps);
183 
184 	if (dev->export_count)
185 		return snprintf(page, PAGE_SIZE, "activated");
186 	else
187 		return snprintf(page, PAGE_SIZE, "deactivated");
188 }
189 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(status);
190 
191 static ssize_t target_stat_scsi_tgt_dev_show_attr_non_access_lus(
192 	struct se_dev_stat_grps *sgrps, char *page)
193 {
194 	struct se_device *dev =
195 		container_of(sgrps, struct se_device, dev_stat_grps);
196 	int non_accessible_lus;
197 
198 	if (dev->export_count)
199 		non_accessible_lus = 0;
200 	else
201 		non_accessible_lus = 1;
202 
203 	return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
204 }
205 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(non_access_lus);
206 
207 static ssize_t target_stat_scsi_tgt_dev_show_attr_resets(
208 	struct se_dev_stat_grps *sgrps, char *page)
209 {
210 	struct se_device *dev =
211 		container_of(sgrps, struct se_device, dev_stat_grps);
212 
213 	return snprintf(page, PAGE_SIZE, "%lu\n",
214 			atomic_long_read(&dev->num_resets));
215 }
216 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(resets);
217 
218 
219 CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_dev, se_dev_stat_grps, scsi_tgt_dev_group);
220 
221 static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
222 	&target_stat_scsi_tgt_dev_inst.attr,
223 	&target_stat_scsi_tgt_dev_indx.attr,
224 	&target_stat_scsi_tgt_dev_num_lus.attr,
225 	&target_stat_scsi_tgt_dev_status.attr,
226 	&target_stat_scsi_tgt_dev_non_access_lus.attr,
227 	&target_stat_scsi_tgt_dev_resets.attr,
228 	NULL,
229 };
230 
231 static struct configfs_item_operations target_stat_scsi_tgt_dev_attrib_ops = {
232 	.show_attribute		= target_stat_scsi_tgt_dev_attr_show,
233 	.store_attribute	= target_stat_scsi_tgt_dev_attr_store,
234 };
235 
236 static struct config_item_type target_stat_scsi_tgt_dev_cit = {
237 	.ct_item_ops		= &target_stat_scsi_tgt_dev_attrib_ops,
238 	.ct_attrs		= target_stat_scsi_tgt_dev_attrs,
239 	.ct_owner		= THIS_MODULE,
240 };
241 
242 /*
243  * SCSI Logical Unit Table
244  */
245 
246 CONFIGFS_EATTR_STRUCT(target_stat_scsi_lu, se_dev_stat_grps);
247 #define DEV_STAT_SCSI_LU_ATTR(_name, _mode)				\
248 static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
249 	__CONFIGFS_EATTR(_name, _mode,					\
250 	target_stat_scsi_lu_show_attr_##_name,				\
251 	target_stat_scsi_lu_store_attr_##_name);
252 
253 #define DEV_STAT_SCSI_LU_ATTR_RO(_name)					\
254 static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
255 	__CONFIGFS_EATTR_RO(_name,					\
256 	target_stat_scsi_lu_show_attr_##_name);
257 
258 static ssize_t target_stat_scsi_lu_show_attr_inst(
259 	struct se_dev_stat_grps *sgrps, char *page)
260 {
261 	struct se_device *dev =
262 		container_of(sgrps, struct se_device, dev_stat_grps);
263 	struct se_hba *hba = dev->se_hba;
264 
265 	return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
266 }
267 DEV_STAT_SCSI_LU_ATTR_RO(inst);
268 
269 static ssize_t target_stat_scsi_lu_show_attr_dev(
270 	struct se_dev_stat_grps *sgrps, char *page)
271 {
272 	struct se_device *dev =
273 		container_of(sgrps, struct se_device, dev_stat_grps);
274 
275 	return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
276 }
277 DEV_STAT_SCSI_LU_ATTR_RO(dev);
278 
279 static ssize_t target_stat_scsi_lu_show_attr_indx(
280 	struct se_dev_stat_grps *sgrps, char *page)
281 {
282 	return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
283 }
284 DEV_STAT_SCSI_LU_ATTR_RO(indx);
285 
286 static ssize_t target_stat_scsi_lu_show_attr_lun(
287 	struct se_dev_stat_grps *sgrps, char *page)
288 {
289 	/* FIXME: scsiLuDefaultLun */
290 	return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
291 }
292 DEV_STAT_SCSI_LU_ATTR_RO(lun);
293 
294 static ssize_t target_stat_scsi_lu_show_attr_lu_name(
295 	struct se_dev_stat_grps *sgrps, char *page)
296 {
297 	struct se_device *dev =
298 		container_of(sgrps, struct se_device, dev_stat_grps);
299 
300 	/* scsiLuWwnName */
301 	return snprintf(page, PAGE_SIZE, "%s\n",
302 			(strlen(dev->t10_wwn.unit_serial)) ?
303 			dev->t10_wwn.unit_serial : "None");
304 }
305 DEV_STAT_SCSI_LU_ATTR_RO(lu_name);
306 
307 static ssize_t target_stat_scsi_lu_show_attr_vend(
308 	struct se_dev_stat_grps *sgrps, char *page)
309 {
310 	struct se_device *dev =
311 		container_of(sgrps, struct se_device, dev_stat_grps);
312 	int i;
313 	char str[sizeof(dev->t10_wwn.vendor)+1];
314 
315 	/* scsiLuVendorId */
316 	for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
317 		str[i] = ISPRINT(dev->t10_wwn.vendor[i]) ?
318 			dev->t10_wwn.vendor[i] : ' ';
319 	str[i] = '\0';
320 	return snprintf(page, PAGE_SIZE, "%s\n", str);
321 }
322 DEV_STAT_SCSI_LU_ATTR_RO(vend);
323 
324 static ssize_t target_stat_scsi_lu_show_attr_prod(
325 	struct se_dev_stat_grps *sgrps, char *page)
326 {
327 	struct se_device *dev =
328 		container_of(sgrps, struct se_device, dev_stat_grps);
329 	int i;
330 	char str[sizeof(dev->t10_wwn.model)+1];
331 
332 	/* scsiLuProductId */
333 	for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
334 		str[i] = ISPRINT(dev->t10_wwn.model[i]) ?
335 			dev->t10_wwn.model[i] : ' ';
336 	str[i] = '\0';
337 	return snprintf(page, PAGE_SIZE, "%s\n", str);
338 }
339 DEV_STAT_SCSI_LU_ATTR_RO(prod);
340 
341 static ssize_t target_stat_scsi_lu_show_attr_rev(
342 	struct se_dev_stat_grps *sgrps, char *page)
343 {
344 	struct se_device *dev =
345 		container_of(sgrps, struct se_device, dev_stat_grps);
346 	int i;
347 	char str[sizeof(dev->t10_wwn.revision)+1];
348 
349 	/* scsiLuRevisionId */
350 	for (i = 0; i < sizeof(dev->t10_wwn.revision); i++)
351 		str[i] = ISPRINT(dev->t10_wwn.revision[i]) ?
352 			dev->t10_wwn.revision[i] : ' ';
353 	str[i] = '\0';
354 	return snprintf(page, PAGE_SIZE, "%s\n", str);
355 }
356 DEV_STAT_SCSI_LU_ATTR_RO(rev);
357 
358 static ssize_t target_stat_scsi_lu_show_attr_dev_type(
359 	struct se_dev_stat_grps *sgrps, char *page)
360 {
361 	struct se_device *dev =
362 		container_of(sgrps, struct se_device, dev_stat_grps);
363 
364 	/* scsiLuPeripheralType */
365 	return snprintf(page, PAGE_SIZE, "%u\n",
366 			dev->transport->get_device_type(dev));
367 }
368 DEV_STAT_SCSI_LU_ATTR_RO(dev_type);
369 
370 static ssize_t target_stat_scsi_lu_show_attr_status(
371 	struct se_dev_stat_grps *sgrps, char *page)
372 {
373 	struct se_device *dev =
374 		container_of(sgrps, struct se_device, dev_stat_grps);
375 
376 	/* scsiLuStatus */
377 	return snprintf(page, PAGE_SIZE, "%s\n",
378 		(dev->export_count) ? "available" : "notavailable");
379 }
380 DEV_STAT_SCSI_LU_ATTR_RO(status);
381 
382 static ssize_t target_stat_scsi_lu_show_attr_state_bit(
383 	struct se_dev_stat_grps *sgrps, char *page)
384 {
385 	/* scsiLuState */
386 	return snprintf(page, PAGE_SIZE, "exposed\n");
387 }
388 DEV_STAT_SCSI_LU_ATTR_RO(state_bit);
389 
390 static ssize_t target_stat_scsi_lu_show_attr_num_cmds(
391 	struct se_dev_stat_grps *sgrps, char *page)
392 {
393 	struct se_device *dev =
394 		container_of(sgrps, struct se_device, dev_stat_grps);
395 
396 	/* scsiLuNumCommands */
397 	return snprintf(page, PAGE_SIZE, "%lu\n",
398 			atomic_long_read(&dev->num_cmds));
399 }
400 DEV_STAT_SCSI_LU_ATTR_RO(num_cmds);
401 
402 static ssize_t target_stat_scsi_lu_show_attr_read_mbytes(
403 	struct se_dev_stat_grps *sgrps, char *page)
404 {
405 	struct se_device *dev =
406 		container_of(sgrps, struct se_device, dev_stat_grps);
407 
408 	/* scsiLuReadMegaBytes */
409 	return snprintf(page, PAGE_SIZE, "%lu\n",
410 			atomic_long_read(&dev->read_bytes) >> 20);
411 }
412 DEV_STAT_SCSI_LU_ATTR_RO(read_mbytes);
413 
414 static ssize_t target_stat_scsi_lu_show_attr_write_mbytes(
415 	struct se_dev_stat_grps *sgrps, char *page)
416 {
417 	struct se_device *dev =
418 		container_of(sgrps, struct se_device, dev_stat_grps);
419 
420 	/* scsiLuWrittenMegaBytes */
421 	return snprintf(page, PAGE_SIZE, "%lu\n",
422 			atomic_long_read(&dev->write_bytes) >> 20);
423 }
424 DEV_STAT_SCSI_LU_ATTR_RO(write_mbytes);
425 
426 static ssize_t target_stat_scsi_lu_show_attr_resets(
427 	struct se_dev_stat_grps *sgrps, char *page)
428 {
429 	struct se_device *dev =
430 		container_of(sgrps, struct se_device, dev_stat_grps);
431 
432 	/* scsiLuInResets */
433 	return snprintf(page, PAGE_SIZE, "%lu\n", atomic_long_read(&dev->num_resets));
434 }
435 DEV_STAT_SCSI_LU_ATTR_RO(resets);
436 
437 static ssize_t target_stat_scsi_lu_show_attr_full_stat(
438 	struct se_dev_stat_grps *sgrps, char *page)
439 {
440 	/* FIXME: scsiLuOutTaskSetFullStatus */
441 	return snprintf(page, PAGE_SIZE, "%u\n", 0);
442 }
443 DEV_STAT_SCSI_LU_ATTR_RO(full_stat);
444 
445 static ssize_t target_stat_scsi_lu_show_attr_hs_num_cmds(
446 	struct se_dev_stat_grps *sgrps, char *page)
447 {
448 	/* FIXME: scsiLuHSInCommands */
449 	return snprintf(page, PAGE_SIZE, "%u\n", 0);
450 }
451 DEV_STAT_SCSI_LU_ATTR_RO(hs_num_cmds);
452 
453 static ssize_t target_stat_scsi_lu_show_attr_creation_time(
454 	struct se_dev_stat_grps *sgrps, char *page)
455 {
456 	struct se_device *dev =
457 		container_of(sgrps, struct se_device, dev_stat_grps);
458 
459 	/* scsiLuCreationTime */
460 	return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
461 				INITIAL_JIFFIES) * 100 / HZ));
462 }
463 DEV_STAT_SCSI_LU_ATTR_RO(creation_time);
464 
465 CONFIGFS_EATTR_OPS(target_stat_scsi_lu, se_dev_stat_grps, scsi_lu_group);
466 
467 static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
468 	&target_stat_scsi_lu_inst.attr,
469 	&target_stat_scsi_lu_dev.attr,
470 	&target_stat_scsi_lu_indx.attr,
471 	&target_stat_scsi_lu_lun.attr,
472 	&target_stat_scsi_lu_lu_name.attr,
473 	&target_stat_scsi_lu_vend.attr,
474 	&target_stat_scsi_lu_prod.attr,
475 	&target_stat_scsi_lu_rev.attr,
476 	&target_stat_scsi_lu_dev_type.attr,
477 	&target_stat_scsi_lu_status.attr,
478 	&target_stat_scsi_lu_state_bit.attr,
479 	&target_stat_scsi_lu_num_cmds.attr,
480 	&target_stat_scsi_lu_read_mbytes.attr,
481 	&target_stat_scsi_lu_write_mbytes.attr,
482 	&target_stat_scsi_lu_resets.attr,
483 	&target_stat_scsi_lu_full_stat.attr,
484 	&target_stat_scsi_lu_hs_num_cmds.attr,
485 	&target_stat_scsi_lu_creation_time.attr,
486 	NULL,
487 };
488 
489 static struct configfs_item_operations target_stat_scsi_lu_attrib_ops = {
490 	.show_attribute		= target_stat_scsi_lu_attr_show,
491 	.store_attribute	= target_stat_scsi_lu_attr_store,
492 };
493 
494 static struct config_item_type target_stat_scsi_lu_cit = {
495 	.ct_item_ops		= &target_stat_scsi_lu_attrib_ops,
496 	.ct_attrs		= target_stat_scsi_lu_attrs,
497 	.ct_owner		= THIS_MODULE,
498 };
499 
500 /*
501  * Called from target_core_configfs.c:target_core_make_subdev() to setup
502  * the target statistics groups + configfs CITs located in target_core_stat.c
503  */
504 void target_stat_setup_dev_default_groups(struct se_device *dev)
505 {
506 	struct config_group *dev_stat_grp = &dev->dev_stat_grps.stat_group;
507 
508 	config_group_init_type_name(&dev->dev_stat_grps.scsi_dev_group,
509 			"scsi_dev", &target_stat_scsi_dev_cit);
510 	config_group_init_type_name(&dev->dev_stat_grps.scsi_tgt_dev_group,
511 			"scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit);
512 	config_group_init_type_name(&dev->dev_stat_grps.scsi_lu_group,
513 			"scsi_lu", &target_stat_scsi_lu_cit);
514 
515 	dev_stat_grp->default_groups[0] = &dev->dev_stat_grps.scsi_dev_group;
516 	dev_stat_grp->default_groups[1] = &dev->dev_stat_grps.scsi_tgt_dev_group;
517 	dev_stat_grp->default_groups[2] = &dev->dev_stat_grps.scsi_lu_group;
518 	dev_stat_grp->default_groups[3] = NULL;
519 }
520 
521 /*
522  * SCSI Port Table
523  */
524 
525 CONFIGFS_EATTR_STRUCT(target_stat_scsi_port, se_port_stat_grps);
526 #define DEV_STAT_SCSI_PORT_ATTR(_name, _mode)				\
527 static struct target_stat_scsi_port_attribute				\
528 			target_stat_scsi_port_##_name =			\
529 	__CONFIGFS_EATTR(_name, _mode,					\
530 	target_stat_scsi_port_show_attr_##_name,			\
531 	target_stat_scsi_port_store_attr_##_name);
532 
533 #define DEV_STAT_SCSI_PORT_ATTR_RO(_name)				\
534 static struct target_stat_scsi_port_attribute				\
535 			target_stat_scsi_port_##_name =			\
536 	__CONFIGFS_EATTR_RO(_name,					\
537 	target_stat_scsi_port_show_attr_##_name);
538 
539 static ssize_t target_stat_scsi_port_show_attr_inst(
540 	struct se_port_stat_grps *pgrps, char *page)
541 {
542 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
543 	struct se_port *sep;
544 	struct se_device *dev = lun->lun_se_dev;
545 	struct se_hba *hba;
546 	ssize_t ret;
547 
548 	spin_lock(&lun->lun_sep_lock);
549 	sep = lun->lun_sep;
550 	if (!sep) {
551 		spin_unlock(&lun->lun_sep_lock);
552 		return -ENODEV;
553 	}
554 	hba = dev->se_hba;
555 	ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
556 	spin_unlock(&lun->lun_sep_lock);
557 	return ret;
558 }
559 DEV_STAT_SCSI_PORT_ATTR_RO(inst);
560 
561 static ssize_t target_stat_scsi_port_show_attr_dev(
562 	struct se_port_stat_grps *pgrps, char *page)
563 {
564 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
565 	struct se_port *sep;
566 	struct se_device *dev = lun->lun_se_dev;
567 	ssize_t ret;
568 
569 	spin_lock(&lun->lun_sep_lock);
570 	sep = lun->lun_sep;
571 	if (!sep) {
572 		spin_unlock(&lun->lun_sep_lock);
573 		return -ENODEV;
574 	}
575 	ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
576 	spin_unlock(&lun->lun_sep_lock);
577 	return ret;
578 }
579 DEV_STAT_SCSI_PORT_ATTR_RO(dev);
580 
581 static ssize_t target_stat_scsi_port_show_attr_indx(
582 	struct se_port_stat_grps *pgrps, char *page)
583 {
584 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
585 	struct se_port *sep;
586 	ssize_t ret;
587 
588 	spin_lock(&lun->lun_sep_lock);
589 	sep = lun->lun_sep;
590 	if (!sep) {
591 		spin_unlock(&lun->lun_sep_lock);
592 		return -ENODEV;
593 	}
594 	ret = snprintf(page, PAGE_SIZE, "%u\n", sep->sep_index);
595 	spin_unlock(&lun->lun_sep_lock);
596 	return ret;
597 }
598 DEV_STAT_SCSI_PORT_ATTR_RO(indx);
599 
600 static ssize_t target_stat_scsi_port_show_attr_role(
601 	struct se_port_stat_grps *pgrps, char *page)
602 {
603 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
604 	struct se_device *dev = lun->lun_se_dev;
605 	struct se_port *sep;
606 	ssize_t ret;
607 
608 	if (!dev)
609 		return -ENODEV;
610 
611 	spin_lock(&lun->lun_sep_lock);
612 	sep = lun->lun_sep;
613 	if (!sep) {
614 		spin_unlock(&lun->lun_sep_lock);
615 		return -ENODEV;
616 	}
617 	ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
618 	spin_unlock(&lun->lun_sep_lock);
619 	return ret;
620 }
621 DEV_STAT_SCSI_PORT_ATTR_RO(role);
622 
623 static ssize_t target_stat_scsi_port_show_attr_busy_count(
624 	struct se_port_stat_grps *pgrps, char *page)
625 {
626 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
627 	struct se_port *sep;
628 	ssize_t ret;
629 
630 	spin_lock(&lun->lun_sep_lock);
631 	sep = lun->lun_sep;
632 	if (!sep) {
633 		spin_unlock(&lun->lun_sep_lock);
634 		return -ENODEV;
635 	}
636 	/* FIXME: scsiPortBusyStatuses  */
637 	ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
638 	spin_unlock(&lun->lun_sep_lock);
639 	return ret;
640 }
641 DEV_STAT_SCSI_PORT_ATTR_RO(busy_count);
642 
643 CONFIGFS_EATTR_OPS(target_stat_scsi_port, se_port_stat_grps, scsi_port_group);
644 
645 static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
646 	&target_stat_scsi_port_inst.attr,
647 	&target_stat_scsi_port_dev.attr,
648 	&target_stat_scsi_port_indx.attr,
649 	&target_stat_scsi_port_role.attr,
650 	&target_stat_scsi_port_busy_count.attr,
651 	NULL,
652 };
653 
654 static struct configfs_item_operations target_stat_scsi_port_attrib_ops = {
655 	.show_attribute		= target_stat_scsi_port_attr_show,
656 	.store_attribute	= target_stat_scsi_port_attr_store,
657 };
658 
659 static struct config_item_type target_stat_scsi_port_cit = {
660 	.ct_item_ops		= &target_stat_scsi_port_attrib_ops,
661 	.ct_attrs		= target_stat_scsi_port_attrs,
662 	.ct_owner		= THIS_MODULE,
663 };
664 
665 /*
666  * SCSI Target Port Table
667  */
668 CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_port, se_port_stat_grps);
669 #define DEV_STAT_SCSI_TGT_PORT_ATTR(_name, _mode)			\
670 static struct target_stat_scsi_tgt_port_attribute			\
671 			target_stat_scsi_tgt_port_##_name =		\
672 	__CONFIGFS_EATTR(_name, _mode,					\
673 	target_stat_scsi_tgt_port_show_attr_##_name,			\
674 	target_stat_scsi_tgt_port_store_attr_##_name);
675 
676 #define DEV_STAT_SCSI_TGT_PORT_ATTR_RO(_name)				\
677 static struct target_stat_scsi_tgt_port_attribute			\
678 			target_stat_scsi_tgt_port_##_name =		\
679 	__CONFIGFS_EATTR_RO(_name,					\
680 	target_stat_scsi_tgt_port_show_attr_##_name);
681 
682 static ssize_t target_stat_scsi_tgt_port_show_attr_inst(
683 	struct se_port_stat_grps *pgrps, char *page)
684 {
685 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
686 	struct se_device *dev = lun->lun_se_dev;
687 	struct se_port *sep;
688 	struct se_hba *hba;
689 	ssize_t ret;
690 
691 	spin_lock(&lun->lun_sep_lock);
692 	sep = lun->lun_sep;
693 	if (!sep) {
694 		spin_unlock(&lun->lun_sep_lock);
695 		return -ENODEV;
696 	}
697 	hba = dev->se_hba;
698 	ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
699 	spin_unlock(&lun->lun_sep_lock);
700 	return ret;
701 }
702 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(inst);
703 
704 static ssize_t target_stat_scsi_tgt_port_show_attr_dev(
705 	struct se_port_stat_grps *pgrps, char *page)
706 {
707 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
708 	struct se_device *dev = lun->lun_se_dev;
709 	struct se_port *sep;
710 	ssize_t ret;
711 
712 	spin_lock(&lun->lun_sep_lock);
713 	sep = lun->lun_sep;
714 	if (!sep) {
715 		spin_unlock(&lun->lun_sep_lock);
716 		return -ENODEV;
717 	}
718 	ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
719 	spin_unlock(&lun->lun_sep_lock);
720 	return ret;
721 }
722 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(dev);
723 
724 static ssize_t target_stat_scsi_tgt_port_show_attr_indx(
725 	struct se_port_stat_grps *pgrps, char *page)
726 {
727 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
728 	struct se_port *sep;
729 	ssize_t ret;
730 
731 	spin_lock(&lun->lun_sep_lock);
732 	sep = lun->lun_sep;
733 	if (!sep) {
734 		spin_unlock(&lun->lun_sep_lock);
735 		return -ENODEV;
736 	}
737 	ret = snprintf(page, PAGE_SIZE, "%u\n", sep->sep_index);
738 	spin_unlock(&lun->lun_sep_lock);
739 	return ret;
740 }
741 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(indx);
742 
743 static ssize_t target_stat_scsi_tgt_port_show_attr_name(
744 	struct se_port_stat_grps *pgrps, char *page)
745 {
746 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
747 	struct se_port *sep;
748 	struct se_portal_group *tpg;
749 	ssize_t ret;
750 
751 	spin_lock(&lun->lun_sep_lock);
752 	sep = lun->lun_sep;
753 	if (!sep) {
754 		spin_unlock(&lun->lun_sep_lock);
755 		return -ENODEV;
756 	}
757 	tpg = sep->sep_tpg;
758 
759 	ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
760 		tpg->se_tpg_tfo->get_fabric_name(), sep->sep_index);
761 	spin_unlock(&lun->lun_sep_lock);
762 	return ret;
763 }
764 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(name);
765 
766 static ssize_t target_stat_scsi_tgt_port_show_attr_port_index(
767 	struct se_port_stat_grps *pgrps, char *page)
768 {
769 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
770 	struct se_port *sep;
771 	struct se_portal_group *tpg;
772 	ssize_t ret;
773 
774 	spin_lock(&lun->lun_sep_lock);
775 	sep = lun->lun_sep;
776 	if (!sep) {
777 		spin_unlock(&lun->lun_sep_lock);
778 		return -ENODEV;
779 	}
780 	tpg = sep->sep_tpg;
781 
782 	ret = snprintf(page, PAGE_SIZE, "%s%s%d\n",
783 		tpg->se_tpg_tfo->tpg_get_wwn(tpg), "+t+",
784 		tpg->se_tpg_tfo->tpg_get_tag(tpg));
785 	spin_unlock(&lun->lun_sep_lock);
786 	return ret;
787 }
788 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(port_index);
789 
790 static ssize_t target_stat_scsi_tgt_port_show_attr_in_cmds(
791 	struct se_port_stat_grps *pgrps, char *page)
792 {
793 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
794 	struct se_port *sep;
795 	ssize_t ret;
796 
797 	spin_lock(&lun->lun_sep_lock);
798 	sep = lun->lun_sep;
799 	if (!sep) {
800 		spin_unlock(&lun->lun_sep_lock);
801 		return -ENODEV;
802 	}
803 
804 	ret = snprintf(page, PAGE_SIZE, "%llu\n", sep->sep_stats.cmd_pdus);
805 	spin_unlock(&lun->lun_sep_lock);
806 	return ret;
807 }
808 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(in_cmds);
809 
810 static ssize_t target_stat_scsi_tgt_port_show_attr_write_mbytes(
811 	struct se_port_stat_grps *pgrps, char *page)
812 {
813 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
814 	struct se_port *sep;
815 	ssize_t ret;
816 
817 	spin_lock(&lun->lun_sep_lock);
818 	sep = lun->lun_sep;
819 	if (!sep) {
820 		spin_unlock(&lun->lun_sep_lock);
821 		return -ENODEV;
822 	}
823 
824 	ret = snprintf(page, PAGE_SIZE, "%u\n",
825 			(u32)(sep->sep_stats.rx_data_octets >> 20));
826 	spin_unlock(&lun->lun_sep_lock);
827 	return ret;
828 }
829 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(write_mbytes);
830 
831 static ssize_t target_stat_scsi_tgt_port_show_attr_read_mbytes(
832 	struct se_port_stat_grps *pgrps, char *page)
833 {
834 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
835 	struct se_port *sep;
836 	ssize_t ret;
837 
838 	spin_lock(&lun->lun_sep_lock);
839 	sep = lun->lun_sep;
840 	if (!sep) {
841 		spin_unlock(&lun->lun_sep_lock);
842 		return -ENODEV;
843 	}
844 
845 	ret = snprintf(page, PAGE_SIZE, "%u\n",
846 			(u32)(sep->sep_stats.tx_data_octets >> 20));
847 	spin_unlock(&lun->lun_sep_lock);
848 	return ret;
849 }
850 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(read_mbytes);
851 
852 static ssize_t target_stat_scsi_tgt_port_show_attr_hs_in_cmds(
853 	struct se_port_stat_grps *pgrps, char *page)
854 {
855 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
856 	struct se_port *sep;
857 	ssize_t ret;
858 
859 	spin_lock(&lun->lun_sep_lock);
860 	sep = lun->lun_sep;
861 	if (!sep) {
862 		spin_unlock(&lun->lun_sep_lock);
863 		return -ENODEV;
864 	}
865 
866 	/* FIXME: scsiTgtPortHsInCommands */
867 	ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
868 	spin_unlock(&lun->lun_sep_lock);
869 	return ret;
870 }
871 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(hs_in_cmds);
872 
873 CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_port, se_port_stat_grps,
874 		scsi_tgt_port_group);
875 
876 static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
877 	&target_stat_scsi_tgt_port_inst.attr,
878 	&target_stat_scsi_tgt_port_dev.attr,
879 	&target_stat_scsi_tgt_port_indx.attr,
880 	&target_stat_scsi_tgt_port_name.attr,
881 	&target_stat_scsi_tgt_port_port_index.attr,
882 	&target_stat_scsi_tgt_port_in_cmds.attr,
883 	&target_stat_scsi_tgt_port_write_mbytes.attr,
884 	&target_stat_scsi_tgt_port_read_mbytes.attr,
885 	&target_stat_scsi_tgt_port_hs_in_cmds.attr,
886 	NULL,
887 };
888 
889 static struct configfs_item_operations target_stat_scsi_tgt_port_attrib_ops = {
890 	.show_attribute		= target_stat_scsi_tgt_port_attr_show,
891 	.store_attribute	= target_stat_scsi_tgt_port_attr_store,
892 };
893 
894 static struct config_item_type target_stat_scsi_tgt_port_cit = {
895 	.ct_item_ops		= &target_stat_scsi_tgt_port_attrib_ops,
896 	.ct_attrs		= target_stat_scsi_tgt_port_attrs,
897 	.ct_owner		= THIS_MODULE,
898 };
899 
900 /*
901  * SCSI Transport Table
902 o */
903 
904 CONFIGFS_EATTR_STRUCT(target_stat_scsi_transport, se_port_stat_grps);
905 #define DEV_STAT_SCSI_TRANSPORT_ATTR(_name, _mode)			\
906 static struct target_stat_scsi_transport_attribute			\
907 			target_stat_scsi_transport_##_name =		\
908 	__CONFIGFS_EATTR(_name, _mode,					\
909 	target_stat_scsi_transport_show_attr_##_name,			\
910 	target_stat_scsi_transport_store_attr_##_name);
911 
912 #define DEV_STAT_SCSI_TRANSPORT_ATTR_RO(_name)				\
913 static struct target_stat_scsi_transport_attribute			\
914 			target_stat_scsi_transport_##_name =		\
915 	__CONFIGFS_EATTR_RO(_name,					\
916 	target_stat_scsi_transport_show_attr_##_name);
917 
918 static ssize_t target_stat_scsi_transport_show_attr_inst(
919 	struct se_port_stat_grps *pgrps, char *page)
920 {
921 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
922 	struct se_device *dev = lun->lun_se_dev;
923 	struct se_port *sep;
924 	struct se_hba *hba;
925 	ssize_t ret;
926 
927 	spin_lock(&lun->lun_sep_lock);
928 	sep = lun->lun_sep;
929 	if (!sep) {
930 		spin_unlock(&lun->lun_sep_lock);
931 		return -ENODEV;
932 	}
933 
934 	hba = dev->se_hba;
935 	ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
936 	spin_unlock(&lun->lun_sep_lock);
937 	return ret;
938 }
939 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(inst);
940 
941 static ssize_t target_stat_scsi_transport_show_attr_device(
942 	struct se_port_stat_grps *pgrps, char *page)
943 {
944 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
945 	struct se_port *sep;
946 	struct se_portal_group *tpg;
947 	ssize_t ret;
948 
949 	spin_lock(&lun->lun_sep_lock);
950 	sep = lun->lun_sep;
951 	if (!sep) {
952 		spin_unlock(&lun->lun_sep_lock);
953 		return -ENODEV;
954 	}
955 	tpg = sep->sep_tpg;
956 	/* scsiTransportType */
957 	ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
958 			tpg->se_tpg_tfo->get_fabric_name());
959 	spin_unlock(&lun->lun_sep_lock);
960 	return ret;
961 }
962 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(device);
963 
964 static ssize_t target_stat_scsi_transport_show_attr_indx(
965 	struct se_port_stat_grps *pgrps, char *page)
966 {
967 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
968 	struct se_port *sep;
969 	struct se_portal_group *tpg;
970 	ssize_t ret;
971 
972 	spin_lock(&lun->lun_sep_lock);
973 	sep = lun->lun_sep;
974 	if (!sep) {
975 		spin_unlock(&lun->lun_sep_lock);
976 		return -ENODEV;
977 	}
978 	tpg = sep->sep_tpg;
979 	ret = snprintf(page, PAGE_SIZE, "%u\n",
980 			tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
981 	spin_unlock(&lun->lun_sep_lock);
982 	return ret;
983 }
984 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(indx);
985 
986 static ssize_t target_stat_scsi_transport_show_attr_dev_name(
987 	struct se_port_stat_grps *pgrps, char *page)
988 {
989 	struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
990 	struct se_device *dev = lun->lun_se_dev;
991 	struct se_port *sep;
992 	struct se_portal_group *tpg;
993 	struct t10_wwn *wwn;
994 	ssize_t ret;
995 
996 	spin_lock(&lun->lun_sep_lock);
997 	sep = lun->lun_sep;
998 	if (!sep) {
999 		spin_unlock(&lun->lun_sep_lock);
1000 		return -ENODEV;
1001 	}
1002 	tpg = sep->sep_tpg;
1003 	wwn = &dev->t10_wwn;
1004 	/* scsiTransportDevName */
1005 	ret = snprintf(page, PAGE_SIZE, "%s+%s\n",
1006 			tpg->se_tpg_tfo->tpg_get_wwn(tpg),
1007 			(strlen(wwn->unit_serial)) ? wwn->unit_serial :
1008 			wwn->vendor);
1009 	spin_unlock(&lun->lun_sep_lock);
1010 	return ret;
1011 }
1012 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(dev_name);
1013 
1014 CONFIGFS_EATTR_OPS(target_stat_scsi_transport, se_port_stat_grps,
1015 		scsi_transport_group);
1016 
1017 static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
1018 	&target_stat_scsi_transport_inst.attr,
1019 	&target_stat_scsi_transport_device.attr,
1020 	&target_stat_scsi_transport_indx.attr,
1021 	&target_stat_scsi_transport_dev_name.attr,
1022 	NULL,
1023 };
1024 
1025 static struct configfs_item_operations target_stat_scsi_transport_attrib_ops = {
1026 	.show_attribute		= target_stat_scsi_transport_attr_show,
1027 	.store_attribute	= target_stat_scsi_transport_attr_store,
1028 };
1029 
1030 static struct config_item_type target_stat_scsi_transport_cit = {
1031 	.ct_item_ops		= &target_stat_scsi_transport_attrib_ops,
1032 	.ct_attrs		= target_stat_scsi_transport_attrs,
1033 	.ct_owner		= THIS_MODULE,
1034 };
1035 
1036 /*
1037  * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
1038  * the target port statistics groups + configfs CITs located in target_core_stat.c
1039  */
1040 void target_stat_setup_port_default_groups(struct se_lun *lun)
1041 {
1042 	struct config_group *port_stat_grp = &lun->port_stat_grps.stat_group;
1043 
1044 	config_group_init_type_name(&lun->port_stat_grps.scsi_port_group,
1045 			"scsi_port", &target_stat_scsi_port_cit);
1046 	config_group_init_type_name(&lun->port_stat_grps.scsi_tgt_port_group,
1047 			"scsi_tgt_port", &target_stat_scsi_tgt_port_cit);
1048 	config_group_init_type_name(&lun->port_stat_grps.scsi_transport_group,
1049 			"scsi_transport", &target_stat_scsi_transport_cit);
1050 
1051 	port_stat_grp->default_groups[0] = &lun->port_stat_grps.scsi_port_group;
1052 	port_stat_grp->default_groups[1] = &lun->port_stat_grps.scsi_tgt_port_group;
1053 	port_stat_grp->default_groups[2] = &lun->port_stat_grps.scsi_transport_group;
1054 	port_stat_grp->default_groups[3] = NULL;
1055 }
1056 
1057 /*
1058  * SCSI Authorized Initiator Table
1059  */
1060 
1061 CONFIGFS_EATTR_STRUCT(target_stat_scsi_auth_intr, se_ml_stat_grps);
1062 #define DEV_STAT_SCSI_AUTH_INTR_ATTR(_name, _mode)			\
1063 static struct target_stat_scsi_auth_intr_attribute			\
1064 			target_stat_scsi_auth_intr_##_name =		\
1065 	__CONFIGFS_EATTR(_name, _mode,					\
1066 	target_stat_scsi_auth_intr_show_attr_##_name,			\
1067 	target_stat_scsi_auth_intr_store_attr_##_name);
1068 
1069 #define DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(_name)				\
1070 static struct target_stat_scsi_auth_intr_attribute			\
1071 			target_stat_scsi_auth_intr_##_name =		\
1072 	__CONFIGFS_EATTR_RO(_name,					\
1073 	target_stat_scsi_auth_intr_show_attr_##_name);
1074 
1075 static ssize_t target_stat_scsi_auth_intr_show_attr_inst(
1076 	struct se_ml_stat_grps *lgrps, char *page)
1077 {
1078 	struct se_lun_acl *lacl = container_of(lgrps,
1079 			struct se_lun_acl, ml_stat_grps);
1080 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1081 	struct se_dev_entry *deve;
1082 	struct se_portal_group *tpg;
1083 	ssize_t ret;
1084 
1085 	spin_lock_irq(&nacl->device_list_lock);
1086 	deve = nacl->device_list[lacl->mapped_lun];
1087 	if (!deve->se_lun || !deve->se_lun_acl) {
1088 		spin_unlock_irq(&nacl->device_list_lock);
1089 		return -ENODEV;
1090 	}
1091 	tpg = nacl->se_tpg;
1092 	/* scsiInstIndex */
1093 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1094 			tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
1095 	spin_unlock_irq(&nacl->device_list_lock);
1096 	return ret;
1097 }
1098 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(inst);
1099 
1100 static ssize_t target_stat_scsi_auth_intr_show_attr_dev(
1101 	struct se_ml_stat_grps *lgrps, char *page)
1102 {
1103 	struct se_lun_acl *lacl = container_of(lgrps,
1104 			struct se_lun_acl, ml_stat_grps);
1105 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1106 	struct se_dev_entry *deve;
1107 	struct se_lun *lun;
1108 	ssize_t ret;
1109 
1110 	spin_lock_irq(&nacl->device_list_lock);
1111 	deve = nacl->device_list[lacl->mapped_lun];
1112 	if (!deve->se_lun || !deve->se_lun_acl) {
1113 		spin_unlock_irq(&nacl->device_list_lock);
1114 		return -ENODEV;
1115 	}
1116 	lun = deve->se_lun;
1117 	/* scsiDeviceIndex */
1118 	ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_se_dev->dev_index);
1119 	spin_unlock_irq(&nacl->device_list_lock);
1120 	return ret;
1121 }
1122 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev);
1123 
1124 static ssize_t target_stat_scsi_auth_intr_show_attr_port(
1125 	struct se_ml_stat_grps *lgrps, char *page)
1126 {
1127 	struct se_lun_acl *lacl = container_of(lgrps,
1128 			struct se_lun_acl, ml_stat_grps);
1129 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1130 	struct se_dev_entry *deve;
1131 	struct se_portal_group *tpg;
1132 	ssize_t ret;
1133 
1134 	spin_lock_irq(&nacl->device_list_lock);
1135 	deve = nacl->device_list[lacl->mapped_lun];
1136 	if (!deve->se_lun || !deve->se_lun_acl) {
1137 		spin_unlock_irq(&nacl->device_list_lock);
1138 		return -ENODEV;
1139 	}
1140 	tpg = nacl->se_tpg;
1141 	/* scsiAuthIntrTgtPortIndex */
1142 	ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
1143 	spin_unlock_irq(&nacl->device_list_lock);
1144 	return ret;
1145 }
1146 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(port);
1147 
1148 static ssize_t target_stat_scsi_auth_intr_show_attr_indx(
1149 	struct se_ml_stat_grps *lgrps, char *page)
1150 {
1151 	struct se_lun_acl *lacl = container_of(lgrps,
1152 			struct se_lun_acl, ml_stat_grps);
1153 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1154 	struct se_dev_entry *deve;
1155 	ssize_t ret;
1156 
1157 	spin_lock_irq(&nacl->device_list_lock);
1158 	deve = nacl->device_list[lacl->mapped_lun];
1159 	if (!deve->se_lun || !deve->se_lun_acl) {
1160 		spin_unlock_irq(&nacl->device_list_lock);
1161 		return -ENODEV;
1162 	}
1163 	/* scsiAuthIntrIndex */
1164 	ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1165 	spin_unlock_irq(&nacl->device_list_lock);
1166 	return ret;
1167 }
1168 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(indx);
1169 
1170 static ssize_t target_stat_scsi_auth_intr_show_attr_dev_or_port(
1171 	struct se_ml_stat_grps *lgrps, char *page)
1172 {
1173 	struct se_lun_acl *lacl = container_of(lgrps,
1174 			struct se_lun_acl, ml_stat_grps);
1175 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1176 	struct se_dev_entry *deve;
1177 	ssize_t ret;
1178 
1179 	spin_lock_irq(&nacl->device_list_lock);
1180 	deve = nacl->device_list[lacl->mapped_lun];
1181 	if (!deve->se_lun || !deve->se_lun_acl) {
1182 		spin_unlock_irq(&nacl->device_list_lock);
1183 		return -ENODEV;
1184 	}
1185 	/* scsiAuthIntrDevOrPort */
1186 	ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
1187 	spin_unlock_irq(&nacl->device_list_lock);
1188 	return ret;
1189 }
1190 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev_or_port);
1191 
1192 static ssize_t target_stat_scsi_auth_intr_show_attr_intr_name(
1193 	struct se_ml_stat_grps *lgrps, char *page)
1194 {
1195 	struct se_lun_acl *lacl = container_of(lgrps,
1196 			struct se_lun_acl, ml_stat_grps);
1197 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1198 	struct se_dev_entry *deve;
1199 	ssize_t ret;
1200 
1201 	spin_lock_irq(&nacl->device_list_lock);
1202 	deve = nacl->device_list[lacl->mapped_lun];
1203 	if (!deve->se_lun || !deve->se_lun_acl) {
1204 		spin_unlock_irq(&nacl->device_list_lock);
1205 		return -ENODEV;
1206 	}
1207 	/* scsiAuthIntrName */
1208 	ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
1209 	spin_unlock_irq(&nacl->device_list_lock);
1210 	return ret;
1211 }
1212 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(intr_name);
1213 
1214 static ssize_t target_stat_scsi_auth_intr_show_attr_map_indx(
1215 	struct se_ml_stat_grps *lgrps, char *page)
1216 {
1217 	struct se_lun_acl *lacl = container_of(lgrps,
1218 			struct se_lun_acl, ml_stat_grps);
1219 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1220 	struct se_dev_entry *deve;
1221 	ssize_t ret;
1222 
1223 	spin_lock_irq(&nacl->device_list_lock);
1224 	deve = nacl->device_list[lacl->mapped_lun];
1225 	if (!deve->se_lun || !deve->se_lun_acl) {
1226 		spin_unlock_irq(&nacl->device_list_lock);
1227 		return -ENODEV;
1228 	}
1229 	/* FIXME: scsiAuthIntrLunMapIndex */
1230 	ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1231 	spin_unlock_irq(&nacl->device_list_lock);
1232 	return ret;
1233 }
1234 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(map_indx);
1235 
1236 static ssize_t target_stat_scsi_auth_intr_show_attr_att_count(
1237 	struct se_ml_stat_grps *lgrps, char *page)
1238 {
1239 	struct se_lun_acl *lacl = container_of(lgrps,
1240 			struct se_lun_acl, ml_stat_grps);
1241 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1242 	struct se_dev_entry *deve;
1243 	ssize_t ret;
1244 
1245 	spin_lock_irq(&nacl->device_list_lock);
1246 	deve = nacl->device_list[lacl->mapped_lun];
1247 	if (!deve->se_lun || !deve->se_lun_acl) {
1248 		spin_unlock_irq(&nacl->device_list_lock);
1249 		return -ENODEV;
1250 	}
1251 	/* scsiAuthIntrAttachedTimes */
1252 	ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
1253 	spin_unlock_irq(&nacl->device_list_lock);
1254 	return ret;
1255 }
1256 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(att_count);
1257 
1258 static ssize_t target_stat_scsi_auth_intr_show_attr_num_cmds(
1259 	struct se_ml_stat_grps *lgrps, char *page)
1260 {
1261 	struct se_lun_acl *lacl = container_of(lgrps,
1262 			struct se_lun_acl, ml_stat_grps);
1263 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1264 	struct se_dev_entry *deve;
1265 	ssize_t ret;
1266 
1267 	spin_lock_irq(&nacl->device_list_lock);
1268 	deve = nacl->device_list[lacl->mapped_lun];
1269 	if (!deve->se_lun || !deve->se_lun_acl) {
1270 		spin_unlock_irq(&nacl->device_list_lock);
1271 		return -ENODEV;
1272 	}
1273 	/* scsiAuthIntrOutCommands */
1274 	ret = snprintf(page, PAGE_SIZE, "%u\n", deve->total_cmds);
1275 	spin_unlock_irq(&nacl->device_list_lock);
1276 	return ret;
1277 }
1278 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(num_cmds);
1279 
1280 static ssize_t target_stat_scsi_auth_intr_show_attr_read_mbytes(
1281 	struct se_ml_stat_grps *lgrps, char *page)
1282 {
1283 	struct se_lun_acl *lacl = container_of(lgrps,
1284 			struct se_lun_acl, ml_stat_grps);
1285 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1286 	struct se_dev_entry *deve;
1287 	ssize_t ret;
1288 
1289 	spin_lock_irq(&nacl->device_list_lock);
1290 	deve = nacl->device_list[lacl->mapped_lun];
1291 	if (!deve->se_lun || !deve->se_lun_acl) {
1292 		spin_unlock_irq(&nacl->device_list_lock);
1293 		return -ENODEV;
1294 	}
1295 	/* scsiAuthIntrReadMegaBytes */
1296 	ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(deve->read_bytes >> 20));
1297 	spin_unlock_irq(&nacl->device_list_lock);
1298 	return ret;
1299 }
1300 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(read_mbytes);
1301 
1302 static ssize_t target_stat_scsi_auth_intr_show_attr_write_mbytes(
1303 	struct se_ml_stat_grps *lgrps, char *page)
1304 {
1305 	struct se_lun_acl *lacl = container_of(lgrps,
1306 			struct se_lun_acl, ml_stat_grps);
1307 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1308 	struct se_dev_entry *deve;
1309 	ssize_t ret;
1310 
1311 	spin_lock_irq(&nacl->device_list_lock);
1312 	deve = nacl->device_list[lacl->mapped_lun];
1313 	if (!deve->se_lun || !deve->se_lun_acl) {
1314 		spin_unlock_irq(&nacl->device_list_lock);
1315 		return -ENODEV;
1316 	}
1317 	/* scsiAuthIntrWrittenMegaBytes */
1318 	ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(deve->write_bytes >> 20));
1319 	spin_unlock_irq(&nacl->device_list_lock);
1320 	return ret;
1321 }
1322 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(write_mbytes);
1323 
1324 static ssize_t target_stat_scsi_auth_intr_show_attr_hs_num_cmds(
1325 	struct se_ml_stat_grps *lgrps, char *page)
1326 {
1327 	struct se_lun_acl *lacl = container_of(lgrps,
1328 			struct se_lun_acl, ml_stat_grps);
1329 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1330 	struct se_dev_entry *deve;
1331 	ssize_t ret;
1332 
1333 	spin_lock_irq(&nacl->device_list_lock);
1334 	deve = nacl->device_list[lacl->mapped_lun];
1335 	if (!deve->se_lun || !deve->se_lun_acl) {
1336 		spin_unlock_irq(&nacl->device_list_lock);
1337 		return -ENODEV;
1338 	}
1339 	/* FIXME: scsiAuthIntrHSOutCommands */
1340 	ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1341 	spin_unlock_irq(&nacl->device_list_lock);
1342 	return ret;
1343 }
1344 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(hs_num_cmds);
1345 
1346 static ssize_t target_stat_scsi_auth_intr_show_attr_creation_time(
1347 	struct se_ml_stat_grps *lgrps, char *page)
1348 {
1349 	struct se_lun_acl *lacl = container_of(lgrps,
1350 			struct se_lun_acl, ml_stat_grps);
1351 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1352 	struct se_dev_entry *deve;
1353 	ssize_t ret;
1354 
1355 	spin_lock_irq(&nacl->device_list_lock);
1356 	deve = nacl->device_list[lacl->mapped_lun];
1357 	if (!deve->se_lun || !deve->se_lun_acl) {
1358 		spin_unlock_irq(&nacl->device_list_lock);
1359 		return -ENODEV;
1360 	}
1361 	/* scsiAuthIntrLastCreation */
1362 	ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
1363 				INITIAL_JIFFIES) * 100 / HZ));
1364 	spin_unlock_irq(&nacl->device_list_lock);
1365 	return ret;
1366 }
1367 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(creation_time);
1368 
1369 static ssize_t target_stat_scsi_auth_intr_show_attr_row_status(
1370 	struct se_ml_stat_grps *lgrps, char *page)
1371 {
1372 	struct se_lun_acl *lacl = container_of(lgrps,
1373 			struct se_lun_acl, ml_stat_grps);
1374 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1375 	struct se_dev_entry *deve;
1376 	ssize_t ret;
1377 
1378 	spin_lock_irq(&nacl->device_list_lock);
1379 	deve = nacl->device_list[lacl->mapped_lun];
1380 	if (!deve->se_lun || !deve->se_lun_acl) {
1381 		spin_unlock_irq(&nacl->device_list_lock);
1382 		return -ENODEV;
1383 	}
1384 	/* FIXME: scsiAuthIntrRowStatus */
1385 	ret = snprintf(page, PAGE_SIZE, "Ready\n");
1386 	spin_unlock_irq(&nacl->device_list_lock);
1387 	return ret;
1388 }
1389 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(row_status);
1390 
1391 CONFIGFS_EATTR_OPS(target_stat_scsi_auth_intr, se_ml_stat_grps,
1392 		scsi_auth_intr_group);
1393 
1394 static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
1395 	&target_stat_scsi_auth_intr_inst.attr,
1396 	&target_stat_scsi_auth_intr_dev.attr,
1397 	&target_stat_scsi_auth_intr_port.attr,
1398 	&target_stat_scsi_auth_intr_indx.attr,
1399 	&target_stat_scsi_auth_intr_dev_or_port.attr,
1400 	&target_stat_scsi_auth_intr_intr_name.attr,
1401 	&target_stat_scsi_auth_intr_map_indx.attr,
1402 	&target_stat_scsi_auth_intr_att_count.attr,
1403 	&target_stat_scsi_auth_intr_num_cmds.attr,
1404 	&target_stat_scsi_auth_intr_read_mbytes.attr,
1405 	&target_stat_scsi_auth_intr_write_mbytes.attr,
1406 	&target_stat_scsi_auth_intr_hs_num_cmds.attr,
1407 	&target_stat_scsi_auth_intr_creation_time.attr,
1408 	&target_stat_scsi_auth_intr_row_status.attr,
1409 	NULL,
1410 };
1411 
1412 static struct configfs_item_operations target_stat_scsi_auth_intr_attrib_ops = {
1413 	.show_attribute		= target_stat_scsi_auth_intr_attr_show,
1414 	.store_attribute	= target_stat_scsi_auth_intr_attr_store,
1415 };
1416 
1417 static struct config_item_type target_stat_scsi_auth_intr_cit = {
1418 	.ct_item_ops		= &target_stat_scsi_auth_intr_attrib_ops,
1419 	.ct_attrs		= target_stat_scsi_auth_intr_attrs,
1420 	.ct_owner		= THIS_MODULE,
1421 };
1422 
1423 /*
1424  * SCSI Attached Initiator Port Table
1425  */
1426 
1427 CONFIGFS_EATTR_STRUCT(target_stat_scsi_att_intr_port, se_ml_stat_grps);
1428 #define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR(_name, _mode)			\
1429 static struct target_stat_scsi_att_intr_port_attribute			\
1430 		target_stat_scsi_att_intr_port_##_name =		\
1431 	__CONFIGFS_EATTR(_name, _mode,					\
1432 	target_stat_scsi_att_intr_port_show_attr_##_name,		\
1433 	target_stat_scsi_att_intr_port_store_attr_##_name);
1434 
1435 #define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(_name)			\
1436 static struct target_stat_scsi_att_intr_port_attribute			\
1437 		target_stat_scsi_att_intr_port_##_name =		\
1438 	__CONFIGFS_EATTR_RO(_name,					\
1439 	target_stat_scsi_att_intr_port_show_attr_##_name);
1440 
1441 static ssize_t target_stat_scsi_att_intr_port_show_attr_inst(
1442 	struct se_ml_stat_grps *lgrps, char *page)
1443 {
1444 	struct se_lun_acl *lacl = container_of(lgrps,
1445 			struct se_lun_acl, ml_stat_grps);
1446 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1447 	struct se_dev_entry *deve;
1448 	struct se_portal_group *tpg;
1449 	ssize_t ret;
1450 
1451 	spin_lock_irq(&nacl->device_list_lock);
1452 	deve = nacl->device_list[lacl->mapped_lun];
1453 	if (!deve->se_lun || !deve->se_lun_acl) {
1454 		spin_unlock_irq(&nacl->device_list_lock);
1455 		return -ENODEV;
1456 	}
1457 	tpg = nacl->se_tpg;
1458 	/* scsiInstIndex */
1459 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1460 			tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
1461 	spin_unlock_irq(&nacl->device_list_lock);
1462 	return ret;
1463 }
1464 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(inst);
1465 
1466 static ssize_t target_stat_scsi_att_intr_port_show_attr_dev(
1467 	struct se_ml_stat_grps *lgrps, char *page)
1468 {
1469 	struct se_lun_acl *lacl = container_of(lgrps,
1470 			struct se_lun_acl, ml_stat_grps);
1471 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1472 	struct se_dev_entry *deve;
1473 	struct se_lun *lun;
1474 	ssize_t ret;
1475 
1476 	spin_lock_irq(&nacl->device_list_lock);
1477 	deve = nacl->device_list[lacl->mapped_lun];
1478 	if (!deve->se_lun || !deve->se_lun_acl) {
1479 		spin_unlock_irq(&nacl->device_list_lock);
1480 		return -ENODEV;
1481 	}
1482 	lun = deve->se_lun;
1483 	/* scsiDeviceIndex */
1484 	ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_se_dev->dev_index);
1485 	spin_unlock_irq(&nacl->device_list_lock);
1486 	return ret;
1487 }
1488 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(dev);
1489 
1490 static ssize_t target_stat_scsi_att_intr_port_show_attr_port(
1491 	struct se_ml_stat_grps *lgrps, char *page)
1492 {
1493 	struct se_lun_acl *lacl = container_of(lgrps,
1494 			struct se_lun_acl, ml_stat_grps);
1495 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1496 	struct se_dev_entry *deve;
1497 	struct se_portal_group *tpg;
1498 	ssize_t ret;
1499 
1500 	spin_lock_irq(&nacl->device_list_lock);
1501 	deve = nacl->device_list[lacl->mapped_lun];
1502 	if (!deve->se_lun || !deve->se_lun_acl) {
1503 		spin_unlock_irq(&nacl->device_list_lock);
1504 		return -ENODEV;
1505 	}
1506 	tpg = nacl->se_tpg;
1507 	/* scsiPortIndex */
1508 	ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
1509 	spin_unlock_irq(&nacl->device_list_lock);
1510 	return ret;
1511 }
1512 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port);
1513 
1514 static ssize_t target_stat_scsi_att_intr_port_show_attr_indx(
1515 	struct se_ml_stat_grps *lgrps, char *page)
1516 {
1517 	struct se_lun_acl *lacl = container_of(lgrps,
1518 			struct se_lun_acl, ml_stat_grps);
1519 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1520 	struct se_session *se_sess;
1521 	struct se_portal_group *tpg;
1522 	ssize_t ret;
1523 
1524 	spin_lock_irq(&nacl->nacl_sess_lock);
1525 	se_sess = nacl->nacl_sess;
1526 	if (!se_sess) {
1527 		spin_unlock_irq(&nacl->nacl_sess_lock);
1528 		return -ENODEV;
1529 	}
1530 
1531 	tpg = nacl->se_tpg;
1532 	/* scsiAttIntrPortIndex */
1533 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1534 			tpg->se_tpg_tfo->sess_get_index(se_sess));
1535 	spin_unlock_irq(&nacl->nacl_sess_lock);
1536 	return ret;
1537 }
1538 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(indx);
1539 
1540 static ssize_t target_stat_scsi_att_intr_port_show_attr_port_auth_indx(
1541 	struct se_ml_stat_grps *lgrps, char *page)
1542 {
1543 	struct se_lun_acl *lacl = container_of(lgrps,
1544 			struct se_lun_acl, ml_stat_grps);
1545 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1546 	struct se_dev_entry *deve;
1547 	ssize_t ret;
1548 
1549 	spin_lock_irq(&nacl->device_list_lock);
1550 	deve = nacl->device_list[lacl->mapped_lun];
1551 	if (!deve->se_lun || !deve->se_lun_acl) {
1552 		spin_unlock_irq(&nacl->device_list_lock);
1553 		return -ENODEV;
1554 	}
1555 	/* scsiAttIntrPortAuthIntrIdx */
1556 	ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1557 	spin_unlock_irq(&nacl->device_list_lock);
1558 	return ret;
1559 }
1560 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_auth_indx);
1561 
1562 static ssize_t target_stat_scsi_att_intr_port_show_attr_port_ident(
1563 	struct se_ml_stat_grps *lgrps, char *page)
1564 {
1565 	struct se_lun_acl *lacl = container_of(lgrps,
1566 			struct se_lun_acl, ml_stat_grps);
1567 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1568 	struct se_session *se_sess;
1569 	struct se_portal_group *tpg;
1570 	ssize_t ret;
1571 	unsigned char buf[64];
1572 
1573 	spin_lock_irq(&nacl->nacl_sess_lock);
1574 	se_sess = nacl->nacl_sess;
1575 	if (!se_sess) {
1576 		spin_unlock_irq(&nacl->nacl_sess_lock);
1577 		return -ENODEV;
1578 	}
1579 
1580 	tpg = nacl->se_tpg;
1581 	/* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1582 	memset(buf, 0, 64);
1583 	if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
1584 		tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
1585 
1586 	ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
1587 	spin_unlock_irq(&nacl->nacl_sess_lock);
1588 	return ret;
1589 }
1590 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_ident);
1591 
1592 CONFIGFS_EATTR_OPS(target_stat_scsi_att_intr_port, se_ml_stat_grps,
1593 		scsi_att_intr_port_group);
1594 
1595 static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
1596 	&target_stat_scsi_att_intr_port_inst.attr,
1597 	&target_stat_scsi_att_intr_port_dev.attr,
1598 	&target_stat_scsi_att_intr_port_port.attr,
1599 	&target_stat_scsi_att_intr_port_indx.attr,
1600 	&target_stat_scsi_att_intr_port_port_auth_indx.attr,
1601 	&target_stat_scsi_att_intr_port_port_ident.attr,
1602 	NULL,
1603 };
1604 
1605 static struct configfs_item_operations target_stat_scsi_att_intr_port_attrib_ops = {
1606 	.show_attribute		= target_stat_scsi_att_intr_port_attr_show,
1607 	.store_attribute	= target_stat_scsi_att_intr_port_attr_store,
1608 };
1609 
1610 static struct config_item_type target_stat_scsi_att_intr_port_cit = {
1611 	.ct_item_ops		= &target_stat_scsi_att_intr_port_attrib_ops,
1612 	.ct_attrs		= target_stat_scsi_ath_intr_port_attrs,
1613 	.ct_owner		= THIS_MODULE,
1614 };
1615 
1616 /*
1617  * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
1618  * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
1619  */
1620 void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
1621 {
1622 	struct config_group *ml_stat_grp = &lacl->ml_stat_grps.stat_group;
1623 
1624 	config_group_init_type_name(&lacl->ml_stat_grps.scsi_auth_intr_group,
1625 			"scsi_auth_intr", &target_stat_scsi_auth_intr_cit);
1626 	config_group_init_type_name(&lacl->ml_stat_grps.scsi_att_intr_port_group,
1627 			"scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit);
1628 
1629 	ml_stat_grp->default_groups[0] = &lacl->ml_stat_grps.scsi_auth_intr_group;
1630 	ml_stat_grp->default_groups[1] = &lacl->ml_stat_grps.scsi_att_intr_port_group;
1631 	ml_stat_grp->default_groups[2] = NULL;
1632 }
1633