1 /*******************************************************************************
2 * Filename: target_core_stat.c
4 * Modern ConfigFS group context specific statistics based on original
5 * target_core_mib.c code
7 * (c) Copyright 2006-2013 Datera, Inc.
9 * Nicholas A. Bellinger <nab@linux-iscsi.org>
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.
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.
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.
25 ******************************************************************************/
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>
37 #include <target/target_core_base.h>
38 #include <target/target_core_backend.h>
39 #include <target/target_core_fabric.h>
41 #include "target_core_internal.h"
43 #ifndef INITIAL_JIFFIES
44 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
48 #define ISPRINT(a) ((a >= ' ') && (a <= '~'))
50 #define SCSI_LU_INDEX 1
57 static struct se_device
*to_stat_dev(struct config_item
*item
)
59 struct se_dev_stat_grps
*sgrps
= container_of(to_config_group(item
),
60 struct se_dev_stat_grps
, scsi_dev_group
);
61 return container_of(sgrps
, struct se_device
, dev_stat_grps
);
64 static ssize_t
target_stat_inst_show(struct config_item
*item
, char *page
)
66 struct se_hba
*hba
= to_stat_dev(item
)->se_hba
;
68 return snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
71 static ssize_t
target_stat_indx_show(struct config_item
*item
, char *page
)
73 return snprintf(page
, PAGE_SIZE
, "%u\n", to_stat_dev(item
)->dev_index
);
76 static ssize_t
target_stat_role_show(struct config_item
*item
, char *page
)
78 return snprintf(page
, PAGE_SIZE
, "Target\n");
81 static ssize_t
target_stat_ports_show(struct config_item
*item
, char *page
)
83 return snprintf(page
, PAGE_SIZE
, "%u\n", to_stat_dev(item
)->export_count
);
86 CONFIGFS_ATTR_RO(target_stat_
, inst
);
87 CONFIGFS_ATTR_RO(target_stat_
, indx
);
88 CONFIGFS_ATTR_RO(target_stat_
, role
);
89 CONFIGFS_ATTR_RO(target_stat_
, ports
);
91 static struct configfs_attribute
*target_stat_scsi_dev_attrs
[] = {
92 &target_stat_attr_inst
,
93 &target_stat_attr_indx
,
94 &target_stat_attr_role
,
95 &target_stat_attr_ports
,
99 static struct config_item_type target_stat_scsi_dev_cit
= {
100 .ct_attrs
= target_stat_scsi_dev_attrs
,
101 .ct_owner
= THIS_MODULE
,
105 * SCSI Target Device Table
107 static struct se_device
*to_stat_tgt_dev(struct config_item
*item
)
109 struct se_dev_stat_grps
*sgrps
= container_of(to_config_group(item
),
110 struct se_dev_stat_grps
, scsi_tgt_dev_group
);
111 return container_of(sgrps
, struct se_device
, dev_stat_grps
);
114 static ssize_t
target_stat_tgt_inst_show(struct config_item
*item
, char *page
)
116 struct se_hba
*hba
= to_stat_tgt_dev(item
)->se_hba
;
118 return snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
121 static ssize_t
target_stat_tgt_indx_show(struct config_item
*item
, char *page
)
123 return snprintf(page
, PAGE_SIZE
, "%u\n", to_stat_tgt_dev(item
)->dev_index
);
126 static ssize_t
target_stat_tgt_num_lus_show(struct config_item
*item
,
129 return snprintf(page
, PAGE_SIZE
, "%u\n", LU_COUNT
);
132 static ssize_t
target_stat_tgt_status_show(struct config_item
*item
,
135 if (to_stat_tgt_dev(item
)->export_count
)
136 return snprintf(page
, PAGE_SIZE
, "activated");
138 return snprintf(page
, PAGE_SIZE
, "deactivated");
141 static ssize_t
target_stat_tgt_non_access_lus_show(struct config_item
*item
,
144 int non_accessible_lus
;
146 if (to_stat_tgt_dev(item
)->export_count
)
147 non_accessible_lus
= 0;
149 non_accessible_lus
= 1;
151 return snprintf(page
, PAGE_SIZE
, "%u\n", non_accessible_lus
);
154 static ssize_t
target_stat_tgt_resets_show(struct config_item
*item
,
157 return snprintf(page
, PAGE_SIZE
, "%lu\n",
158 atomic_long_read(&to_stat_tgt_dev(item
)->num_resets
));
161 CONFIGFS_ATTR_RO(target_stat_tgt_
, inst
);
162 CONFIGFS_ATTR_RO(target_stat_tgt_
, indx
);
163 CONFIGFS_ATTR_RO(target_stat_tgt_
, num_lus
);
164 CONFIGFS_ATTR_RO(target_stat_tgt_
, status
);
165 CONFIGFS_ATTR_RO(target_stat_tgt_
, non_access_lus
);
166 CONFIGFS_ATTR_RO(target_stat_tgt_
, resets
);
168 static struct configfs_attribute
*target_stat_scsi_tgt_dev_attrs
[] = {
169 &target_stat_tgt_attr_inst
,
170 &target_stat_tgt_attr_indx
,
171 &target_stat_tgt_attr_num_lus
,
172 &target_stat_tgt_attr_status
,
173 &target_stat_tgt_attr_non_access_lus
,
174 &target_stat_tgt_attr_resets
,
178 static struct config_item_type target_stat_scsi_tgt_dev_cit
= {
179 .ct_attrs
= target_stat_scsi_tgt_dev_attrs
,
180 .ct_owner
= THIS_MODULE
,
184 * SCSI Logical Unit Table
187 static struct se_device
*to_stat_lu_dev(struct config_item
*item
)
189 struct se_dev_stat_grps
*sgrps
= container_of(to_config_group(item
),
190 struct se_dev_stat_grps
, scsi_lu_group
);
191 return container_of(sgrps
, struct se_device
, dev_stat_grps
);
194 static ssize_t
target_stat_lu_inst_show(struct config_item
*item
, char *page
)
196 struct se_hba
*hba
= to_stat_lu_dev(item
)->se_hba
;
198 return snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
201 static ssize_t
target_stat_lu_dev_show(struct config_item
*item
, char *page
)
203 return snprintf(page
, PAGE_SIZE
, "%u\n",
204 to_stat_lu_dev(item
)->dev_index
);
207 static ssize_t
target_stat_lu_indx_show(struct config_item
*item
, char *page
)
209 return snprintf(page
, PAGE_SIZE
, "%u\n", SCSI_LU_INDEX
);
212 static ssize_t
target_stat_lu_lun_show(struct config_item
*item
, char *page
)
214 /* FIXME: scsiLuDefaultLun */
215 return snprintf(page
, PAGE_SIZE
, "%llu\n", (unsigned long long)0);
218 static ssize_t
target_stat_lu_lu_name_show(struct config_item
*item
, char *page
)
220 struct se_device
*dev
= to_stat_lu_dev(item
);
223 return snprintf(page
, PAGE_SIZE
, "%s\n",
224 (strlen(dev
->t10_wwn
.unit_serial
)) ?
225 dev
->t10_wwn
.unit_serial
: "None");
228 static ssize_t
target_stat_lu_vend_show(struct config_item
*item
, char *page
)
230 struct se_device
*dev
= to_stat_lu_dev(item
);
232 char str
[sizeof(dev
->t10_wwn
.vendor
)+1];
235 for (i
= 0; i
< sizeof(dev
->t10_wwn
.vendor
); i
++)
236 str
[i
] = ISPRINT(dev
->t10_wwn
.vendor
[i
]) ?
237 dev
->t10_wwn
.vendor
[i
] : ' ';
239 return snprintf(page
, PAGE_SIZE
, "%s\n", str
);
242 static ssize_t
target_stat_lu_prod_show(struct config_item
*item
, char *page
)
244 struct se_device
*dev
= to_stat_lu_dev(item
);
246 char str
[sizeof(dev
->t10_wwn
.model
)+1];
248 /* scsiLuProductId */
249 for (i
= 0; i
< sizeof(dev
->t10_wwn
.model
); i
++)
250 str
[i
] = ISPRINT(dev
->t10_wwn
.model
[i
]) ?
251 dev
->t10_wwn
.model
[i
] : ' ';
253 return snprintf(page
, PAGE_SIZE
, "%s\n", str
);
256 static ssize_t
target_stat_lu_rev_show(struct config_item
*item
, char *page
)
258 struct se_device
*dev
= to_stat_lu_dev(item
);
260 char str
[sizeof(dev
->t10_wwn
.revision
)+1];
262 /* scsiLuRevisionId */
263 for (i
= 0; i
< sizeof(dev
->t10_wwn
.revision
); i
++)
264 str
[i
] = ISPRINT(dev
->t10_wwn
.revision
[i
]) ?
265 dev
->t10_wwn
.revision
[i
] : ' ';
267 return snprintf(page
, PAGE_SIZE
, "%s\n", str
);
270 static ssize_t
target_stat_lu_dev_type_show(struct config_item
*item
, char *page
)
272 struct se_device
*dev
= to_stat_lu_dev(item
);
274 /* scsiLuPeripheralType */
275 return snprintf(page
, PAGE_SIZE
, "%u\n",
276 dev
->transport
->get_device_type(dev
));
279 static ssize_t
target_stat_lu_status_show(struct config_item
*item
, char *page
)
281 struct se_device
*dev
= to_stat_lu_dev(item
);
284 return snprintf(page
, PAGE_SIZE
, "%s\n",
285 (dev
->export_count
) ? "available" : "notavailable");
288 static ssize_t
target_stat_lu_state_bit_show(struct config_item
*item
,
292 return snprintf(page
, PAGE_SIZE
, "exposed\n");
295 static ssize_t
target_stat_lu_num_cmds_show(struct config_item
*item
,
298 struct se_device
*dev
= to_stat_lu_dev(item
);
300 /* scsiLuNumCommands */
301 return snprintf(page
, PAGE_SIZE
, "%lu\n",
302 atomic_long_read(&dev
->num_cmds
));
305 static ssize_t
target_stat_lu_read_mbytes_show(struct config_item
*item
,
308 struct se_device
*dev
= to_stat_lu_dev(item
);
310 /* scsiLuReadMegaBytes */
311 return snprintf(page
, PAGE_SIZE
, "%lu\n",
312 atomic_long_read(&dev
->read_bytes
) >> 20);
315 static ssize_t
target_stat_lu_write_mbytes_show(struct config_item
*item
,
318 struct se_device
*dev
= to_stat_lu_dev(item
);
320 /* scsiLuWrittenMegaBytes */
321 return snprintf(page
, PAGE_SIZE
, "%lu\n",
322 atomic_long_read(&dev
->write_bytes
) >> 20);
325 static ssize_t
target_stat_lu_resets_show(struct config_item
*item
, char *page
)
327 struct se_device
*dev
= to_stat_lu_dev(item
);
330 return snprintf(page
, PAGE_SIZE
, "%lu\n",
331 atomic_long_read(&dev
->num_resets
));
334 static ssize_t
target_stat_lu_full_stat_show(struct config_item
*item
,
337 /* FIXME: scsiLuOutTaskSetFullStatus */
338 return snprintf(page
, PAGE_SIZE
, "%u\n", 0);
341 static ssize_t
target_stat_lu_hs_num_cmds_show(struct config_item
*item
,
344 /* FIXME: scsiLuHSInCommands */
345 return snprintf(page
, PAGE_SIZE
, "%u\n", 0);
348 static ssize_t
target_stat_lu_creation_time_show(struct config_item
*item
,
351 struct se_device
*dev
= to_stat_lu_dev(item
);
353 /* scsiLuCreationTime */
354 return snprintf(page
, PAGE_SIZE
, "%u\n", (u32
)(((u32
)dev
->creation_time
-
355 INITIAL_JIFFIES
) * 100 / HZ
));
358 CONFIGFS_ATTR_RO(target_stat_lu_
, inst
);
359 CONFIGFS_ATTR_RO(target_stat_lu_
, dev
);
360 CONFIGFS_ATTR_RO(target_stat_lu_
, indx
);
361 CONFIGFS_ATTR_RO(target_stat_lu_
, lun
);
362 CONFIGFS_ATTR_RO(target_stat_lu_
, lu_name
);
363 CONFIGFS_ATTR_RO(target_stat_lu_
, vend
);
364 CONFIGFS_ATTR_RO(target_stat_lu_
, prod
);
365 CONFIGFS_ATTR_RO(target_stat_lu_
, rev
);
366 CONFIGFS_ATTR_RO(target_stat_lu_
, dev_type
);
367 CONFIGFS_ATTR_RO(target_stat_lu_
, status
);
368 CONFIGFS_ATTR_RO(target_stat_lu_
, state_bit
);
369 CONFIGFS_ATTR_RO(target_stat_lu_
, num_cmds
);
370 CONFIGFS_ATTR_RO(target_stat_lu_
, read_mbytes
);
371 CONFIGFS_ATTR_RO(target_stat_lu_
, write_mbytes
);
372 CONFIGFS_ATTR_RO(target_stat_lu_
, resets
);
373 CONFIGFS_ATTR_RO(target_stat_lu_
, full_stat
);
374 CONFIGFS_ATTR_RO(target_stat_lu_
, hs_num_cmds
);
375 CONFIGFS_ATTR_RO(target_stat_lu_
, creation_time
);
377 static struct configfs_attribute
*target_stat_scsi_lu_attrs
[] = {
378 &target_stat_lu_attr_inst
,
379 &target_stat_lu_attr_dev
,
380 &target_stat_lu_attr_indx
,
381 &target_stat_lu_attr_lun
,
382 &target_stat_lu_attr_lu_name
,
383 &target_stat_lu_attr_vend
,
384 &target_stat_lu_attr_prod
,
385 &target_stat_lu_attr_rev
,
386 &target_stat_lu_attr_dev_type
,
387 &target_stat_lu_attr_status
,
388 &target_stat_lu_attr_state_bit
,
389 &target_stat_lu_attr_num_cmds
,
390 &target_stat_lu_attr_read_mbytes
,
391 &target_stat_lu_attr_write_mbytes
,
392 &target_stat_lu_attr_resets
,
393 &target_stat_lu_attr_full_stat
,
394 &target_stat_lu_attr_hs_num_cmds
,
395 &target_stat_lu_attr_creation_time
,
399 static struct config_item_type target_stat_scsi_lu_cit
= {
400 .ct_attrs
= target_stat_scsi_lu_attrs
,
401 .ct_owner
= THIS_MODULE
,
405 * Called from target_core_configfs.c:target_core_make_subdev() to setup
406 * the target statistics groups + configfs CITs located in target_core_stat.c
408 void target_stat_setup_dev_default_groups(struct se_device
*dev
)
410 struct config_group
*dev_stat_grp
= &dev
->dev_stat_grps
.stat_group
;
412 config_group_init_type_name(&dev
->dev_stat_grps
.scsi_dev_group
,
413 "scsi_dev", &target_stat_scsi_dev_cit
);
414 config_group_init_type_name(&dev
->dev_stat_grps
.scsi_tgt_dev_group
,
415 "scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit
);
416 config_group_init_type_name(&dev
->dev_stat_grps
.scsi_lu_group
,
417 "scsi_lu", &target_stat_scsi_lu_cit
);
419 dev_stat_grp
->default_groups
[0] = &dev
->dev_stat_grps
.scsi_dev_group
;
420 dev_stat_grp
->default_groups
[1] = &dev
->dev_stat_grps
.scsi_tgt_dev_group
;
421 dev_stat_grp
->default_groups
[2] = &dev
->dev_stat_grps
.scsi_lu_group
;
422 dev_stat_grp
->default_groups
[3] = NULL
;
429 static struct se_lun
*to_stat_port(struct config_item
*item
)
431 struct se_port_stat_grps
*pgrps
= container_of(to_config_group(item
),
432 struct se_port_stat_grps
, scsi_port_group
);
433 return container_of(pgrps
, struct se_lun
, port_stat_grps
);
436 static ssize_t
target_stat_port_inst_show(struct config_item
*item
, char *page
)
438 struct se_lun
*lun
= to_stat_port(item
);
439 struct se_device
*dev
;
440 ssize_t ret
= -ENODEV
;
443 dev
= rcu_dereference(lun
->lun_se_dev
);
445 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->hba_index
);
450 static ssize_t
target_stat_port_dev_show(struct config_item
*item
, char *page
)
452 struct se_lun
*lun
= to_stat_port(item
);
453 struct se_device
*dev
;
454 ssize_t ret
= -ENODEV
;
457 dev
= rcu_dereference(lun
->lun_se_dev
);
459 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
464 static ssize_t
target_stat_port_indx_show(struct config_item
*item
, char *page
)
466 struct se_lun
*lun
= to_stat_port(item
);
467 struct se_device
*dev
;
468 ssize_t ret
= -ENODEV
;
471 dev
= rcu_dereference(lun
->lun_se_dev
);
473 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", lun
->lun_rtpi
);
478 static ssize_t
target_stat_port_role_show(struct config_item
*item
, char *page
)
480 struct se_lun
*lun
= to_stat_port(item
);
481 struct se_device
*dev
;
482 ssize_t ret
= -ENODEV
;
485 dev
= rcu_dereference(lun
->lun_se_dev
);
487 ret
= snprintf(page
, PAGE_SIZE
, "%s%u\n", "Device", dev
->dev_index
);
492 static ssize_t
target_stat_port_busy_count_show(struct config_item
*item
,
495 struct se_lun
*lun
= to_stat_port(item
);
496 struct se_device
*dev
;
497 ssize_t ret
= -ENODEV
;
500 dev
= rcu_dereference(lun
->lun_se_dev
);
502 /* FIXME: scsiPortBusyStatuses */
503 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
509 CONFIGFS_ATTR_RO(target_stat_port_
, inst
);
510 CONFIGFS_ATTR_RO(target_stat_port_
, dev
);
511 CONFIGFS_ATTR_RO(target_stat_port_
, indx
);
512 CONFIGFS_ATTR_RO(target_stat_port_
, role
);
513 CONFIGFS_ATTR_RO(target_stat_port_
, busy_count
);
515 static struct configfs_attribute
*target_stat_scsi_port_attrs
[] = {
516 &target_stat_port_attr_inst
,
517 &target_stat_port_attr_dev
,
518 &target_stat_port_attr_indx
,
519 &target_stat_port_attr_role
,
520 &target_stat_port_attr_busy_count
,
524 static struct config_item_type target_stat_scsi_port_cit
= {
525 .ct_attrs
= target_stat_scsi_port_attrs
,
526 .ct_owner
= THIS_MODULE
,
530 * SCSI Target Port Table
532 static struct se_lun
*to_stat_tgt_port(struct config_item
*item
)
534 struct se_port_stat_grps
*pgrps
= container_of(to_config_group(item
),
535 struct se_port_stat_grps
, scsi_tgt_port_group
);
536 return container_of(pgrps
, struct se_lun
, port_stat_grps
);
539 static ssize_t
target_stat_tgt_port_inst_show(struct config_item
*item
,
542 struct se_lun
*lun
= to_stat_tgt_port(item
);
543 struct se_device
*dev
;
544 ssize_t ret
= -ENODEV
;
547 dev
= rcu_dereference(lun
->lun_se_dev
);
549 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->hba_index
);
554 static ssize_t
target_stat_tgt_port_dev_show(struct config_item
*item
,
557 struct se_lun
*lun
= to_stat_tgt_port(item
);
558 struct se_device
*dev
;
559 ssize_t ret
= -ENODEV
;
562 dev
= rcu_dereference(lun
->lun_se_dev
);
564 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
569 static ssize_t
target_stat_tgt_port_indx_show(struct config_item
*item
,
572 struct se_lun
*lun
= to_stat_tgt_port(item
);
573 struct se_device
*dev
;
574 ssize_t ret
= -ENODEV
;
577 dev
= rcu_dereference(lun
->lun_se_dev
);
579 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", lun
->lun_rtpi
);
584 static ssize_t
target_stat_tgt_port_name_show(struct config_item
*item
,
587 struct se_lun
*lun
= to_stat_tgt_port(item
);
588 struct se_portal_group
*tpg
= lun
->lun_tpg
;
589 struct se_device
*dev
;
590 ssize_t ret
= -ENODEV
;
593 dev
= rcu_dereference(lun
->lun_se_dev
);
595 ret
= snprintf(page
, PAGE_SIZE
, "%sPort#%u\n",
596 tpg
->se_tpg_tfo
->get_fabric_name(),
602 static ssize_t
target_stat_tgt_port_port_index_show(struct config_item
*item
,
605 struct se_lun
*lun
= to_stat_tgt_port(item
);
606 struct se_portal_group
*tpg
= lun
->lun_tpg
;
607 struct se_device
*dev
;
608 ssize_t ret
= -ENODEV
;
611 dev
= rcu_dereference(lun
->lun_se_dev
);
613 ret
= snprintf(page
, PAGE_SIZE
, "%s%s%d\n",
614 tpg
->se_tpg_tfo
->tpg_get_wwn(tpg
), "+t+",
615 tpg
->se_tpg_tfo
->tpg_get_tag(tpg
));
620 static ssize_t
target_stat_tgt_port_in_cmds_show(struct config_item
*item
,
623 struct se_lun
*lun
= to_stat_tgt_port(item
);
624 struct se_device
*dev
;
625 ssize_t ret
= -ENODEV
;
628 dev
= rcu_dereference(lun
->lun_se_dev
);
630 ret
= snprintf(page
, PAGE_SIZE
, "%lu\n",
631 atomic_long_read(&lun
->lun_stats
.cmd_pdus
));
636 static ssize_t
target_stat_tgt_port_write_mbytes_show(struct config_item
*item
,
639 struct se_lun
*lun
= to_stat_tgt_port(item
);
640 struct se_device
*dev
;
641 ssize_t ret
= -ENODEV
;
644 dev
= rcu_dereference(lun
->lun_se_dev
);
646 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
647 (u32
)(atomic_long_read(&lun
->lun_stats
.rx_data_octets
) >> 20));
652 static ssize_t
target_stat_tgt_port_read_mbytes_show(struct config_item
*item
,
655 struct se_lun
*lun
= to_stat_tgt_port(item
);
656 struct se_device
*dev
;
657 ssize_t ret
= -ENODEV
;
660 dev
= rcu_dereference(lun
->lun_se_dev
);
662 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
663 (u32
)(atomic_long_read(&lun
->lun_stats
.tx_data_octets
) >> 20));
668 static ssize_t
target_stat_tgt_port_hs_in_cmds_show(struct config_item
*item
,
671 struct se_lun
*lun
= to_stat_tgt_port(item
);
672 struct se_device
*dev
;
673 ssize_t ret
= -ENODEV
;
676 dev
= rcu_dereference(lun
->lun_se_dev
);
678 /* FIXME: scsiTgtPortHsInCommands */
679 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
685 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, inst
);
686 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, dev
);
687 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, indx
);
688 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, name
);
689 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, port_index
);
690 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, in_cmds
);
691 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, write_mbytes
);
692 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, read_mbytes
);
693 CONFIGFS_ATTR_RO(target_stat_tgt_port_
, hs_in_cmds
);
695 static struct configfs_attribute
*target_stat_scsi_tgt_port_attrs
[] = {
696 &target_stat_tgt_port_attr_inst
,
697 &target_stat_tgt_port_attr_dev
,
698 &target_stat_tgt_port_attr_indx
,
699 &target_stat_tgt_port_attr_name
,
700 &target_stat_tgt_port_attr_port_index
,
701 &target_stat_tgt_port_attr_in_cmds
,
702 &target_stat_tgt_port_attr_write_mbytes
,
703 &target_stat_tgt_port_attr_read_mbytes
,
704 &target_stat_tgt_port_attr_hs_in_cmds
,
708 static struct config_item_type target_stat_scsi_tgt_port_cit
= {
709 .ct_attrs
= target_stat_scsi_tgt_port_attrs
,
710 .ct_owner
= THIS_MODULE
,
714 * SCSI Transport Table
716 static struct se_lun
*to_transport_stat(struct config_item
*item
)
718 struct se_port_stat_grps
*pgrps
= container_of(to_config_group(item
),
719 struct se_port_stat_grps
, scsi_transport_group
);
720 return container_of(pgrps
, struct se_lun
, port_stat_grps
);
723 static ssize_t
target_stat_transport_inst_show(struct config_item
*item
,
726 struct se_lun
*lun
= to_transport_stat(item
);
727 struct se_device
*dev
;
728 ssize_t ret
= -ENODEV
;
731 dev
= rcu_dereference(lun
->lun_se_dev
);
733 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->hba_index
);
738 static ssize_t
target_stat_transport_device_show(struct config_item
*item
,
741 struct se_lun
*lun
= to_transport_stat(item
);
742 struct se_device
*dev
;
743 struct se_portal_group
*tpg
= lun
->lun_tpg
;
744 ssize_t ret
= -ENODEV
;
747 dev
= rcu_dereference(lun
->lun_se_dev
);
749 /* scsiTransportType */
750 ret
= snprintf(page
, PAGE_SIZE
, "scsiTransport%s\n",
751 tpg
->se_tpg_tfo
->get_fabric_name());
757 static ssize_t
target_stat_transport_indx_show(struct config_item
*item
,
760 struct se_lun
*lun
= to_transport_stat(item
);
761 struct se_device
*dev
;
762 struct se_portal_group
*tpg
= lun
->lun_tpg
;
763 ssize_t ret
= -ENODEV
;
766 dev
= rcu_dereference(lun
->lun_se_dev
);
768 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
769 tpg
->se_tpg_tfo
->tpg_get_inst_index(tpg
));
774 static ssize_t
target_stat_transport_dev_name_show(struct config_item
*item
,
777 struct se_lun
*lun
= to_transport_stat(item
);
778 struct se_device
*dev
;
779 struct se_portal_group
*tpg
= lun
->lun_tpg
;
781 ssize_t ret
= -ENODEV
;
784 dev
= rcu_dereference(lun
->lun_se_dev
);
787 /* scsiTransportDevName */
788 ret
= snprintf(page
, PAGE_SIZE
, "%s+%s\n",
789 tpg
->se_tpg_tfo
->tpg_get_wwn(tpg
),
790 (strlen(wwn
->unit_serial
)) ? wwn
->unit_serial
:
797 CONFIGFS_ATTR_RO(target_stat_transport_
, inst
);
798 CONFIGFS_ATTR_RO(target_stat_transport_
, device
);
799 CONFIGFS_ATTR_RO(target_stat_transport_
, indx
);
800 CONFIGFS_ATTR_RO(target_stat_transport_
, dev_name
);
802 static struct configfs_attribute
*target_stat_scsi_transport_attrs
[] = {
803 &target_stat_transport_attr_inst
,
804 &target_stat_transport_attr_device
,
805 &target_stat_transport_attr_indx
,
806 &target_stat_transport_attr_dev_name
,
810 static struct config_item_type target_stat_scsi_transport_cit
= {
811 .ct_attrs
= target_stat_scsi_transport_attrs
,
812 .ct_owner
= THIS_MODULE
,
816 * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
817 * the target port statistics groups + configfs CITs located in target_core_stat.c
819 void target_stat_setup_port_default_groups(struct se_lun
*lun
)
821 struct config_group
*port_stat_grp
= &lun
->port_stat_grps
.stat_group
;
823 config_group_init_type_name(&lun
->port_stat_grps
.scsi_port_group
,
824 "scsi_port", &target_stat_scsi_port_cit
);
825 config_group_init_type_name(&lun
->port_stat_grps
.scsi_tgt_port_group
,
826 "scsi_tgt_port", &target_stat_scsi_tgt_port_cit
);
827 config_group_init_type_name(&lun
->port_stat_grps
.scsi_transport_group
,
828 "scsi_transport", &target_stat_scsi_transport_cit
);
830 port_stat_grp
->default_groups
[0] = &lun
->port_stat_grps
.scsi_port_group
;
831 port_stat_grp
->default_groups
[1] = &lun
->port_stat_grps
.scsi_tgt_port_group
;
832 port_stat_grp
->default_groups
[2] = &lun
->port_stat_grps
.scsi_transport_group
;
833 port_stat_grp
->default_groups
[3] = NULL
;
837 * SCSI Authorized Initiator Table
840 static struct se_lun_acl
*auth_to_lacl(struct config_item
*item
)
842 struct se_ml_stat_grps
*lgrps
= container_of(to_config_group(item
),
843 struct se_ml_stat_grps
, scsi_auth_intr_group
);
844 return container_of(lgrps
, struct se_lun_acl
, ml_stat_grps
);
847 static ssize_t
target_stat_auth_inst_show(struct config_item
*item
,
850 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
851 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
852 struct se_dev_entry
*deve
;
853 struct se_portal_group
*tpg
;
857 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
864 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
865 tpg
->se_tpg_tfo
->tpg_get_inst_index(tpg
));
870 static ssize_t
target_stat_auth_dev_show(struct config_item
*item
,
873 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
874 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
875 struct se_dev_entry
*deve
;
880 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
885 lun
= rcu_dereference(deve
->se_lun
);
886 /* scsiDeviceIndex */
887 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", lun
->lun_index
);
892 static ssize_t
target_stat_auth_port_show(struct config_item
*item
,
895 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
896 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
897 struct se_dev_entry
*deve
;
898 struct se_portal_group
*tpg
;
902 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
908 /* scsiAuthIntrTgtPortIndex */
909 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", tpg
->se_tpg_tfo
->tpg_get_tag(tpg
));
914 static ssize_t
target_stat_auth_indx_show(struct config_item
*item
,
917 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
918 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
919 struct se_dev_entry
*deve
;
923 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
928 /* scsiAuthIntrIndex */
929 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", nacl
->acl_index
);
934 static ssize_t
target_stat_auth_dev_or_port_show(struct config_item
*item
,
937 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
938 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
939 struct se_dev_entry
*deve
;
943 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
948 /* scsiAuthIntrDevOrPort */
949 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 1);
954 static ssize_t
target_stat_auth_intr_name_show(struct config_item
*item
,
957 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
958 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
959 struct se_dev_entry
*deve
;
963 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
968 /* scsiAuthIntrName */
969 ret
= snprintf(page
, PAGE_SIZE
, "%s\n", nacl
->initiatorname
);
974 static ssize_t
target_stat_auth_map_indx_show(struct config_item
*item
,
977 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
978 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
979 struct se_dev_entry
*deve
;
983 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
988 /* FIXME: scsiAuthIntrLunMapIndex */
989 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
994 static ssize_t
target_stat_auth_att_count_show(struct config_item
*item
,
997 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
998 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
999 struct se_dev_entry
*deve
;
1003 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1008 /* scsiAuthIntrAttachedTimes */
1009 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", deve
->attach_count
);
1014 static ssize_t
target_stat_auth_num_cmds_show(struct config_item
*item
,
1017 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
1018 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1019 struct se_dev_entry
*deve
;
1023 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1028 /* scsiAuthIntrOutCommands */
1029 ret
= snprintf(page
, PAGE_SIZE
, "%lu\n",
1030 atomic_long_read(&deve
->total_cmds
));
1035 static ssize_t
target_stat_auth_read_mbytes_show(struct config_item
*item
,
1038 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
1039 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1040 struct se_dev_entry
*deve
;
1044 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1049 /* scsiAuthIntrReadMegaBytes */
1050 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1051 (u32
)(atomic_long_read(&deve
->read_bytes
) >> 20));
1056 static ssize_t
target_stat_auth_write_mbytes_show(struct config_item
*item
,
1059 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
1060 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1061 struct se_dev_entry
*deve
;
1065 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1070 /* scsiAuthIntrWrittenMegaBytes */
1071 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1072 (u32
)(atomic_long_read(&deve
->write_bytes
) >> 20));
1077 static ssize_t
target_stat_auth_hs_num_cmds_show(struct config_item
*item
,
1080 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
1081 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1082 struct se_dev_entry
*deve
;
1086 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1091 /* FIXME: scsiAuthIntrHSOutCommands */
1092 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
1097 static ssize_t
target_stat_auth_creation_time_show(struct config_item
*item
,
1100 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
1101 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1102 struct se_dev_entry
*deve
;
1106 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1111 /* scsiAuthIntrLastCreation */
1112 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", (u32
)(((u32
)deve
->creation_time
-
1113 INITIAL_JIFFIES
) * 100 / HZ
));
1118 static ssize_t
target_stat_auth_row_status_show(struct config_item
*item
,
1121 struct se_lun_acl
*lacl
= auth_to_lacl(item
);
1122 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1123 struct se_dev_entry
*deve
;
1127 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1132 /* FIXME: scsiAuthIntrRowStatus */
1133 ret
= snprintf(page
, PAGE_SIZE
, "Ready\n");
1138 CONFIGFS_ATTR_RO(target_stat_auth_
, inst
);
1139 CONFIGFS_ATTR_RO(target_stat_auth_
, dev
);
1140 CONFIGFS_ATTR_RO(target_stat_auth_
, port
);
1141 CONFIGFS_ATTR_RO(target_stat_auth_
, indx
);
1142 CONFIGFS_ATTR_RO(target_stat_auth_
, dev_or_port
);
1143 CONFIGFS_ATTR_RO(target_stat_auth_
, intr_name
);
1144 CONFIGFS_ATTR_RO(target_stat_auth_
, map_indx
);
1145 CONFIGFS_ATTR_RO(target_stat_auth_
, att_count
);
1146 CONFIGFS_ATTR_RO(target_stat_auth_
, num_cmds
);
1147 CONFIGFS_ATTR_RO(target_stat_auth_
, read_mbytes
);
1148 CONFIGFS_ATTR_RO(target_stat_auth_
, write_mbytes
);
1149 CONFIGFS_ATTR_RO(target_stat_auth_
, hs_num_cmds
);
1150 CONFIGFS_ATTR_RO(target_stat_auth_
, creation_time
);
1151 CONFIGFS_ATTR_RO(target_stat_auth_
, row_status
);
1153 static struct configfs_attribute
*target_stat_scsi_auth_intr_attrs
[] = {
1154 &target_stat_auth_attr_inst
,
1155 &target_stat_auth_attr_dev
,
1156 &target_stat_auth_attr_port
,
1157 &target_stat_auth_attr_indx
,
1158 &target_stat_auth_attr_dev_or_port
,
1159 &target_stat_auth_attr_intr_name
,
1160 &target_stat_auth_attr_map_indx
,
1161 &target_stat_auth_attr_att_count
,
1162 &target_stat_auth_attr_num_cmds
,
1163 &target_stat_auth_attr_read_mbytes
,
1164 &target_stat_auth_attr_write_mbytes
,
1165 &target_stat_auth_attr_hs_num_cmds
,
1166 &target_stat_auth_attr_creation_time
,
1167 &target_stat_auth_attr_row_status
,
1171 static struct config_item_type target_stat_scsi_auth_intr_cit
= {
1172 .ct_attrs
= target_stat_scsi_auth_intr_attrs
,
1173 .ct_owner
= THIS_MODULE
,
1177 * SCSI Attached Initiator Port Table
1180 static struct se_lun_acl
*iport_to_lacl(struct config_item
*item
)
1182 struct se_ml_stat_grps
*lgrps
= container_of(to_config_group(item
),
1183 struct se_ml_stat_grps
, scsi_att_intr_port_group
);
1184 return container_of(lgrps
, struct se_lun_acl
, ml_stat_grps
);
1187 static ssize_t
target_stat_iport_inst_show(struct config_item
*item
,
1190 struct se_lun_acl
*lacl
= iport_to_lacl(item
);
1191 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1192 struct se_dev_entry
*deve
;
1193 struct se_portal_group
*tpg
;
1197 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1204 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1205 tpg
->se_tpg_tfo
->tpg_get_inst_index(tpg
));
1210 static ssize_t
target_stat_iport_dev_show(struct config_item
*item
,
1213 struct se_lun_acl
*lacl
= iport_to_lacl(item
);
1214 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1215 struct se_dev_entry
*deve
;
1220 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1225 lun
= rcu_dereference(deve
->se_lun
);
1226 /* scsiDeviceIndex */
1227 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", lun
->lun_index
);
1232 static ssize_t
target_stat_iport_port_show(struct config_item
*item
,
1235 struct se_lun_acl
*lacl
= iport_to_lacl(item
);
1236 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1237 struct se_dev_entry
*deve
;
1238 struct se_portal_group
*tpg
;
1242 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1249 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", tpg
->se_tpg_tfo
->tpg_get_tag(tpg
));
1254 static ssize_t
target_stat_iport_indx_show(struct config_item
*item
,
1257 struct se_lun_acl
*lacl
= iport_to_lacl(item
);
1258 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1259 struct se_session
*se_sess
;
1260 struct se_portal_group
*tpg
;
1263 spin_lock_irq(&nacl
->nacl_sess_lock
);
1264 se_sess
= nacl
->nacl_sess
;
1266 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1271 /* scsiAttIntrPortIndex */
1272 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1273 tpg
->se_tpg_tfo
->sess_get_index(se_sess
));
1274 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1278 static ssize_t
target_stat_iport_port_auth_indx_show(struct config_item
*item
,
1281 struct se_lun_acl
*lacl
= iport_to_lacl(item
);
1282 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1283 struct se_dev_entry
*deve
;
1287 deve
= target_nacl_find_deve(nacl
, lacl
->mapped_lun
);
1292 /* scsiAttIntrPortAuthIntrIdx */
1293 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", nacl
->acl_index
);
1298 static ssize_t
target_stat_iport_port_ident_show(struct config_item
*item
,
1301 struct se_lun_acl
*lacl
= iport_to_lacl(item
);
1302 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1303 struct se_session
*se_sess
;
1304 struct se_portal_group
*tpg
;
1306 unsigned char buf
[64];
1308 spin_lock_irq(&nacl
->nacl_sess_lock
);
1309 se_sess
= nacl
->nacl_sess
;
1311 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1316 /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1318 if (tpg
->se_tpg_tfo
->sess_get_initiator_sid
!= NULL
)
1319 tpg
->se_tpg_tfo
->sess_get_initiator_sid(se_sess
, buf
, 64);
1321 ret
= snprintf(page
, PAGE_SIZE
, "%s+i+%s\n", nacl
->initiatorname
, buf
);
1322 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1326 CONFIGFS_ATTR_RO(target_stat_iport_
, inst
);
1327 CONFIGFS_ATTR_RO(target_stat_iport_
, dev
);
1328 CONFIGFS_ATTR_RO(target_stat_iport_
, port
);
1329 CONFIGFS_ATTR_RO(target_stat_iport_
, indx
);
1330 CONFIGFS_ATTR_RO(target_stat_iport_
, port_auth_indx
);
1331 CONFIGFS_ATTR_RO(target_stat_iport_
, port_ident
);
1333 static struct configfs_attribute
*target_stat_scsi_ath_intr_port_attrs
[] = {
1334 &target_stat_iport_attr_inst
,
1335 &target_stat_iport_attr_dev
,
1336 &target_stat_iport_attr_port
,
1337 &target_stat_iport_attr_indx
,
1338 &target_stat_iport_attr_port_auth_indx
,
1339 &target_stat_iport_attr_port_ident
,
1343 static struct config_item_type target_stat_scsi_att_intr_port_cit
= {
1344 .ct_attrs
= target_stat_scsi_ath_intr_port_attrs
,
1345 .ct_owner
= THIS_MODULE
,
1349 * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
1350 * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
1352 void target_stat_setup_mappedlun_default_groups(struct se_lun_acl
*lacl
)
1354 struct config_group
*ml_stat_grp
= &lacl
->ml_stat_grps
.stat_group
;
1356 config_group_init_type_name(&lacl
->ml_stat_grps
.scsi_auth_intr_group
,
1357 "scsi_auth_intr", &target_stat_scsi_auth_intr_cit
);
1358 config_group_init_type_name(&lacl
->ml_stat_grps
.scsi_att_intr_port_group
,
1359 "scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit
);
1361 ml_stat_grp
->default_groups
[0] = &lacl
->ml_stat_grps
.scsi_auth_intr_group
;
1362 ml_stat_grp
->default_groups
[1] = &lacl
->ml_stat_grps
.scsi_att_intr_port_group
;
1363 ml_stat_grp
->default_groups
[2] = NULL
;