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