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