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 
41 #include "target_core_internal.h"
42 
43 #ifndef INITIAL_JIFFIES
44 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
45 #endif
46 
47 #define NONE		"None"
48 #define ISPRINT(a)   ((a >= ' ') && (a <= '~'))
49 
50 #define SCSI_LU_INDEX			1
51 #define LU_COUNT			1
52 
53 /*
54  * SCSI Device Table
55  */
56 
57 static struct se_device *to_stat_dev(struct config_item *item)
58 {
59 	struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
60 			struct se_dev_stat_grps, scsi_dev_group);
61 	return container_of(sgrps, struct se_device, dev_stat_grps);
62 }
63 
64 static ssize_t target_stat_inst_show(struct config_item *item, char *page)
65 {
66 	struct se_hba *hba = to_stat_dev(item)->se_hba;
67 
68 	return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
69 }
70 
71 static ssize_t target_stat_indx_show(struct config_item *item, char *page)
72 {
73 	return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->dev_index);
74 }
75 
76 static ssize_t target_stat_role_show(struct config_item *item, char *page)
77 {
78 	return snprintf(page, PAGE_SIZE, "Target\n");
79 }
80 
81 static ssize_t target_stat_ports_show(struct config_item *item, char *page)
82 {
83 	return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->export_count);
84 }
85 
86 CONFIGFS_ATTR_RO(target_stat_, inst);
87 CONFIGFS_ATTR_RO(target_stat_, indx);
88 CONFIGFS_ATTR_RO(target_stat_, role);
89 CONFIGFS_ATTR_RO(target_stat_, ports);
90 
91 static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
92 	&target_stat_attr_inst,
93 	&target_stat_attr_indx,
94 	&target_stat_attr_role,
95 	&target_stat_attr_ports,
96 	NULL,
97 };
98 
99 static struct config_item_type target_stat_scsi_dev_cit = {
100 	.ct_attrs		= target_stat_scsi_dev_attrs,
101 	.ct_owner		= THIS_MODULE,
102 };
103 
104 /*
105  * SCSI Target Device Table
106  */
107 static struct se_device *to_stat_tgt_dev(struct config_item *item)
108 {
109 	struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
110 			struct se_dev_stat_grps, scsi_tgt_dev_group);
111 	return container_of(sgrps, struct se_device, dev_stat_grps);
112 }
113 
114 static ssize_t target_stat_tgt_inst_show(struct config_item *item, char *page)
115 {
116 	struct se_hba *hba = to_stat_tgt_dev(item)->se_hba;
117 
118 	return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
119 }
120 
121 static ssize_t target_stat_tgt_indx_show(struct config_item *item, char *page)
122 {
123 	return snprintf(page, PAGE_SIZE, "%u\n", to_stat_tgt_dev(item)->dev_index);
124 }
125 
126 static ssize_t target_stat_tgt_num_lus_show(struct config_item *item,
127 		char *page)
128 {
129 	return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
130 }
131 
132 static ssize_t target_stat_tgt_status_show(struct config_item *item,
133 		char *page)
134 {
135 	if (to_stat_tgt_dev(item)->export_count)
136 		return snprintf(page, PAGE_SIZE, "activated");
137 	else
138 		return snprintf(page, PAGE_SIZE, "deactivated");
139 }
140 
141 static ssize_t target_stat_tgt_non_access_lus_show(struct config_item *item,
142 		char *page)
143 {
144 	int non_accessible_lus;
145 
146 	if (to_stat_tgt_dev(item)->export_count)
147 		non_accessible_lus = 0;
148 	else
149 		non_accessible_lus = 1;
150 
151 	return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
152 }
153 
154 static ssize_t target_stat_tgt_resets_show(struct config_item *item,
155 		char *page)
156 {
157 	return snprintf(page, PAGE_SIZE, "%lu\n",
158 			atomic_long_read(&to_stat_tgt_dev(item)->num_resets));
159 }
160 
161 CONFIGFS_ATTR_RO(target_stat_tgt_, inst);
162 CONFIGFS_ATTR_RO(target_stat_tgt_, indx);
163 CONFIGFS_ATTR_RO(target_stat_tgt_, num_lus);
164 CONFIGFS_ATTR_RO(target_stat_tgt_, status);
165 CONFIGFS_ATTR_RO(target_stat_tgt_, non_access_lus);
166 CONFIGFS_ATTR_RO(target_stat_tgt_, resets);
167 
168 static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
169 	&target_stat_tgt_attr_inst,
170 	&target_stat_tgt_attr_indx,
171 	&target_stat_tgt_attr_num_lus,
172 	&target_stat_tgt_attr_status,
173 	&target_stat_tgt_attr_non_access_lus,
174 	&target_stat_tgt_attr_resets,
175 	NULL,
176 };
177 
178 static struct config_item_type target_stat_scsi_tgt_dev_cit = {
179 	.ct_attrs		= target_stat_scsi_tgt_dev_attrs,
180 	.ct_owner		= THIS_MODULE,
181 };
182 
183 /*
184  * SCSI Logical Unit Table
185  */
186 
187 static struct se_device *to_stat_lu_dev(struct config_item *item)
188 {
189 	struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
190 			struct se_dev_stat_grps, scsi_lu_group);
191 	return container_of(sgrps, struct se_device, dev_stat_grps);
192 }
193 
194 static ssize_t target_stat_lu_inst_show(struct config_item *item, char *page)
195 {
196 	struct se_hba *hba = to_stat_lu_dev(item)->se_hba;
197 
198 	return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
199 }
200 
201 static ssize_t target_stat_lu_dev_show(struct config_item *item, char *page)
202 {
203 	return snprintf(page, PAGE_SIZE, "%u\n",
204 			to_stat_lu_dev(item)->dev_index);
205 }
206 
207 static ssize_t target_stat_lu_indx_show(struct config_item *item, char *page)
208 {
209 	return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
210 }
211 
212 static ssize_t target_stat_lu_lun_show(struct config_item *item, char *page)
213 {
214 	/* FIXME: scsiLuDefaultLun */
215 	return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
216 }
217 
218 static ssize_t target_stat_lu_lu_name_show(struct config_item *item, char *page)
219 {
220 	struct se_device *dev = to_stat_lu_dev(item);
221 
222 	/* scsiLuWwnName */
223 	return snprintf(page, PAGE_SIZE, "%s\n",
224 			(strlen(dev->t10_wwn.unit_serial)) ?
225 			dev->t10_wwn.unit_serial : "None");
226 }
227 
228 static ssize_t target_stat_lu_vend_show(struct config_item *item, char *page)
229 {
230 	struct se_device *dev = to_stat_lu_dev(item);
231 	int i;
232 	char str[sizeof(dev->t10_wwn.vendor)+1];
233 
234 	/* scsiLuVendorId */
235 	for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
236 		str[i] = ISPRINT(dev->t10_wwn.vendor[i]) ?
237 			dev->t10_wwn.vendor[i] : ' ';
238 	str[i] = '\0';
239 	return snprintf(page, PAGE_SIZE, "%s\n", str);
240 }
241 
242 static ssize_t target_stat_lu_prod_show(struct config_item *item, char *page)
243 {
244 	struct se_device *dev = to_stat_lu_dev(item);
245 	int i;
246 	char str[sizeof(dev->t10_wwn.model)+1];
247 
248 	/* scsiLuProductId */
249 	for (i = 0; i < sizeof(dev->t10_wwn.model); i++)
250 		str[i] = ISPRINT(dev->t10_wwn.model[i]) ?
251 			dev->t10_wwn.model[i] : ' ';
252 	str[i] = '\0';
253 	return snprintf(page, PAGE_SIZE, "%s\n", str);
254 }
255 
256 static ssize_t target_stat_lu_rev_show(struct config_item *item, char *page)
257 {
258 	struct se_device *dev = to_stat_lu_dev(item);
259 	int i;
260 	char str[sizeof(dev->t10_wwn.revision)+1];
261 
262 	/* scsiLuRevisionId */
263 	for (i = 0; i < sizeof(dev->t10_wwn.revision); i++)
264 		str[i] = ISPRINT(dev->t10_wwn.revision[i]) ?
265 			dev->t10_wwn.revision[i] : ' ';
266 	str[i] = '\0';
267 	return snprintf(page, PAGE_SIZE, "%s\n", str);
268 }
269 
270 static ssize_t target_stat_lu_dev_type_show(struct config_item *item, char *page)
271 {
272 	struct se_device *dev = to_stat_lu_dev(item);
273 
274 	/* scsiLuPeripheralType */
275 	return snprintf(page, PAGE_SIZE, "%u\n",
276 			dev->transport->get_device_type(dev));
277 }
278 
279 static ssize_t target_stat_lu_status_show(struct config_item *item, char *page)
280 {
281 	struct se_device *dev = to_stat_lu_dev(item);
282 
283 	/* scsiLuStatus */
284 	return snprintf(page, PAGE_SIZE, "%s\n",
285 		(dev->export_count) ? "available" : "notavailable");
286 }
287 
288 static ssize_t target_stat_lu_state_bit_show(struct config_item *item,
289 		char *page)
290 {
291 	/* scsiLuState */
292 	return snprintf(page, PAGE_SIZE, "exposed\n");
293 }
294 
295 static ssize_t target_stat_lu_num_cmds_show(struct config_item *item,
296 		char *page)
297 {
298 	struct se_device *dev = to_stat_lu_dev(item);
299 
300 	/* scsiLuNumCommands */
301 	return snprintf(page, PAGE_SIZE, "%lu\n",
302 			atomic_long_read(&dev->num_cmds));
303 }
304 
305 static ssize_t target_stat_lu_read_mbytes_show(struct config_item *item,
306 		char *page)
307 {
308 	struct se_device *dev = to_stat_lu_dev(item);
309 
310 	/* scsiLuReadMegaBytes */
311 	return snprintf(page, PAGE_SIZE, "%lu\n",
312 			atomic_long_read(&dev->read_bytes) >> 20);
313 }
314 
315 static ssize_t target_stat_lu_write_mbytes_show(struct config_item *item,
316 		char *page)
317 {
318 	struct se_device *dev = to_stat_lu_dev(item);
319 
320 	/* scsiLuWrittenMegaBytes */
321 	return snprintf(page, PAGE_SIZE, "%lu\n",
322 			atomic_long_read(&dev->write_bytes) >> 20);
323 }
324 
325 static ssize_t target_stat_lu_resets_show(struct config_item *item, char *page)
326 {
327 	struct se_device *dev = to_stat_lu_dev(item);
328 
329 	/* scsiLuInResets */
330 	return snprintf(page, PAGE_SIZE, "%lu\n",
331 		atomic_long_read(&dev->num_resets));
332 }
333 
334 static ssize_t target_stat_lu_full_stat_show(struct config_item *item,
335 		char *page)
336 {
337 	/* FIXME: scsiLuOutTaskSetFullStatus */
338 	return snprintf(page, PAGE_SIZE, "%u\n", 0);
339 }
340 
341 static ssize_t target_stat_lu_hs_num_cmds_show(struct config_item *item,
342 		char *page)
343 {
344 	/* FIXME: scsiLuHSInCommands */
345 	return snprintf(page, PAGE_SIZE, "%u\n", 0);
346 }
347 
348 static ssize_t target_stat_lu_creation_time_show(struct config_item *item,
349 		char *page)
350 {
351 	struct se_device *dev = to_stat_lu_dev(item);
352 
353 	/* scsiLuCreationTime */
354 	return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
355 				INITIAL_JIFFIES) * 100 / HZ));
356 }
357 
358 CONFIGFS_ATTR_RO(target_stat_lu_, inst);
359 CONFIGFS_ATTR_RO(target_stat_lu_, dev);
360 CONFIGFS_ATTR_RO(target_stat_lu_, indx);
361 CONFIGFS_ATTR_RO(target_stat_lu_, lun);
362 CONFIGFS_ATTR_RO(target_stat_lu_, lu_name);
363 CONFIGFS_ATTR_RO(target_stat_lu_, vend);
364 CONFIGFS_ATTR_RO(target_stat_lu_, prod);
365 CONFIGFS_ATTR_RO(target_stat_lu_, rev);
366 CONFIGFS_ATTR_RO(target_stat_lu_, dev_type);
367 CONFIGFS_ATTR_RO(target_stat_lu_, status);
368 CONFIGFS_ATTR_RO(target_stat_lu_, state_bit);
369 CONFIGFS_ATTR_RO(target_stat_lu_, num_cmds);
370 CONFIGFS_ATTR_RO(target_stat_lu_, read_mbytes);
371 CONFIGFS_ATTR_RO(target_stat_lu_, write_mbytes);
372 CONFIGFS_ATTR_RO(target_stat_lu_, resets);
373 CONFIGFS_ATTR_RO(target_stat_lu_, full_stat);
374 CONFIGFS_ATTR_RO(target_stat_lu_, hs_num_cmds);
375 CONFIGFS_ATTR_RO(target_stat_lu_, creation_time);
376 
377 static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
378 	&target_stat_lu_attr_inst,
379 	&target_stat_lu_attr_dev,
380 	&target_stat_lu_attr_indx,
381 	&target_stat_lu_attr_lun,
382 	&target_stat_lu_attr_lu_name,
383 	&target_stat_lu_attr_vend,
384 	&target_stat_lu_attr_prod,
385 	&target_stat_lu_attr_rev,
386 	&target_stat_lu_attr_dev_type,
387 	&target_stat_lu_attr_status,
388 	&target_stat_lu_attr_state_bit,
389 	&target_stat_lu_attr_num_cmds,
390 	&target_stat_lu_attr_read_mbytes,
391 	&target_stat_lu_attr_write_mbytes,
392 	&target_stat_lu_attr_resets,
393 	&target_stat_lu_attr_full_stat,
394 	&target_stat_lu_attr_hs_num_cmds,
395 	&target_stat_lu_attr_creation_time,
396 	NULL,
397 };
398 
399 static struct config_item_type target_stat_scsi_lu_cit = {
400 	.ct_attrs		= target_stat_scsi_lu_attrs,
401 	.ct_owner		= THIS_MODULE,
402 };
403 
404 /*
405  * Called from target_core_configfs.c:target_core_make_subdev() to setup
406  * the target statistics groups + configfs CITs located in target_core_stat.c
407  */
408 void target_stat_setup_dev_default_groups(struct se_device *dev)
409 {
410 	struct config_group *dev_stat_grp = &dev->dev_stat_grps.stat_group;
411 
412 	config_group_init_type_name(&dev->dev_stat_grps.scsi_dev_group,
413 			"scsi_dev", &target_stat_scsi_dev_cit);
414 	config_group_init_type_name(&dev->dev_stat_grps.scsi_tgt_dev_group,
415 			"scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit);
416 	config_group_init_type_name(&dev->dev_stat_grps.scsi_lu_group,
417 			"scsi_lu", &target_stat_scsi_lu_cit);
418 
419 	dev_stat_grp->default_groups[0] = &dev->dev_stat_grps.scsi_dev_group;
420 	dev_stat_grp->default_groups[1] = &dev->dev_stat_grps.scsi_tgt_dev_group;
421 	dev_stat_grp->default_groups[2] = &dev->dev_stat_grps.scsi_lu_group;
422 	dev_stat_grp->default_groups[3] = NULL;
423 }
424 
425 /*
426  * SCSI Port Table
427  */
428 
429 static struct se_lun *to_stat_port(struct config_item *item)
430 {
431 	struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
432 			struct se_port_stat_grps, scsi_port_group);
433 	return container_of(pgrps, struct se_lun, port_stat_grps);
434 }
435 
436 static ssize_t target_stat_port_inst_show(struct config_item *item, char *page)
437 {
438 	struct se_lun *lun = to_stat_port(item);
439 	struct se_device *dev;
440 	ssize_t ret = -ENODEV;
441 
442 	rcu_read_lock();
443 	dev = rcu_dereference(lun->lun_se_dev);
444 	if (dev)
445 		ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
446 	rcu_read_unlock();
447 	return ret;
448 }
449 
450 static ssize_t target_stat_port_dev_show(struct config_item *item, char *page)
451 {
452 	struct se_lun *lun = to_stat_port(item);
453 	struct se_device *dev;
454 	ssize_t ret = -ENODEV;
455 
456 	rcu_read_lock();
457 	dev = rcu_dereference(lun->lun_se_dev);
458 	if (dev)
459 		ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
460 	rcu_read_unlock();
461 	return ret;
462 }
463 
464 static ssize_t target_stat_port_indx_show(struct config_item *item, char *page)
465 {
466 	struct se_lun *lun = to_stat_port(item);
467 	struct se_device *dev;
468 	ssize_t ret = -ENODEV;
469 
470 	rcu_read_lock();
471 	dev = rcu_dereference(lun->lun_se_dev);
472 	if (dev)
473 		ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
474 	rcu_read_unlock();
475 	return ret;
476 }
477 
478 static ssize_t target_stat_port_role_show(struct config_item *item, char *page)
479 {
480 	struct se_lun *lun = to_stat_port(item);
481 	struct se_device *dev;
482 	ssize_t ret = -ENODEV;
483 
484 	rcu_read_lock();
485 	dev = rcu_dereference(lun->lun_se_dev);
486 	if (dev)
487 		ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
488 	rcu_read_unlock();
489 	return ret;
490 }
491 
492 static ssize_t target_stat_port_busy_count_show(struct config_item *item,
493 		char *page)
494 {
495 	struct se_lun *lun = to_stat_port(item);
496 	struct se_device *dev;
497 	ssize_t ret = -ENODEV;
498 
499 	rcu_read_lock();
500 	dev = rcu_dereference(lun->lun_se_dev);
501 	if (dev) {
502 		/* FIXME: scsiPortBusyStatuses  */
503 		ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
504 	}
505 	rcu_read_unlock();
506 	return ret;
507 }
508 
509 CONFIGFS_ATTR_RO(target_stat_port_, inst);
510 CONFIGFS_ATTR_RO(target_stat_port_, dev);
511 CONFIGFS_ATTR_RO(target_stat_port_, indx);
512 CONFIGFS_ATTR_RO(target_stat_port_, role);
513 CONFIGFS_ATTR_RO(target_stat_port_, busy_count);
514 
515 static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
516 	&target_stat_port_attr_inst,
517 	&target_stat_port_attr_dev,
518 	&target_stat_port_attr_indx,
519 	&target_stat_port_attr_role,
520 	&target_stat_port_attr_busy_count,
521 	NULL,
522 };
523 
524 static struct config_item_type target_stat_scsi_port_cit = {
525 	.ct_attrs		= target_stat_scsi_port_attrs,
526 	.ct_owner		= THIS_MODULE,
527 };
528 
529 /*
530  * SCSI Target Port Table
531  */
532 static struct se_lun *to_stat_tgt_port(struct config_item *item)
533 {
534 	struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
535 			struct se_port_stat_grps, scsi_tgt_port_group);
536 	return container_of(pgrps, struct se_lun, port_stat_grps);
537 }
538 
539 static ssize_t target_stat_tgt_port_inst_show(struct config_item *item,
540 		char *page)
541 {
542 	struct se_lun *lun = to_stat_tgt_port(item);
543 	struct se_device *dev;
544 	ssize_t ret = -ENODEV;
545 
546 	rcu_read_lock();
547 	dev = rcu_dereference(lun->lun_se_dev);
548 	if (dev)
549 		ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
550 	rcu_read_unlock();
551 	return ret;
552 }
553 
554 static ssize_t target_stat_tgt_port_dev_show(struct config_item *item,
555 		char *page)
556 {
557 	struct se_lun *lun = to_stat_tgt_port(item);
558 	struct se_device *dev;
559 	ssize_t ret = -ENODEV;
560 
561 	rcu_read_lock();
562 	dev = rcu_dereference(lun->lun_se_dev);
563 	if (dev)
564 		ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
565 	rcu_read_unlock();
566 	return ret;
567 }
568 
569 static ssize_t target_stat_tgt_port_indx_show(struct config_item *item,
570 		char *page)
571 {
572 	struct se_lun *lun = to_stat_tgt_port(item);
573 	struct se_device *dev;
574 	ssize_t ret = -ENODEV;
575 
576 	rcu_read_lock();
577 	dev = rcu_dereference(lun->lun_se_dev);
578 	if (dev)
579 		ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
580 	rcu_read_unlock();
581 	return ret;
582 }
583 
584 static ssize_t target_stat_tgt_port_name_show(struct config_item *item,
585 		char *page)
586 {
587 	struct se_lun *lun = to_stat_tgt_port(item);
588 	struct se_portal_group *tpg = lun->lun_tpg;
589 	struct se_device *dev;
590 	ssize_t ret = -ENODEV;
591 
592 	rcu_read_lock();
593 	dev = rcu_dereference(lun->lun_se_dev);
594 	if (dev)
595 		ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
596 			tpg->se_tpg_tfo->get_fabric_name(),
597 			lun->lun_rtpi);
598 	rcu_read_unlock();
599 	return ret;
600 }
601 
602 static ssize_t target_stat_tgt_port_port_index_show(struct config_item *item,
603 		char *page)
604 {
605 	struct se_lun *lun = to_stat_tgt_port(item);
606 	struct se_portal_group *tpg = lun->lun_tpg;
607 	struct se_device *dev;
608 	ssize_t ret = -ENODEV;
609 
610 	rcu_read_lock();
611 	dev = rcu_dereference(lun->lun_se_dev);
612 	if (dev)
613 		ret = snprintf(page, PAGE_SIZE, "%s%s%d\n",
614 			tpg->se_tpg_tfo->tpg_get_wwn(tpg), "+t+",
615 			tpg->se_tpg_tfo->tpg_get_tag(tpg));
616 	rcu_read_unlock();
617 	return ret;
618 }
619 
620 static ssize_t target_stat_tgt_port_in_cmds_show(struct config_item *item,
621 		char *page)
622 {
623 	struct se_lun *lun = to_stat_tgt_port(item);
624 	struct se_device *dev;
625 	ssize_t ret = -ENODEV;
626 
627 	rcu_read_lock();
628 	dev = rcu_dereference(lun->lun_se_dev);
629 	if (dev)
630 		ret = snprintf(page, PAGE_SIZE, "%lu\n",
631 			       atomic_long_read(&lun->lun_stats.cmd_pdus));
632 	rcu_read_unlock();
633 	return ret;
634 }
635 
636 static ssize_t target_stat_tgt_port_write_mbytes_show(struct config_item *item,
637 		char *page)
638 {
639 	struct se_lun *lun = to_stat_tgt_port(item);
640 	struct se_device *dev;
641 	ssize_t ret = -ENODEV;
642 
643 	rcu_read_lock();
644 	dev = rcu_dereference(lun->lun_se_dev);
645 	if (dev)
646 		ret = snprintf(page, PAGE_SIZE, "%u\n",
647 			(u32)(atomic_long_read(&lun->lun_stats.rx_data_octets) >> 20));
648 	rcu_read_unlock();
649 	return ret;
650 }
651 
652 static ssize_t target_stat_tgt_port_read_mbytes_show(struct config_item *item,
653 		char *page)
654 {
655 	struct se_lun *lun = to_stat_tgt_port(item);
656 	struct se_device *dev;
657 	ssize_t ret = -ENODEV;
658 
659 	rcu_read_lock();
660 	dev = rcu_dereference(lun->lun_se_dev);
661 	if (dev)
662 		ret = snprintf(page, PAGE_SIZE, "%u\n",
663 				(u32)(atomic_long_read(&lun->lun_stats.tx_data_octets) >> 20));
664 	rcu_read_unlock();
665 	return ret;
666 }
667 
668 static ssize_t target_stat_tgt_port_hs_in_cmds_show(struct config_item *item,
669 		char *page)
670 {
671 	struct se_lun *lun = to_stat_tgt_port(item);
672 	struct se_device *dev;
673 	ssize_t ret = -ENODEV;
674 
675 	rcu_read_lock();
676 	dev = rcu_dereference(lun->lun_se_dev);
677 	if (dev) {
678 		/* FIXME: scsiTgtPortHsInCommands */
679 		ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
680 	}
681 	rcu_read_unlock();
682 	return ret;
683 }
684 
685 CONFIGFS_ATTR_RO(target_stat_tgt_port_, inst);
686 CONFIGFS_ATTR_RO(target_stat_tgt_port_, dev);
687 CONFIGFS_ATTR_RO(target_stat_tgt_port_, indx);
688 CONFIGFS_ATTR_RO(target_stat_tgt_port_, name);
689 CONFIGFS_ATTR_RO(target_stat_tgt_port_, port_index);
690 CONFIGFS_ATTR_RO(target_stat_tgt_port_, in_cmds);
691 CONFIGFS_ATTR_RO(target_stat_tgt_port_, write_mbytes);
692 CONFIGFS_ATTR_RO(target_stat_tgt_port_, read_mbytes);
693 CONFIGFS_ATTR_RO(target_stat_tgt_port_, hs_in_cmds);
694 
695 static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
696 	&target_stat_tgt_port_attr_inst,
697 	&target_stat_tgt_port_attr_dev,
698 	&target_stat_tgt_port_attr_indx,
699 	&target_stat_tgt_port_attr_name,
700 	&target_stat_tgt_port_attr_port_index,
701 	&target_stat_tgt_port_attr_in_cmds,
702 	&target_stat_tgt_port_attr_write_mbytes,
703 	&target_stat_tgt_port_attr_read_mbytes,
704 	&target_stat_tgt_port_attr_hs_in_cmds,
705 	NULL,
706 };
707 
708 static struct config_item_type target_stat_scsi_tgt_port_cit = {
709 	.ct_attrs		= target_stat_scsi_tgt_port_attrs,
710 	.ct_owner		= THIS_MODULE,
711 };
712 
713 /*
714  * SCSI Transport Table
715  */
716 static struct se_lun *to_transport_stat(struct config_item *item)
717 {
718 	struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
719 			struct se_port_stat_grps, scsi_transport_group);
720 	return container_of(pgrps, struct se_lun, port_stat_grps);
721 }
722 
723 static ssize_t target_stat_transport_inst_show(struct config_item *item,
724 		char *page)
725 {
726 	struct se_lun *lun = to_transport_stat(item);
727 	struct se_device *dev;
728 	ssize_t ret = -ENODEV;
729 
730 	rcu_read_lock();
731 	dev = rcu_dereference(lun->lun_se_dev);
732 	if (dev)
733 		ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
734 	rcu_read_unlock();
735 	return ret;
736 }
737 
738 static ssize_t target_stat_transport_device_show(struct config_item *item,
739 		char *page)
740 {
741 	struct se_lun *lun = to_transport_stat(item);
742 	struct se_device *dev;
743 	struct se_portal_group *tpg = lun->lun_tpg;
744 	ssize_t ret = -ENODEV;
745 
746 	rcu_read_lock();
747 	dev = rcu_dereference(lun->lun_se_dev);
748 	if (dev) {
749 		/* scsiTransportType */
750 		ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
751 			       tpg->se_tpg_tfo->get_fabric_name());
752 	}
753 	rcu_read_unlock();
754 	return ret;
755 }
756 
757 static ssize_t target_stat_transport_indx_show(struct config_item *item,
758 		char *page)
759 {
760 	struct se_lun *lun = to_transport_stat(item);
761 	struct se_device *dev;
762 	struct se_portal_group *tpg = lun->lun_tpg;
763 	ssize_t ret = -ENODEV;
764 
765 	rcu_read_lock();
766 	dev = rcu_dereference(lun->lun_se_dev);
767 	if (dev)
768 		ret = snprintf(page, PAGE_SIZE, "%u\n",
769 			       tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
770 	rcu_read_unlock();
771 	return ret;
772 }
773 
774 static ssize_t target_stat_transport_dev_name_show(struct config_item *item,
775 		char *page)
776 {
777 	struct se_lun *lun = to_transport_stat(item);
778 	struct se_device *dev;
779 	struct se_portal_group *tpg = lun->lun_tpg;
780 	struct t10_wwn *wwn;
781 	ssize_t ret = -ENODEV;
782 
783 	rcu_read_lock();
784 	dev = rcu_dereference(lun->lun_se_dev);
785 	if (dev) {
786 		wwn = &dev->t10_wwn;
787 		/* scsiTransportDevName */
788 		ret = snprintf(page, PAGE_SIZE, "%s+%s\n",
789 				tpg->se_tpg_tfo->tpg_get_wwn(tpg),
790 				(strlen(wwn->unit_serial)) ? wwn->unit_serial :
791 				wwn->vendor);
792 	}
793 	rcu_read_unlock();
794 	return ret;
795 }
796 
797 CONFIGFS_ATTR_RO(target_stat_transport_, inst);
798 CONFIGFS_ATTR_RO(target_stat_transport_, device);
799 CONFIGFS_ATTR_RO(target_stat_transport_, indx);
800 CONFIGFS_ATTR_RO(target_stat_transport_, dev_name);
801 
802 static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
803 	&target_stat_transport_attr_inst,
804 	&target_stat_transport_attr_device,
805 	&target_stat_transport_attr_indx,
806 	&target_stat_transport_attr_dev_name,
807 	NULL,
808 };
809 
810 static struct config_item_type target_stat_scsi_transport_cit = {
811 	.ct_attrs		= target_stat_scsi_transport_attrs,
812 	.ct_owner		= THIS_MODULE,
813 };
814 
815 /*
816  * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
817  * the target port statistics groups + configfs CITs located in target_core_stat.c
818  */
819 void target_stat_setup_port_default_groups(struct se_lun *lun)
820 {
821 	struct config_group *port_stat_grp = &lun->port_stat_grps.stat_group;
822 
823 	config_group_init_type_name(&lun->port_stat_grps.scsi_port_group,
824 			"scsi_port", &target_stat_scsi_port_cit);
825 	config_group_init_type_name(&lun->port_stat_grps.scsi_tgt_port_group,
826 			"scsi_tgt_port", &target_stat_scsi_tgt_port_cit);
827 	config_group_init_type_name(&lun->port_stat_grps.scsi_transport_group,
828 			"scsi_transport", &target_stat_scsi_transport_cit);
829 
830 	port_stat_grp->default_groups[0] = &lun->port_stat_grps.scsi_port_group;
831 	port_stat_grp->default_groups[1] = &lun->port_stat_grps.scsi_tgt_port_group;
832 	port_stat_grp->default_groups[2] = &lun->port_stat_grps.scsi_transport_group;
833 	port_stat_grp->default_groups[3] = NULL;
834 }
835 
836 /*
837  * SCSI Authorized Initiator Table
838  */
839 
840 static struct se_lun_acl *auth_to_lacl(struct config_item *item)
841 {
842 	struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
843 			struct se_ml_stat_grps, scsi_auth_intr_group);
844 	return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
845 }
846 
847 static ssize_t target_stat_auth_inst_show(struct config_item *item,
848 		char *page)
849 {
850 	struct se_lun_acl *lacl = auth_to_lacl(item);
851 	struct se_node_acl *nacl = lacl->se_lun_nacl;
852 	struct se_dev_entry *deve;
853 	struct se_portal_group *tpg;
854 	ssize_t ret;
855 
856 	rcu_read_lock();
857 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
858 	if (!deve) {
859 		rcu_read_unlock();
860 		return -ENODEV;
861 	}
862 	tpg = nacl->se_tpg;
863 	/* scsiInstIndex */
864 	ret = snprintf(page, PAGE_SIZE, "%u\n",
865 			tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
866 	rcu_read_unlock();
867 	return ret;
868 }
869 
870 static ssize_t target_stat_auth_dev_show(struct config_item *item,
871 		char *page)
872 {
873 	struct se_lun_acl *lacl = auth_to_lacl(item);
874 	struct se_node_acl *nacl = lacl->se_lun_nacl;
875 	struct se_dev_entry *deve;
876 	struct se_lun *lun;
877 	ssize_t ret;
878 
879 	rcu_read_lock();
880 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
881 	if (!deve) {
882 		rcu_read_unlock();
883 		return -ENODEV;
884 	}
885 	lun = rcu_dereference(deve->se_lun);
886 	/* scsiDeviceIndex */
887 	ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
888 	rcu_read_unlock();
889 	return ret;
890 }
891 
892 static ssize_t target_stat_auth_port_show(struct config_item *item,
893 		char *page)
894 {
895 	struct se_lun_acl *lacl = auth_to_lacl(item);
896 	struct se_node_acl *nacl = lacl->se_lun_nacl;
897 	struct se_dev_entry *deve;
898 	struct se_portal_group *tpg;
899 	ssize_t ret;
900 
901 	rcu_read_lock();
902 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
903 	if (!deve) {
904 		rcu_read_unlock();
905 		return -ENODEV;
906 	}
907 	tpg = nacl->se_tpg;
908 	/* scsiAuthIntrTgtPortIndex */
909 	ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
910 	rcu_read_unlock();
911 	return ret;
912 }
913 
914 static ssize_t target_stat_auth_indx_show(struct config_item *item,
915 		char *page)
916 {
917 	struct se_lun_acl *lacl = auth_to_lacl(item);
918 	struct se_node_acl *nacl = lacl->se_lun_nacl;
919 	struct se_dev_entry *deve;
920 	ssize_t ret;
921 
922 	rcu_read_lock();
923 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
924 	if (!deve) {
925 		rcu_read_unlock();
926 		return -ENODEV;
927 	}
928 	/* scsiAuthIntrIndex */
929 	ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
930 	rcu_read_unlock();
931 	return ret;
932 }
933 
934 static ssize_t target_stat_auth_dev_or_port_show(struct config_item *item,
935 		char *page)
936 {
937 	struct se_lun_acl *lacl = auth_to_lacl(item);
938 	struct se_node_acl *nacl = lacl->se_lun_nacl;
939 	struct se_dev_entry *deve;
940 	ssize_t ret;
941 
942 	rcu_read_lock();
943 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
944 	if (!deve) {
945 		rcu_read_unlock();
946 		return -ENODEV;
947 	}
948 	/* scsiAuthIntrDevOrPort */
949 	ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
950 	rcu_read_unlock();
951 	return ret;
952 }
953 
954 static ssize_t target_stat_auth_intr_name_show(struct config_item *item,
955 		char *page)
956 {
957 	struct se_lun_acl *lacl = auth_to_lacl(item);
958 	struct se_node_acl *nacl = lacl->se_lun_nacl;
959 	struct se_dev_entry *deve;
960 	ssize_t ret;
961 
962 	rcu_read_lock();
963 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
964 	if (!deve) {
965 		rcu_read_unlock();
966 		return -ENODEV;
967 	}
968 	/* scsiAuthIntrName */
969 	ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
970 	rcu_read_unlock();
971 	return ret;
972 }
973 
974 static ssize_t target_stat_auth_map_indx_show(struct config_item *item,
975 		char *page)
976 {
977 	struct se_lun_acl *lacl = auth_to_lacl(item);
978 	struct se_node_acl *nacl = lacl->se_lun_nacl;
979 	struct se_dev_entry *deve;
980 	ssize_t ret;
981 
982 	rcu_read_lock();
983 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
984 	if (!deve) {
985 		rcu_read_unlock();
986 		return -ENODEV;
987 	}
988 	/* FIXME: scsiAuthIntrLunMapIndex */
989 	ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
990 	rcu_read_unlock();
991 	return ret;
992 }
993 
994 static ssize_t target_stat_auth_att_count_show(struct config_item *item,
995 		char *page)
996 {
997 	struct se_lun_acl *lacl = auth_to_lacl(item);
998 	struct se_node_acl *nacl = lacl->se_lun_nacl;
999 	struct se_dev_entry *deve;
1000 	ssize_t ret;
1001 
1002 	rcu_read_lock();
1003 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1004 	if (!deve) {
1005 		rcu_read_unlock();
1006 		return -ENODEV;
1007 	}
1008 	/* scsiAuthIntrAttachedTimes */
1009 	ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
1010 	rcu_read_unlock();
1011 	return ret;
1012 }
1013 
1014 static ssize_t target_stat_auth_num_cmds_show(struct config_item *item,
1015 		char *page)
1016 {
1017 	struct se_lun_acl *lacl = auth_to_lacl(item);
1018 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1019 	struct se_dev_entry *deve;
1020 	ssize_t ret;
1021 
1022 	rcu_read_lock();
1023 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1024 	if (!deve) {
1025 		rcu_read_unlock();
1026 		return -ENODEV;
1027 	}
1028 	/* scsiAuthIntrOutCommands */
1029 	ret = snprintf(page, PAGE_SIZE, "%lu\n",
1030 		       atomic_long_read(&deve->total_cmds));
1031 	rcu_read_unlock();
1032 	return ret;
1033 }
1034 
1035 static ssize_t target_stat_auth_read_mbytes_show(struct config_item *item,
1036 		char *page)
1037 {
1038 	struct se_lun_acl *lacl = auth_to_lacl(item);
1039 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1040 	struct se_dev_entry *deve;
1041 	ssize_t ret;
1042 
1043 	rcu_read_lock();
1044 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1045 	if (!deve) {
1046 		rcu_read_unlock();
1047 		return -ENODEV;
1048 	}
1049 	/* scsiAuthIntrReadMegaBytes */
1050 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1051 		      (u32)(atomic_long_read(&deve->read_bytes) >> 20));
1052 	rcu_read_unlock();
1053 	return ret;
1054 }
1055 
1056 static ssize_t target_stat_auth_write_mbytes_show(struct config_item *item,
1057 		char *page)
1058 {
1059 	struct se_lun_acl *lacl = auth_to_lacl(item);
1060 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1061 	struct se_dev_entry *deve;
1062 	ssize_t ret;
1063 
1064 	rcu_read_lock();
1065 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1066 	if (!deve) {
1067 		rcu_read_unlock();
1068 		return -ENODEV;
1069 	}
1070 	/* scsiAuthIntrWrittenMegaBytes */
1071 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1072 		      (u32)(atomic_long_read(&deve->write_bytes) >> 20));
1073 	rcu_read_unlock();
1074 	return ret;
1075 }
1076 
1077 static ssize_t target_stat_auth_hs_num_cmds_show(struct config_item *item,
1078 		char *page)
1079 {
1080 	struct se_lun_acl *lacl = auth_to_lacl(item);
1081 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1082 	struct se_dev_entry *deve;
1083 	ssize_t ret;
1084 
1085 	rcu_read_lock();
1086 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1087 	if (!deve) {
1088 		rcu_read_unlock();
1089 		return -ENODEV;
1090 	}
1091 	/* FIXME: scsiAuthIntrHSOutCommands */
1092 	ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1093 	rcu_read_unlock();
1094 	return ret;
1095 }
1096 
1097 static ssize_t target_stat_auth_creation_time_show(struct config_item *item,
1098 		char *page)
1099 {
1100 	struct se_lun_acl *lacl = auth_to_lacl(item);
1101 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1102 	struct se_dev_entry *deve;
1103 	ssize_t ret;
1104 
1105 	rcu_read_lock();
1106 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1107 	if (!deve) {
1108 		rcu_read_unlock();
1109 		return -ENODEV;
1110 	}
1111 	/* scsiAuthIntrLastCreation */
1112 	ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
1113 				INITIAL_JIFFIES) * 100 / HZ));
1114 	rcu_read_unlock();
1115 	return ret;
1116 }
1117 
1118 static ssize_t target_stat_auth_row_status_show(struct config_item *item,
1119 		char *page)
1120 {
1121 	struct se_lun_acl *lacl = auth_to_lacl(item);
1122 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1123 	struct se_dev_entry *deve;
1124 	ssize_t ret;
1125 
1126 	rcu_read_lock();
1127 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1128 	if (!deve) {
1129 		rcu_read_unlock();
1130 		return -ENODEV;
1131 	}
1132 	/* FIXME: scsiAuthIntrRowStatus */
1133 	ret = snprintf(page, PAGE_SIZE, "Ready\n");
1134 	rcu_read_unlock();
1135 	return ret;
1136 }
1137 
1138 CONFIGFS_ATTR_RO(target_stat_auth_, inst);
1139 CONFIGFS_ATTR_RO(target_stat_auth_, dev);
1140 CONFIGFS_ATTR_RO(target_stat_auth_, port);
1141 CONFIGFS_ATTR_RO(target_stat_auth_, indx);
1142 CONFIGFS_ATTR_RO(target_stat_auth_, dev_or_port);
1143 CONFIGFS_ATTR_RO(target_stat_auth_, intr_name);
1144 CONFIGFS_ATTR_RO(target_stat_auth_, map_indx);
1145 CONFIGFS_ATTR_RO(target_stat_auth_, att_count);
1146 CONFIGFS_ATTR_RO(target_stat_auth_, num_cmds);
1147 CONFIGFS_ATTR_RO(target_stat_auth_, read_mbytes);
1148 CONFIGFS_ATTR_RO(target_stat_auth_, write_mbytes);
1149 CONFIGFS_ATTR_RO(target_stat_auth_, hs_num_cmds);
1150 CONFIGFS_ATTR_RO(target_stat_auth_, creation_time);
1151 CONFIGFS_ATTR_RO(target_stat_auth_, row_status);
1152 
1153 static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
1154 	&target_stat_auth_attr_inst,
1155 	&target_stat_auth_attr_dev,
1156 	&target_stat_auth_attr_port,
1157 	&target_stat_auth_attr_indx,
1158 	&target_stat_auth_attr_dev_or_port,
1159 	&target_stat_auth_attr_intr_name,
1160 	&target_stat_auth_attr_map_indx,
1161 	&target_stat_auth_attr_att_count,
1162 	&target_stat_auth_attr_num_cmds,
1163 	&target_stat_auth_attr_read_mbytes,
1164 	&target_stat_auth_attr_write_mbytes,
1165 	&target_stat_auth_attr_hs_num_cmds,
1166 	&target_stat_auth_attr_creation_time,
1167 	&target_stat_auth_attr_row_status,
1168 	NULL,
1169 };
1170 
1171 static struct config_item_type target_stat_scsi_auth_intr_cit = {
1172 	.ct_attrs		= target_stat_scsi_auth_intr_attrs,
1173 	.ct_owner		= THIS_MODULE,
1174 };
1175 
1176 /*
1177  * SCSI Attached Initiator Port Table
1178  */
1179 
1180 static struct se_lun_acl *iport_to_lacl(struct config_item *item)
1181 {
1182 	struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
1183 			struct se_ml_stat_grps, scsi_att_intr_port_group);
1184 	return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
1185 }
1186 
1187 static ssize_t target_stat_iport_inst_show(struct config_item *item,
1188 		char *page)
1189 {
1190 	struct se_lun_acl *lacl = iport_to_lacl(item);
1191 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1192 	struct se_dev_entry *deve;
1193 	struct se_portal_group *tpg;
1194 	ssize_t ret;
1195 
1196 	rcu_read_lock();
1197 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1198 	if (!deve) {
1199 		rcu_read_unlock();
1200 		return -ENODEV;
1201 	}
1202 	tpg = nacl->se_tpg;
1203 	/* scsiInstIndex */
1204 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1205 			tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
1206 	rcu_read_unlock();
1207 	return ret;
1208 }
1209 
1210 static ssize_t target_stat_iport_dev_show(struct config_item *item,
1211 		char *page)
1212 {
1213 	struct se_lun_acl *lacl = iport_to_lacl(item);
1214 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1215 	struct se_dev_entry *deve;
1216 	struct se_lun *lun;
1217 	ssize_t ret;
1218 
1219 	rcu_read_lock();
1220 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1221 	if (!deve) {
1222 		rcu_read_unlock();
1223 		return -ENODEV;
1224 	}
1225 	lun = rcu_dereference(deve->se_lun);
1226 	/* scsiDeviceIndex */
1227 	ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
1228 	rcu_read_unlock();
1229 	return ret;
1230 }
1231 
1232 static ssize_t target_stat_iport_port_show(struct config_item *item,
1233 		char *page)
1234 {
1235 	struct se_lun_acl *lacl = iport_to_lacl(item);
1236 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1237 	struct se_dev_entry *deve;
1238 	struct se_portal_group *tpg;
1239 	ssize_t ret;
1240 
1241 	rcu_read_lock();
1242 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1243 	if (!deve) {
1244 		rcu_read_unlock();
1245 		return -ENODEV;
1246 	}
1247 	tpg = nacl->se_tpg;
1248 	/* scsiPortIndex */
1249 	ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
1250 	rcu_read_unlock();
1251 	return ret;
1252 }
1253 
1254 static ssize_t target_stat_iport_indx_show(struct config_item *item,
1255 		char *page)
1256 {
1257 	struct se_lun_acl *lacl = iport_to_lacl(item);
1258 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1259 	struct se_session *se_sess;
1260 	struct se_portal_group *tpg;
1261 	ssize_t ret;
1262 
1263 	spin_lock_irq(&nacl->nacl_sess_lock);
1264 	se_sess = nacl->nacl_sess;
1265 	if (!se_sess) {
1266 		spin_unlock_irq(&nacl->nacl_sess_lock);
1267 		return -ENODEV;
1268 	}
1269 
1270 	tpg = nacl->se_tpg;
1271 	/* scsiAttIntrPortIndex */
1272 	ret = snprintf(page, PAGE_SIZE, "%u\n",
1273 			tpg->se_tpg_tfo->sess_get_index(se_sess));
1274 	spin_unlock_irq(&nacl->nacl_sess_lock);
1275 	return ret;
1276 }
1277 
1278 static ssize_t target_stat_iport_port_auth_indx_show(struct config_item *item,
1279 		char *page)
1280 {
1281 	struct se_lun_acl *lacl = iport_to_lacl(item);
1282 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1283 	struct se_dev_entry *deve;
1284 	ssize_t ret;
1285 
1286 	rcu_read_lock();
1287 	deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1288 	if (!deve) {
1289 		rcu_read_unlock();
1290 		return -ENODEV;
1291 	}
1292 	/* scsiAttIntrPortAuthIntrIdx */
1293 	ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1294 	rcu_read_unlock();
1295 	return ret;
1296 }
1297 
1298 static ssize_t target_stat_iport_port_ident_show(struct config_item *item,
1299 		char *page)
1300 {
1301 	struct se_lun_acl *lacl = iport_to_lacl(item);
1302 	struct se_node_acl *nacl = lacl->se_lun_nacl;
1303 	struct se_session *se_sess;
1304 	struct se_portal_group *tpg;
1305 	ssize_t ret;
1306 	unsigned char buf[64];
1307 
1308 	spin_lock_irq(&nacl->nacl_sess_lock);
1309 	se_sess = nacl->nacl_sess;
1310 	if (!se_sess) {
1311 		spin_unlock_irq(&nacl->nacl_sess_lock);
1312 		return -ENODEV;
1313 	}
1314 
1315 	tpg = nacl->se_tpg;
1316 	/* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1317 	memset(buf, 0, 64);
1318 	if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
1319 		tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
1320 
1321 	ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
1322 	spin_unlock_irq(&nacl->nacl_sess_lock);
1323 	return ret;
1324 }
1325 
1326 CONFIGFS_ATTR_RO(target_stat_iport_, inst);
1327 CONFIGFS_ATTR_RO(target_stat_iport_, dev);
1328 CONFIGFS_ATTR_RO(target_stat_iport_, port);
1329 CONFIGFS_ATTR_RO(target_stat_iport_, indx);
1330 CONFIGFS_ATTR_RO(target_stat_iport_, port_auth_indx);
1331 CONFIGFS_ATTR_RO(target_stat_iport_, port_ident);
1332 
1333 static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
1334 	&target_stat_iport_attr_inst,
1335 	&target_stat_iport_attr_dev,
1336 	&target_stat_iport_attr_port,
1337 	&target_stat_iport_attr_indx,
1338 	&target_stat_iport_attr_port_auth_indx,
1339 	&target_stat_iport_attr_port_ident,
1340 	NULL,
1341 };
1342 
1343 static struct config_item_type target_stat_scsi_att_intr_port_cit = {
1344 	.ct_attrs		= target_stat_scsi_ath_intr_port_attrs,
1345 	.ct_owner		= THIS_MODULE,
1346 };
1347 
1348 /*
1349  * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
1350  * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
1351  */
1352 void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
1353 {
1354 	struct config_group *ml_stat_grp = &lacl->ml_stat_grps.stat_group;
1355 
1356 	config_group_init_type_name(&lacl->ml_stat_grps.scsi_auth_intr_group,
1357 			"scsi_auth_intr", &target_stat_scsi_auth_intr_cit);
1358 	config_group_init_type_name(&lacl->ml_stat_grps.scsi_att_intr_port_group,
1359 			"scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit);
1360 
1361 	ml_stat_grp->default_groups[0] = &lacl->ml_stat_grps.scsi_auth_intr_group;
1362 	ml_stat_grp->default_groups[1] = &lacl->ml_stat_grps.scsi_att_intr_port_group;
1363 	ml_stat_grp->default_groups[2] = NULL;
1364 }
1365