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