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>
36 #include <scsi/scsi.h>
37 #include <scsi/scsi_device.h>
38 #include <scsi/scsi_host.h>
40 #include <target/target_core_base.h>
41 #include <target/target_core_backend.h>
42 #include <target/target_core_fabric.h>
43 #include <target/configfs_macros.h>
45 #include "target_core_internal.h"
47 #ifndef INITIAL_JIFFIES
48 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
52 #define ISPRINT(a) ((a >= ' ') && (a <= '~'))
54 #define SCSI_LU_INDEX 1
61 CONFIGFS_EATTR_STRUCT(target_stat_scsi_dev
, se_dev_stat_grps
);
62 #define DEV_STAT_SCSI_DEV_ATTR(_name, _mode) \
63 static struct target_stat_scsi_dev_attribute \
64 target_stat_scsi_dev_##_name = \
65 __CONFIGFS_EATTR(_name, _mode, \
66 target_stat_scsi_dev_show_attr_##_name, \
67 target_stat_scsi_dev_store_attr_##_name);
69 #define DEV_STAT_SCSI_DEV_ATTR_RO(_name) \
70 static struct target_stat_scsi_dev_attribute \
71 target_stat_scsi_dev_##_name = \
72 __CONFIGFS_EATTR_RO(_name, \
73 target_stat_scsi_dev_show_attr_##_name);
75 static ssize_t
target_stat_scsi_dev_show_attr_inst(
76 struct se_dev_stat_grps
*sgrps
, char *page
)
78 struct se_device
*dev
=
79 container_of(sgrps
, struct se_device
, dev_stat_grps
);
80 struct se_hba
*hba
= dev
->se_hba
;
82 return snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
84 DEV_STAT_SCSI_DEV_ATTR_RO(inst
);
86 static ssize_t
target_stat_scsi_dev_show_attr_indx(
87 struct se_dev_stat_grps
*sgrps
, char *page
)
89 struct se_device
*dev
=
90 container_of(sgrps
, struct se_device
, dev_stat_grps
);
92 return snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
94 DEV_STAT_SCSI_DEV_ATTR_RO(indx
);
96 static ssize_t
target_stat_scsi_dev_show_attr_role(
97 struct se_dev_stat_grps
*sgrps
, char *page
)
99 return snprintf(page
, PAGE_SIZE
, "Target\n");
101 DEV_STAT_SCSI_DEV_ATTR_RO(role
);
103 static ssize_t
target_stat_scsi_dev_show_attr_ports(
104 struct se_dev_stat_grps
*sgrps
, char *page
)
106 struct se_device
*dev
=
107 container_of(sgrps
, struct se_device
, dev_stat_grps
);
109 return snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_port_count
);
111 DEV_STAT_SCSI_DEV_ATTR_RO(ports
);
113 CONFIGFS_EATTR_OPS(target_stat_scsi_dev
, se_dev_stat_grps
, scsi_dev_group
);
115 static struct configfs_attribute
*target_stat_scsi_dev_attrs
[] = {
116 &target_stat_scsi_dev_inst
.attr
,
117 &target_stat_scsi_dev_indx
.attr
,
118 &target_stat_scsi_dev_role
.attr
,
119 &target_stat_scsi_dev_ports
.attr
,
123 static struct configfs_item_operations target_stat_scsi_dev_attrib_ops
= {
124 .show_attribute
= target_stat_scsi_dev_attr_show
,
125 .store_attribute
= target_stat_scsi_dev_attr_store
,
128 static struct config_item_type target_stat_scsi_dev_cit
= {
129 .ct_item_ops
= &target_stat_scsi_dev_attrib_ops
,
130 .ct_attrs
= target_stat_scsi_dev_attrs
,
131 .ct_owner
= THIS_MODULE
,
135 * SCSI Target Device Table
138 CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_dev
, se_dev_stat_grps
);
139 #define DEV_STAT_SCSI_TGT_DEV_ATTR(_name, _mode) \
140 static struct target_stat_scsi_tgt_dev_attribute \
141 target_stat_scsi_tgt_dev_##_name = \
142 __CONFIGFS_EATTR(_name, _mode, \
143 target_stat_scsi_tgt_dev_show_attr_##_name, \
144 target_stat_scsi_tgt_dev_store_attr_##_name);
146 #define DEV_STAT_SCSI_TGT_DEV_ATTR_RO(_name) \
147 static struct target_stat_scsi_tgt_dev_attribute \
148 target_stat_scsi_tgt_dev_##_name = \
149 __CONFIGFS_EATTR_RO(_name, \
150 target_stat_scsi_tgt_dev_show_attr_##_name);
152 static ssize_t
target_stat_scsi_tgt_dev_show_attr_inst(
153 struct se_dev_stat_grps
*sgrps
, char *page
)
155 struct se_device
*dev
=
156 container_of(sgrps
, struct se_device
, dev_stat_grps
);
157 struct se_hba
*hba
= dev
->se_hba
;
159 return snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
161 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(inst
);
163 static ssize_t
target_stat_scsi_tgt_dev_show_attr_indx(
164 struct se_dev_stat_grps
*sgrps
, char *page
)
166 struct se_device
*dev
=
167 container_of(sgrps
, struct se_device
, dev_stat_grps
);
169 return snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
171 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(indx
);
173 static ssize_t
target_stat_scsi_tgt_dev_show_attr_num_lus(
174 struct se_dev_stat_grps
*sgrps
, char *page
)
176 return snprintf(page
, PAGE_SIZE
, "%u\n", LU_COUNT
);
178 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(num_lus
);
180 static ssize_t
target_stat_scsi_tgt_dev_show_attr_status(
181 struct se_dev_stat_grps
*sgrps
, char *page
)
183 struct se_device
*dev
=
184 container_of(sgrps
, struct se_device
, dev_stat_grps
);
186 if (dev
->export_count
)
187 return snprintf(page
, PAGE_SIZE
, "activated");
189 return snprintf(page
, PAGE_SIZE
, "deactivated");
191 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(status
);
193 static ssize_t
target_stat_scsi_tgt_dev_show_attr_non_access_lus(
194 struct se_dev_stat_grps
*sgrps
, char *page
)
196 struct se_device
*dev
=
197 container_of(sgrps
, struct se_device
, dev_stat_grps
);
198 int non_accessible_lus
;
200 if (dev
->export_count
)
201 non_accessible_lus
= 0;
203 non_accessible_lus
= 1;
205 return snprintf(page
, PAGE_SIZE
, "%u\n", non_accessible_lus
);
207 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(non_access_lus
);
209 static ssize_t
target_stat_scsi_tgt_dev_show_attr_resets(
210 struct se_dev_stat_grps
*sgrps
, char *page
)
212 struct se_device
*dev
=
213 container_of(sgrps
, struct se_device
, dev_stat_grps
);
215 return snprintf(page
, PAGE_SIZE
, "%lu\n",
216 atomic_long_read(&dev
->num_resets
));
218 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(resets
);
221 CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_dev
, se_dev_stat_grps
, scsi_tgt_dev_group
);
223 static struct configfs_attribute
*target_stat_scsi_tgt_dev_attrs
[] = {
224 &target_stat_scsi_tgt_dev_inst
.attr
,
225 &target_stat_scsi_tgt_dev_indx
.attr
,
226 &target_stat_scsi_tgt_dev_num_lus
.attr
,
227 &target_stat_scsi_tgt_dev_status
.attr
,
228 &target_stat_scsi_tgt_dev_non_access_lus
.attr
,
229 &target_stat_scsi_tgt_dev_resets
.attr
,
233 static struct configfs_item_operations target_stat_scsi_tgt_dev_attrib_ops
= {
234 .show_attribute
= target_stat_scsi_tgt_dev_attr_show
,
235 .store_attribute
= target_stat_scsi_tgt_dev_attr_store
,
238 static struct config_item_type target_stat_scsi_tgt_dev_cit
= {
239 .ct_item_ops
= &target_stat_scsi_tgt_dev_attrib_ops
,
240 .ct_attrs
= target_stat_scsi_tgt_dev_attrs
,
241 .ct_owner
= THIS_MODULE
,
245 * SCSI Logical Unit Table
248 CONFIGFS_EATTR_STRUCT(target_stat_scsi_lu
, se_dev_stat_grps
);
249 #define DEV_STAT_SCSI_LU_ATTR(_name, _mode) \
250 static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
251 __CONFIGFS_EATTR(_name, _mode, \
252 target_stat_scsi_lu_show_attr_##_name, \
253 target_stat_scsi_lu_store_attr_##_name);
255 #define DEV_STAT_SCSI_LU_ATTR_RO(_name) \
256 static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
257 __CONFIGFS_EATTR_RO(_name, \
258 target_stat_scsi_lu_show_attr_##_name);
260 static ssize_t
target_stat_scsi_lu_show_attr_inst(
261 struct se_dev_stat_grps
*sgrps
, char *page
)
263 struct se_device
*dev
=
264 container_of(sgrps
, struct se_device
, dev_stat_grps
);
265 struct se_hba
*hba
= dev
->se_hba
;
267 return snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
269 DEV_STAT_SCSI_LU_ATTR_RO(inst
);
271 static ssize_t
target_stat_scsi_lu_show_attr_dev(
272 struct se_dev_stat_grps
*sgrps
, char *page
)
274 struct se_device
*dev
=
275 container_of(sgrps
, struct se_device
, dev_stat_grps
);
277 return snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
279 DEV_STAT_SCSI_LU_ATTR_RO(dev
);
281 static ssize_t
target_stat_scsi_lu_show_attr_indx(
282 struct se_dev_stat_grps
*sgrps
, char *page
)
284 return snprintf(page
, PAGE_SIZE
, "%u\n", SCSI_LU_INDEX
);
286 DEV_STAT_SCSI_LU_ATTR_RO(indx
);
288 static ssize_t
target_stat_scsi_lu_show_attr_lun(
289 struct se_dev_stat_grps
*sgrps
, char *page
)
291 /* FIXME: scsiLuDefaultLun */
292 return snprintf(page
, PAGE_SIZE
, "%llu\n", (unsigned long long)0);
294 DEV_STAT_SCSI_LU_ATTR_RO(lun
);
296 static ssize_t
target_stat_scsi_lu_show_attr_lu_name(
297 struct se_dev_stat_grps
*sgrps
, char *page
)
299 struct se_device
*dev
=
300 container_of(sgrps
, struct se_device
, dev_stat_grps
);
303 return snprintf(page
, PAGE_SIZE
, "%s\n",
304 (strlen(dev
->t10_wwn
.unit_serial
)) ?
305 dev
->t10_wwn
.unit_serial
: "None");
307 DEV_STAT_SCSI_LU_ATTR_RO(lu_name
);
309 static ssize_t
target_stat_scsi_lu_show_attr_vend(
310 struct se_dev_stat_grps
*sgrps
, char *page
)
312 struct se_device
*dev
=
313 container_of(sgrps
, struct se_device
, dev_stat_grps
);
315 char str
[sizeof(dev
->t10_wwn
.vendor
)+1];
318 for (i
= 0; i
< sizeof(dev
->t10_wwn
.vendor
); i
++)
319 str
[i
] = ISPRINT(dev
->t10_wwn
.vendor
[i
]) ?
320 dev
->t10_wwn
.vendor
[i
] : ' ';
322 return snprintf(page
, PAGE_SIZE
, "%s\n", str
);
324 DEV_STAT_SCSI_LU_ATTR_RO(vend
);
326 static ssize_t
target_stat_scsi_lu_show_attr_prod(
327 struct se_dev_stat_grps
*sgrps
, char *page
)
329 struct se_device
*dev
=
330 container_of(sgrps
, struct se_device
, dev_stat_grps
);
332 char str
[sizeof(dev
->t10_wwn
.model
)+1];
334 /* scsiLuProductId */
335 for (i
= 0; i
< sizeof(dev
->t10_wwn
.vendor
); i
++)
336 str
[i
] = ISPRINT(dev
->t10_wwn
.model
[i
]) ?
337 dev
->t10_wwn
.model
[i
] : ' ';
339 return snprintf(page
, PAGE_SIZE
, "%s\n", str
);
341 DEV_STAT_SCSI_LU_ATTR_RO(prod
);
343 static ssize_t
target_stat_scsi_lu_show_attr_rev(
344 struct se_dev_stat_grps
*sgrps
, char *page
)
346 struct se_device
*dev
=
347 container_of(sgrps
, struct se_device
, dev_stat_grps
);
349 char str
[sizeof(dev
->t10_wwn
.revision
)+1];
351 /* scsiLuRevisionId */
352 for (i
= 0; i
< sizeof(dev
->t10_wwn
.revision
); i
++)
353 str
[i
] = ISPRINT(dev
->t10_wwn
.revision
[i
]) ?
354 dev
->t10_wwn
.revision
[i
] : ' ';
356 return snprintf(page
, PAGE_SIZE
, "%s\n", str
);
358 DEV_STAT_SCSI_LU_ATTR_RO(rev
);
360 static ssize_t
target_stat_scsi_lu_show_attr_dev_type(
361 struct se_dev_stat_grps
*sgrps
, char *page
)
363 struct se_device
*dev
=
364 container_of(sgrps
, struct se_device
, dev_stat_grps
);
366 /* scsiLuPeripheralType */
367 return snprintf(page
, PAGE_SIZE
, "%u\n",
368 dev
->transport
->get_device_type(dev
));
370 DEV_STAT_SCSI_LU_ATTR_RO(dev_type
);
372 static ssize_t
target_stat_scsi_lu_show_attr_status(
373 struct se_dev_stat_grps
*sgrps
, char *page
)
375 struct se_device
*dev
=
376 container_of(sgrps
, struct se_device
, dev_stat_grps
);
379 return snprintf(page
, PAGE_SIZE
, "%s\n",
380 (dev
->export_count
) ? "available" : "notavailable");
382 DEV_STAT_SCSI_LU_ATTR_RO(status
);
384 static ssize_t
target_stat_scsi_lu_show_attr_state_bit(
385 struct se_dev_stat_grps
*sgrps
, char *page
)
388 return snprintf(page
, PAGE_SIZE
, "exposed\n");
390 DEV_STAT_SCSI_LU_ATTR_RO(state_bit
);
392 static ssize_t
target_stat_scsi_lu_show_attr_num_cmds(
393 struct se_dev_stat_grps
*sgrps
, char *page
)
395 struct se_device
*dev
=
396 container_of(sgrps
, struct se_device
, dev_stat_grps
);
398 /* scsiLuNumCommands */
399 return snprintf(page
, PAGE_SIZE
, "%lu\n",
400 atomic_long_read(&dev
->num_cmds
));
402 DEV_STAT_SCSI_LU_ATTR_RO(num_cmds
);
404 static ssize_t
target_stat_scsi_lu_show_attr_read_mbytes(
405 struct se_dev_stat_grps
*sgrps
, char *page
)
407 struct se_device
*dev
=
408 container_of(sgrps
, struct se_device
, dev_stat_grps
);
410 /* scsiLuReadMegaBytes */
411 return snprintf(page
, PAGE_SIZE
, "%lu\n",
412 atomic_long_read(&dev
->read_bytes
) >> 20);
414 DEV_STAT_SCSI_LU_ATTR_RO(read_mbytes
);
416 static ssize_t
target_stat_scsi_lu_show_attr_write_mbytes(
417 struct se_dev_stat_grps
*sgrps
, char *page
)
419 struct se_device
*dev
=
420 container_of(sgrps
, struct se_device
, dev_stat_grps
);
422 /* scsiLuWrittenMegaBytes */
423 return snprintf(page
, PAGE_SIZE
, "%lu\n",
424 atomic_long_read(&dev
->write_bytes
) >> 20);
426 DEV_STAT_SCSI_LU_ATTR_RO(write_mbytes
);
428 static ssize_t
target_stat_scsi_lu_show_attr_resets(
429 struct se_dev_stat_grps
*sgrps
, char *page
)
431 struct se_device
*dev
=
432 container_of(sgrps
, struct se_device
, dev_stat_grps
);
435 return snprintf(page
, PAGE_SIZE
, "%lu\n", atomic_long_read(&dev
->num_resets
));
437 DEV_STAT_SCSI_LU_ATTR_RO(resets
);
439 static ssize_t
target_stat_scsi_lu_show_attr_full_stat(
440 struct se_dev_stat_grps
*sgrps
, char *page
)
442 /* FIXME: scsiLuOutTaskSetFullStatus */
443 return snprintf(page
, PAGE_SIZE
, "%u\n", 0);
445 DEV_STAT_SCSI_LU_ATTR_RO(full_stat
);
447 static ssize_t
target_stat_scsi_lu_show_attr_hs_num_cmds(
448 struct se_dev_stat_grps
*sgrps
, char *page
)
450 /* FIXME: scsiLuHSInCommands */
451 return snprintf(page
, PAGE_SIZE
, "%u\n", 0);
453 DEV_STAT_SCSI_LU_ATTR_RO(hs_num_cmds
);
455 static ssize_t
target_stat_scsi_lu_show_attr_creation_time(
456 struct se_dev_stat_grps
*sgrps
, char *page
)
458 struct se_device
*dev
=
459 container_of(sgrps
, struct se_device
, dev_stat_grps
);
461 /* scsiLuCreationTime */
462 return snprintf(page
, PAGE_SIZE
, "%u\n", (u32
)(((u32
)dev
->creation_time
-
463 INITIAL_JIFFIES
) * 100 / HZ
));
465 DEV_STAT_SCSI_LU_ATTR_RO(creation_time
);
467 CONFIGFS_EATTR_OPS(target_stat_scsi_lu
, se_dev_stat_grps
, scsi_lu_group
);
469 static struct configfs_attribute
*target_stat_scsi_lu_attrs
[] = {
470 &target_stat_scsi_lu_inst
.attr
,
471 &target_stat_scsi_lu_dev
.attr
,
472 &target_stat_scsi_lu_indx
.attr
,
473 &target_stat_scsi_lu_lun
.attr
,
474 &target_stat_scsi_lu_lu_name
.attr
,
475 &target_stat_scsi_lu_vend
.attr
,
476 &target_stat_scsi_lu_prod
.attr
,
477 &target_stat_scsi_lu_rev
.attr
,
478 &target_stat_scsi_lu_dev_type
.attr
,
479 &target_stat_scsi_lu_status
.attr
,
480 &target_stat_scsi_lu_state_bit
.attr
,
481 &target_stat_scsi_lu_num_cmds
.attr
,
482 &target_stat_scsi_lu_read_mbytes
.attr
,
483 &target_stat_scsi_lu_write_mbytes
.attr
,
484 &target_stat_scsi_lu_resets
.attr
,
485 &target_stat_scsi_lu_full_stat
.attr
,
486 &target_stat_scsi_lu_hs_num_cmds
.attr
,
487 &target_stat_scsi_lu_creation_time
.attr
,
491 static struct configfs_item_operations target_stat_scsi_lu_attrib_ops
= {
492 .show_attribute
= target_stat_scsi_lu_attr_show
,
493 .store_attribute
= target_stat_scsi_lu_attr_store
,
496 static struct config_item_type target_stat_scsi_lu_cit
= {
497 .ct_item_ops
= &target_stat_scsi_lu_attrib_ops
,
498 .ct_attrs
= target_stat_scsi_lu_attrs
,
499 .ct_owner
= THIS_MODULE
,
503 * Called from target_core_configfs.c:target_core_make_subdev() to setup
504 * the target statistics groups + configfs CITs located in target_core_stat.c
506 void target_stat_setup_dev_default_groups(struct se_device
*dev
)
508 struct config_group
*dev_stat_grp
= &dev
->dev_stat_grps
.stat_group
;
510 config_group_init_type_name(&dev
->dev_stat_grps
.scsi_dev_group
,
511 "scsi_dev", &target_stat_scsi_dev_cit
);
512 config_group_init_type_name(&dev
->dev_stat_grps
.scsi_tgt_dev_group
,
513 "scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit
);
514 config_group_init_type_name(&dev
->dev_stat_grps
.scsi_lu_group
,
515 "scsi_lu", &target_stat_scsi_lu_cit
);
517 dev_stat_grp
->default_groups
[0] = &dev
->dev_stat_grps
.scsi_dev_group
;
518 dev_stat_grp
->default_groups
[1] = &dev
->dev_stat_grps
.scsi_tgt_dev_group
;
519 dev_stat_grp
->default_groups
[2] = &dev
->dev_stat_grps
.scsi_lu_group
;
520 dev_stat_grp
->default_groups
[3] = NULL
;
527 CONFIGFS_EATTR_STRUCT(target_stat_scsi_port
, se_port_stat_grps
);
528 #define DEV_STAT_SCSI_PORT_ATTR(_name, _mode) \
529 static struct target_stat_scsi_port_attribute \
530 target_stat_scsi_port_##_name = \
531 __CONFIGFS_EATTR(_name, _mode, \
532 target_stat_scsi_port_show_attr_##_name, \
533 target_stat_scsi_port_store_attr_##_name);
535 #define DEV_STAT_SCSI_PORT_ATTR_RO(_name) \
536 static struct target_stat_scsi_port_attribute \
537 target_stat_scsi_port_##_name = \
538 __CONFIGFS_EATTR_RO(_name, \
539 target_stat_scsi_port_show_attr_##_name);
541 static ssize_t
target_stat_scsi_port_show_attr_inst(
542 struct se_port_stat_grps
*pgrps
, char *page
)
544 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
546 struct se_device
*dev
= lun
->lun_se_dev
;
550 spin_lock(&lun
->lun_sep_lock
);
553 spin_unlock(&lun
->lun_sep_lock
);
557 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
558 spin_unlock(&lun
->lun_sep_lock
);
561 DEV_STAT_SCSI_PORT_ATTR_RO(inst
);
563 static ssize_t
target_stat_scsi_port_show_attr_dev(
564 struct se_port_stat_grps
*pgrps
, char *page
)
566 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
568 struct se_device
*dev
= lun
->lun_se_dev
;
571 spin_lock(&lun
->lun_sep_lock
);
574 spin_unlock(&lun
->lun_sep_lock
);
577 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
578 spin_unlock(&lun
->lun_sep_lock
);
581 DEV_STAT_SCSI_PORT_ATTR_RO(dev
);
583 static ssize_t
target_stat_scsi_port_show_attr_indx(
584 struct se_port_stat_grps
*pgrps
, char *page
)
586 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
590 spin_lock(&lun
->lun_sep_lock
);
593 spin_unlock(&lun
->lun_sep_lock
);
596 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", sep
->sep_index
);
597 spin_unlock(&lun
->lun_sep_lock
);
600 DEV_STAT_SCSI_PORT_ATTR_RO(indx
);
602 static ssize_t
target_stat_scsi_port_show_attr_role(
603 struct se_port_stat_grps
*pgrps
, char *page
)
605 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
606 struct se_device
*dev
= lun
->lun_se_dev
;
613 spin_lock(&lun
->lun_sep_lock
);
616 spin_unlock(&lun
->lun_sep_lock
);
619 ret
= snprintf(page
, PAGE_SIZE
, "%s%u\n", "Device", dev
->dev_index
);
620 spin_unlock(&lun
->lun_sep_lock
);
623 DEV_STAT_SCSI_PORT_ATTR_RO(role
);
625 static ssize_t
target_stat_scsi_port_show_attr_busy_count(
626 struct se_port_stat_grps
*pgrps
, char *page
)
628 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
632 spin_lock(&lun
->lun_sep_lock
);
635 spin_unlock(&lun
->lun_sep_lock
);
638 /* FIXME: scsiPortBusyStatuses */
639 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
640 spin_unlock(&lun
->lun_sep_lock
);
643 DEV_STAT_SCSI_PORT_ATTR_RO(busy_count
);
645 CONFIGFS_EATTR_OPS(target_stat_scsi_port
, se_port_stat_grps
, scsi_port_group
);
647 static struct configfs_attribute
*target_stat_scsi_port_attrs
[] = {
648 &target_stat_scsi_port_inst
.attr
,
649 &target_stat_scsi_port_dev
.attr
,
650 &target_stat_scsi_port_indx
.attr
,
651 &target_stat_scsi_port_role
.attr
,
652 &target_stat_scsi_port_busy_count
.attr
,
656 static struct configfs_item_operations target_stat_scsi_port_attrib_ops
= {
657 .show_attribute
= target_stat_scsi_port_attr_show
,
658 .store_attribute
= target_stat_scsi_port_attr_store
,
661 static struct config_item_type target_stat_scsi_port_cit
= {
662 .ct_item_ops
= &target_stat_scsi_port_attrib_ops
,
663 .ct_attrs
= target_stat_scsi_port_attrs
,
664 .ct_owner
= THIS_MODULE
,
668 * SCSI Target Port Table
670 CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_port
, se_port_stat_grps
);
671 #define DEV_STAT_SCSI_TGT_PORT_ATTR(_name, _mode) \
672 static struct target_stat_scsi_tgt_port_attribute \
673 target_stat_scsi_tgt_port_##_name = \
674 __CONFIGFS_EATTR(_name, _mode, \
675 target_stat_scsi_tgt_port_show_attr_##_name, \
676 target_stat_scsi_tgt_port_store_attr_##_name);
678 #define DEV_STAT_SCSI_TGT_PORT_ATTR_RO(_name) \
679 static struct target_stat_scsi_tgt_port_attribute \
680 target_stat_scsi_tgt_port_##_name = \
681 __CONFIGFS_EATTR_RO(_name, \
682 target_stat_scsi_tgt_port_show_attr_##_name);
684 static ssize_t
target_stat_scsi_tgt_port_show_attr_inst(
685 struct se_port_stat_grps
*pgrps
, char *page
)
687 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
688 struct se_device
*dev
= lun
->lun_se_dev
;
693 spin_lock(&lun
->lun_sep_lock
);
696 spin_unlock(&lun
->lun_sep_lock
);
700 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
701 spin_unlock(&lun
->lun_sep_lock
);
704 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(inst
);
706 static ssize_t
target_stat_scsi_tgt_port_show_attr_dev(
707 struct se_port_stat_grps
*pgrps
, char *page
)
709 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
710 struct se_device
*dev
= lun
->lun_se_dev
;
714 spin_lock(&lun
->lun_sep_lock
);
717 spin_unlock(&lun
->lun_sep_lock
);
720 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", dev
->dev_index
);
721 spin_unlock(&lun
->lun_sep_lock
);
724 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(dev
);
726 static ssize_t
target_stat_scsi_tgt_port_show_attr_indx(
727 struct se_port_stat_grps
*pgrps
, char *page
)
729 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
733 spin_lock(&lun
->lun_sep_lock
);
736 spin_unlock(&lun
->lun_sep_lock
);
739 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", sep
->sep_index
);
740 spin_unlock(&lun
->lun_sep_lock
);
743 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(indx
);
745 static ssize_t
target_stat_scsi_tgt_port_show_attr_name(
746 struct se_port_stat_grps
*pgrps
, char *page
)
748 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
750 struct se_portal_group
*tpg
;
753 spin_lock(&lun
->lun_sep_lock
);
756 spin_unlock(&lun
->lun_sep_lock
);
761 ret
= snprintf(page
, PAGE_SIZE
, "%sPort#%u\n",
762 tpg
->se_tpg_tfo
->get_fabric_name(), sep
->sep_index
);
763 spin_unlock(&lun
->lun_sep_lock
);
766 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(name
);
768 static ssize_t
target_stat_scsi_tgt_port_show_attr_port_index(
769 struct se_port_stat_grps
*pgrps
, char *page
)
771 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
773 struct se_portal_group
*tpg
;
776 spin_lock(&lun
->lun_sep_lock
);
779 spin_unlock(&lun
->lun_sep_lock
);
784 ret
= snprintf(page
, PAGE_SIZE
, "%s%s%d\n",
785 tpg
->se_tpg_tfo
->tpg_get_wwn(tpg
), "+t+",
786 tpg
->se_tpg_tfo
->tpg_get_tag(tpg
));
787 spin_unlock(&lun
->lun_sep_lock
);
790 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(port_index
);
792 static ssize_t
target_stat_scsi_tgt_port_show_attr_in_cmds(
793 struct se_port_stat_grps
*pgrps
, char *page
)
795 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
799 spin_lock(&lun
->lun_sep_lock
);
802 spin_unlock(&lun
->lun_sep_lock
);
806 ret
= snprintf(page
, PAGE_SIZE
, "%llu\n", sep
->sep_stats
.cmd_pdus
);
807 spin_unlock(&lun
->lun_sep_lock
);
810 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(in_cmds
);
812 static ssize_t
target_stat_scsi_tgt_port_show_attr_write_mbytes(
813 struct se_port_stat_grps
*pgrps
, char *page
)
815 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
819 spin_lock(&lun
->lun_sep_lock
);
822 spin_unlock(&lun
->lun_sep_lock
);
826 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
827 (u32
)(sep
->sep_stats
.rx_data_octets
>> 20));
828 spin_unlock(&lun
->lun_sep_lock
);
831 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(write_mbytes
);
833 static ssize_t
target_stat_scsi_tgt_port_show_attr_read_mbytes(
834 struct se_port_stat_grps
*pgrps
, char *page
)
836 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
840 spin_lock(&lun
->lun_sep_lock
);
843 spin_unlock(&lun
->lun_sep_lock
);
847 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
848 (u32
)(sep
->sep_stats
.tx_data_octets
>> 20));
849 spin_unlock(&lun
->lun_sep_lock
);
852 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(read_mbytes
);
854 static ssize_t
target_stat_scsi_tgt_port_show_attr_hs_in_cmds(
855 struct se_port_stat_grps
*pgrps
, char *page
)
857 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
861 spin_lock(&lun
->lun_sep_lock
);
864 spin_unlock(&lun
->lun_sep_lock
);
868 /* FIXME: scsiTgtPortHsInCommands */
869 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
870 spin_unlock(&lun
->lun_sep_lock
);
873 DEV_STAT_SCSI_TGT_PORT_ATTR_RO(hs_in_cmds
);
875 CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_port
, se_port_stat_grps
,
876 scsi_tgt_port_group
);
878 static struct configfs_attribute
*target_stat_scsi_tgt_port_attrs
[] = {
879 &target_stat_scsi_tgt_port_inst
.attr
,
880 &target_stat_scsi_tgt_port_dev
.attr
,
881 &target_stat_scsi_tgt_port_indx
.attr
,
882 &target_stat_scsi_tgt_port_name
.attr
,
883 &target_stat_scsi_tgt_port_port_index
.attr
,
884 &target_stat_scsi_tgt_port_in_cmds
.attr
,
885 &target_stat_scsi_tgt_port_write_mbytes
.attr
,
886 &target_stat_scsi_tgt_port_read_mbytes
.attr
,
887 &target_stat_scsi_tgt_port_hs_in_cmds
.attr
,
891 static struct configfs_item_operations target_stat_scsi_tgt_port_attrib_ops
= {
892 .show_attribute
= target_stat_scsi_tgt_port_attr_show
,
893 .store_attribute
= target_stat_scsi_tgt_port_attr_store
,
896 static struct config_item_type target_stat_scsi_tgt_port_cit
= {
897 .ct_item_ops
= &target_stat_scsi_tgt_port_attrib_ops
,
898 .ct_attrs
= target_stat_scsi_tgt_port_attrs
,
899 .ct_owner
= THIS_MODULE
,
903 * SCSI Transport Table
906 CONFIGFS_EATTR_STRUCT(target_stat_scsi_transport
, se_port_stat_grps
);
907 #define DEV_STAT_SCSI_TRANSPORT_ATTR(_name, _mode) \
908 static struct target_stat_scsi_transport_attribute \
909 target_stat_scsi_transport_##_name = \
910 __CONFIGFS_EATTR(_name, _mode, \
911 target_stat_scsi_transport_show_attr_##_name, \
912 target_stat_scsi_transport_store_attr_##_name);
914 #define DEV_STAT_SCSI_TRANSPORT_ATTR_RO(_name) \
915 static struct target_stat_scsi_transport_attribute \
916 target_stat_scsi_transport_##_name = \
917 __CONFIGFS_EATTR_RO(_name, \
918 target_stat_scsi_transport_show_attr_##_name);
920 static ssize_t
target_stat_scsi_transport_show_attr_inst(
921 struct se_port_stat_grps
*pgrps
, char *page
)
923 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
924 struct se_device
*dev
= lun
->lun_se_dev
;
929 spin_lock(&lun
->lun_sep_lock
);
932 spin_unlock(&lun
->lun_sep_lock
);
937 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", hba
->hba_index
);
938 spin_unlock(&lun
->lun_sep_lock
);
941 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(inst
);
943 static ssize_t
target_stat_scsi_transport_show_attr_device(
944 struct se_port_stat_grps
*pgrps
, char *page
)
946 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
948 struct se_portal_group
*tpg
;
951 spin_lock(&lun
->lun_sep_lock
);
954 spin_unlock(&lun
->lun_sep_lock
);
958 /* scsiTransportType */
959 ret
= snprintf(page
, PAGE_SIZE
, "scsiTransport%s\n",
960 tpg
->se_tpg_tfo
->get_fabric_name());
961 spin_unlock(&lun
->lun_sep_lock
);
964 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(device
);
966 static ssize_t
target_stat_scsi_transport_show_attr_indx(
967 struct se_port_stat_grps
*pgrps
, char *page
)
969 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
971 struct se_portal_group
*tpg
;
974 spin_lock(&lun
->lun_sep_lock
);
977 spin_unlock(&lun
->lun_sep_lock
);
981 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
982 tpg
->se_tpg_tfo
->tpg_get_inst_index(tpg
));
983 spin_unlock(&lun
->lun_sep_lock
);
986 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(indx
);
988 static ssize_t
target_stat_scsi_transport_show_attr_dev_name(
989 struct se_port_stat_grps
*pgrps
, char *page
)
991 struct se_lun
*lun
= container_of(pgrps
, struct se_lun
, port_stat_grps
);
992 struct se_device
*dev
= lun
->lun_se_dev
;
994 struct se_portal_group
*tpg
;
998 spin_lock(&lun
->lun_sep_lock
);
1001 spin_unlock(&lun
->lun_sep_lock
);
1005 wwn
= &dev
->t10_wwn
;
1006 /* scsiTransportDevName */
1007 ret
= snprintf(page
, PAGE_SIZE
, "%s+%s\n",
1008 tpg
->se_tpg_tfo
->tpg_get_wwn(tpg
),
1009 (strlen(wwn
->unit_serial
)) ? wwn
->unit_serial
:
1011 spin_unlock(&lun
->lun_sep_lock
);
1014 DEV_STAT_SCSI_TRANSPORT_ATTR_RO(dev_name
);
1016 CONFIGFS_EATTR_OPS(target_stat_scsi_transport
, se_port_stat_grps
,
1017 scsi_transport_group
);
1019 static struct configfs_attribute
*target_stat_scsi_transport_attrs
[] = {
1020 &target_stat_scsi_transport_inst
.attr
,
1021 &target_stat_scsi_transport_device
.attr
,
1022 &target_stat_scsi_transport_indx
.attr
,
1023 &target_stat_scsi_transport_dev_name
.attr
,
1027 static struct configfs_item_operations target_stat_scsi_transport_attrib_ops
= {
1028 .show_attribute
= target_stat_scsi_transport_attr_show
,
1029 .store_attribute
= target_stat_scsi_transport_attr_store
,
1032 static struct config_item_type target_stat_scsi_transport_cit
= {
1033 .ct_item_ops
= &target_stat_scsi_transport_attrib_ops
,
1034 .ct_attrs
= target_stat_scsi_transport_attrs
,
1035 .ct_owner
= THIS_MODULE
,
1039 * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
1040 * the target port statistics groups + configfs CITs located in target_core_stat.c
1042 void target_stat_setup_port_default_groups(struct se_lun
*lun
)
1044 struct config_group
*port_stat_grp
= &lun
->port_stat_grps
.stat_group
;
1046 config_group_init_type_name(&lun
->port_stat_grps
.scsi_port_group
,
1047 "scsi_port", &target_stat_scsi_port_cit
);
1048 config_group_init_type_name(&lun
->port_stat_grps
.scsi_tgt_port_group
,
1049 "scsi_tgt_port", &target_stat_scsi_tgt_port_cit
);
1050 config_group_init_type_name(&lun
->port_stat_grps
.scsi_transport_group
,
1051 "scsi_transport", &target_stat_scsi_transport_cit
);
1053 port_stat_grp
->default_groups
[0] = &lun
->port_stat_grps
.scsi_port_group
;
1054 port_stat_grp
->default_groups
[1] = &lun
->port_stat_grps
.scsi_tgt_port_group
;
1055 port_stat_grp
->default_groups
[2] = &lun
->port_stat_grps
.scsi_transport_group
;
1056 port_stat_grp
->default_groups
[3] = NULL
;
1060 * SCSI Authorized Initiator Table
1063 CONFIGFS_EATTR_STRUCT(target_stat_scsi_auth_intr
, se_ml_stat_grps
);
1064 #define DEV_STAT_SCSI_AUTH_INTR_ATTR(_name, _mode) \
1065 static struct target_stat_scsi_auth_intr_attribute \
1066 target_stat_scsi_auth_intr_##_name = \
1067 __CONFIGFS_EATTR(_name, _mode, \
1068 target_stat_scsi_auth_intr_show_attr_##_name, \
1069 target_stat_scsi_auth_intr_store_attr_##_name);
1071 #define DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(_name) \
1072 static struct target_stat_scsi_auth_intr_attribute \
1073 target_stat_scsi_auth_intr_##_name = \
1074 __CONFIGFS_EATTR_RO(_name, \
1075 target_stat_scsi_auth_intr_show_attr_##_name);
1077 static ssize_t
target_stat_scsi_auth_intr_show_attr_inst(
1078 struct se_ml_stat_grps
*lgrps
, char *page
)
1080 struct se_lun_acl
*lacl
= container_of(lgrps
,
1081 struct se_lun_acl
, ml_stat_grps
);
1082 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1083 struct se_dev_entry
*deve
;
1084 struct se_portal_group
*tpg
;
1087 spin_lock_irq(&nacl
->device_list_lock
);
1088 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1089 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1090 spin_unlock_irq(&nacl
->device_list_lock
);
1095 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1096 tpg
->se_tpg_tfo
->tpg_get_inst_index(tpg
));
1097 spin_unlock_irq(&nacl
->device_list_lock
);
1100 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(inst
);
1102 static ssize_t
target_stat_scsi_auth_intr_show_attr_dev(
1103 struct se_ml_stat_grps
*lgrps
, char *page
)
1105 struct se_lun_acl
*lacl
= container_of(lgrps
,
1106 struct se_lun_acl
, ml_stat_grps
);
1107 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1108 struct se_dev_entry
*deve
;
1112 spin_lock_irq(&nacl
->device_list_lock
);
1113 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1114 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1115 spin_unlock_irq(&nacl
->device_list_lock
);
1119 /* scsiDeviceIndex */
1120 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", lun
->lun_se_dev
->dev_index
);
1121 spin_unlock_irq(&nacl
->device_list_lock
);
1124 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev
);
1126 static ssize_t
target_stat_scsi_auth_intr_show_attr_port(
1127 struct se_ml_stat_grps
*lgrps
, char *page
)
1129 struct se_lun_acl
*lacl
= container_of(lgrps
,
1130 struct se_lun_acl
, ml_stat_grps
);
1131 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1132 struct se_dev_entry
*deve
;
1133 struct se_portal_group
*tpg
;
1136 spin_lock_irq(&nacl
->device_list_lock
);
1137 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1138 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1139 spin_unlock_irq(&nacl
->device_list_lock
);
1143 /* scsiAuthIntrTgtPortIndex */
1144 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", tpg
->se_tpg_tfo
->tpg_get_tag(tpg
));
1145 spin_unlock_irq(&nacl
->device_list_lock
);
1148 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(port
);
1150 static ssize_t
target_stat_scsi_auth_intr_show_attr_indx(
1151 struct se_ml_stat_grps
*lgrps
, char *page
)
1153 struct se_lun_acl
*lacl
= container_of(lgrps
,
1154 struct se_lun_acl
, ml_stat_grps
);
1155 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1156 struct se_dev_entry
*deve
;
1159 spin_lock_irq(&nacl
->device_list_lock
);
1160 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1161 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1162 spin_unlock_irq(&nacl
->device_list_lock
);
1165 /* scsiAuthIntrIndex */
1166 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", nacl
->acl_index
);
1167 spin_unlock_irq(&nacl
->device_list_lock
);
1170 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(indx
);
1172 static ssize_t
target_stat_scsi_auth_intr_show_attr_dev_or_port(
1173 struct se_ml_stat_grps
*lgrps
, char *page
)
1175 struct se_lun_acl
*lacl
= container_of(lgrps
,
1176 struct se_lun_acl
, ml_stat_grps
);
1177 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1178 struct se_dev_entry
*deve
;
1181 spin_lock_irq(&nacl
->device_list_lock
);
1182 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1183 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1184 spin_unlock_irq(&nacl
->device_list_lock
);
1187 /* scsiAuthIntrDevOrPort */
1188 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 1);
1189 spin_unlock_irq(&nacl
->device_list_lock
);
1192 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev_or_port
);
1194 static ssize_t
target_stat_scsi_auth_intr_show_attr_intr_name(
1195 struct se_ml_stat_grps
*lgrps
, char *page
)
1197 struct se_lun_acl
*lacl
= container_of(lgrps
,
1198 struct se_lun_acl
, ml_stat_grps
);
1199 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1200 struct se_dev_entry
*deve
;
1203 spin_lock_irq(&nacl
->device_list_lock
);
1204 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1205 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1206 spin_unlock_irq(&nacl
->device_list_lock
);
1209 /* scsiAuthIntrName */
1210 ret
= snprintf(page
, PAGE_SIZE
, "%s\n", nacl
->initiatorname
);
1211 spin_unlock_irq(&nacl
->device_list_lock
);
1214 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(intr_name
);
1216 static ssize_t
target_stat_scsi_auth_intr_show_attr_map_indx(
1217 struct se_ml_stat_grps
*lgrps
, char *page
)
1219 struct se_lun_acl
*lacl
= container_of(lgrps
,
1220 struct se_lun_acl
, ml_stat_grps
);
1221 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1222 struct se_dev_entry
*deve
;
1225 spin_lock_irq(&nacl
->device_list_lock
);
1226 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1227 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1228 spin_unlock_irq(&nacl
->device_list_lock
);
1231 /* FIXME: scsiAuthIntrLunMapIndex */
1232 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
1233 spin_unlock_irq(&nacl
->device_list_lock
);
1236 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(map_indx
);
1238 static ssize_t
target_stat_scsi_auth_intr_show_attr_att_count(
1239 struct se_ml_stat_grps
*lgrps
, char *page
)
1241 struct se_lun_acl
*lacl
= container_of(lgrps
,
1242 struct se_lun_acl
, ml_stat_grps
);
1243 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1244 struct se_dev_entry
*deve
;
1247 spin_lock_irq(&nacl
->device_list_lock
);
1248 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1249 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1250 spin_unlock_irq(&nacl
->device_list_lock
);
1253 /* scsiAuthIntrAttachedTimes */
1254 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", deve
->attach_count
);
1255 spin_unlock_irq(&nacl
->device_list_lock
);
1258 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(att_count
);
1260 static ssize_t
target_stat_scsi_auth_intr_show_attr_num_cmds(
1261 struct se_ml_stat_grps
*lgrps
, char *page
)
1263 struct se_lun_acl
*lacl
= container_of(lgrps
,
1264 struct se_lun_acl
, ml_stat_grps
);
1265 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1266 struct se_dev_entry
*deve
;
1269 spin_lock_irq(&nacl
->device_list_lock
);
1270 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1271 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1272 spin_unlock_irq(&nacl
->device_list_lock
);
1275 /* scsiAuthIntrOutCommands */
1276 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", deve
->total_cmds
);
1277 spin_unlock_irq(&nacl
->device_list_lock
);
1280 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(num_cmds
);
1282 static ssize_t
target_stat_scsi_auth_intr_show_attr_read_mbytes(
1283 struct se_ml_stat_grps
*lgrps
, char *page
)
1285 struct se_lun_acl
*lacl
= container_of(lgrps
,
1286 struct se_lun_acl
, ml_stat_grps
);
1287 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1288 struct se_dev_entry
*deve
;
1291 spin_lock_irq(&nacl
->device_list_lock
);
1292 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1293 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1294 spin_unlock_irq(&nacl
->device_list_lock
);
1297 /* scsiAuthIntrReadMegaBytes */
1298 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", (u32
)(deve
->read_bytes
>> 20));
1299 spin_unlock_irq(&nacl
->device_list_lock
);
1302 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(read_mbytes
);
1304 static ssize_t
target_stat_scsi_auth_intr_show_attr_write_mbytes(
1305 struct se_ml_stat_grps
*lgrps
, char *page
)
1307 struct se_lun_acl
*lacl
= container_of(lgrps
,
1308 struct se_lun_acl
, ml_stat_grps
);
1309 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1310 struct se_dev_entry
*deve
;
1313 spin_lock_irq(&nacl
->device_list_lock
);
1314 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1315 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1316 spin_unlock_irq(&nacl
->device_list_lock
);
1319 /* scsiAuthIntrWrittenMegaBytes */
1320 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", (u32
)(deve
->write_bytes
>> 20));
1321 spin_unlock_irq(&nacl
->device_list_lock
);
1324 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(write_mbytes
);
1326 static ssize_t
target_stat_scsi_auth_intr_show_attr_hs_num_cmds(
1327 struct se_ml_stat_grps
*lgrps
, char *page
)
1329 struct se_lun_acl
*lacl
= container_of(lgrps
,
1330 struct se_lun_acl
, ml_stat_grps
);
1331 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1332 struct se_dev_entry
*deve
;
1335 spin_lock_irq(&nacl
->device_list_lock
);
1336 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1337 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1338 spin_unlock_irq(&nacl
->device_list_lock
);
1341 /* FIXME: scsiAuthIntrHSOutCommands */
1342 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", 0);
1343 spin_unlock_irq(&nacl
->device_list_lock
);
1346 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(hs_num_cmds
);
1348 static ssize_t
target_stat_scsi_auth_intr_show_attr_creation_time(
1349 struct se_ml_stat_grps
*lgrps
, char *page
)
1351 struct se_lun_acl
*lacl
= container_of(lgrps
,
1352 struct se_lun_acl
, ml_stat_grps
);
1353 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1354 struct se_dev_entry
*deve
;
1357 spin_lock_irq(&nacl
->device_list_lock
);
1358 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1359 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1360 spin_unlock_irq(&nacl
->device_list_lock
);
1363 /* scsiAuthIntrLastCreation */
1364 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", (u32
)(((u32
)deve
->creation_time
-
1365 INITIAL_JIFFIES
) * 100 / HZ
));
1366 spin_unlock_irq(&nacl
->device_list_lock
);
1369 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(creation_time
);
1371 static ssize_t
target_stat_scsi_auth_intr_show_attr_row_status(
1372 struct se_ml_stat_grps
*lgrps
, char *page
)
1374 struct se_lun_acl
*lacl
= container_of(lgrps
,
1375 struct se_lun_acl
, ml_stat_grps
);
1376 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1377 struct se_dev_entry
*deve
;
1380 spin_lock_irq(&nacl
->device_list_lock
);
1381 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1382 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1383 spin_unlock_irq(&nacl
->device_list_lock
);
1386 /* FIXME: scsiAuthIntrRowStatus */
1387 ret
= snprintf(page
, PAGE_SIZE
, "Ready\n");
1388 spin_unlock_irq(&nacl
->device_list_lock
);
1391 DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(row_status
);
1393 CONFIGFS_EATTR_OPS(target_stat_scsi_auth_intr
, se_ml_stat_grps
,
1394 scsi_auth_intr_group
);
1396 static struct configfs_attribute
*target_stat_scsi_auth_intr_attrs
[] = {
1397 &target_stat_scsi_auth_intr_inst
.attr
,
1398 &target_stat_scsi_auth_intr_dev
.attr
,
1399 &target_stat_scsi_auth_intr_port
.attr
,
1400 &target_stat_scsi_auth_intr_indx
.attr
,
1401 &target_stat_scsi_auth_intr_dev_or_port
.attr
,
1402 &target_stat_scsi_auth_intr_intr_name
.attr
,
1403 &target_stat_scsi_auth_intr_map_indx
.attr
,
1404 &target_stat_scsi_auth_intr_att_count
.attr
,
1405 &target_stat_scsi_auth_intr_num_cmds
.attr
,
1406 &target_stat_scsi_auth_intr_read_mbytes
.attr
,
1407 &target_stat_scsi_auth_intr_write_mbytes
.attr
,
1408 &target_stat_scsi_auth_intr_hs_num_cmds
.attr
,
1409 &target_stat_scsi_auth_intr_creation_time
.attr
,
1410 &target_stat_scsi_auth_intr_row_status
.attr
,
1414 static struct configfs_item_operations target_stat_scsi_auth_intr_attrib_ops
= {
1415 .show_attribute
= target_stat_scsi_auth_intr_attr_show
,
1416 .store_attribute
= target_stat_scsi_auth_intr_attr_store
,
1419 static struct config_item_type target_stat_scsi_auth_intr_cit
= {
1420 .ct_item_ops
= &target_stat_scsi_auth_intr_attrib_ops
,
1421 .ct_attrs
= target_stat_scsi_auth_intr_attrs
,
1422 .ct_owner
= THIS_MODULE
,
1426 * SCSI Attached Initiator Port Table
1429 CONFIGFS_EATTR_STRUCT(target_stat_scsi_att_intr_port
, se_ml_stat_grps
);
1430 #define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR(_name, _mode) \
1431 static struct target_stat_scsi_att_intr_port_attribute \
1432 target_stat_scsi_att_intr_port_##_name = \
1433 __CONFIGFS_EATTR(_name, _mode, \
1434 target_stat_scsi_att_intr_port_show_attr_##_name, \
1435 target_stat_scsi_att_intr_port_store_attr_##_name);
1437 #define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(_name) \
1438 static struct target_stat_scsi_att_intr_port_attribute \
1439 target_stat_scsi_att_intr_port_##_name = \
1440 __CONFIGFS_EATTR_RO(_name, \
1441 target_stat_scsi_att_intr_port_show_attr_##_name);
1443 static ssize_t
target_stat_scsi_att_intr_port_show_attr_inst(
1444 struct se_ml_stat_grps
*lgrps
, char *page
)
1446 struct se_lun_acl
*lacl
= container_of(lgrps
,
1447 struct se_lun_acl
, ml_stat_grps
);
1448 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1449 struct se_dev_entry
*deve
;
1450 struct se_portal_group
*tpg
;
1453 spin_lock_irq(&nacl
->device_list_lock
);
1454 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1455 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1456 spin_unlock_irq(&nacl
->device_list_lock
);
1461 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1462 tpg
->se_tpg_tfo
->tpg_get_inst_index(tpg
));
1463 spin_unlock_irq(&nacl
->device_list_lock
);
1466 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(inst
);
1468 static ssize_t
target_stat_scsi_att_intr_port_show_attr_dev(
1469 struct se_ml_stat_grps
*lgrps
, char *page
)
1471 struct se_lun_acl
*lacl
= container_of(lgrps
,
1472 struct se_lun_acl
, ml_stat_grps
);
1473 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1474 struct se_dev_entry
*deve
;
1478 spin_lock_irq(&nacl
->device_list_lock
);
1479 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1480 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1481 spin_unlock_irq(&nacl
->device_list_lock
);
1485 /* scsiDeviceIndex */
1486 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", lun
->lun_se_dev
->dev_index
);
1487 spin_unlock_irq(&nacl
->device_list_lock
);
1490 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(dev
);
1492 static ssize_t
target_stat_scsi_att_intr_port_show_attr_port(
1493 struct se_ml_stat_grps
*lgrps
, char *page
)
1495 struct se_lun_acl
*lacl
= container_of(lgrps
,
1496 struct se_lun_acl
, ml_stat_grps
);
1497 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1498 struct se_dev_entry
*deve
;
1499 struct se_portal_group
*tpg
;
1502 spin_lock_irq(&nacl
->device_list_lock
);
1503 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1504 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1505 spin_unlock_irq(&nacl
->device_list_lock
);
1510 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", tpg
->se_tpg_tfo
->tpg_get_tag(tpg
));
1511 spin_unlock_irq(&nacl
->device_list_lock
);
1514 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port
);
1516 static ssize_t
target_stat_scsi_att_intr_port_show_attr_indx(
1517 struct se_ml_stat_grps
*lgrps
, char *page
)
1519 struct se_lun_acl
*lacl
= container_of(lgrps
,
1520 struct se_lun_acl
, ml_stat_grps
);
1521 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1522 struct se_session
*se_sess
;
1523 struct se_portal_group
*tpg
;
1526 spin_lock_irq(&nacl
->nacl_sess_lock
);
1527 se_sess
= nacl
->nacl_sess
;
1529 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1534 /* scsiAttIntrPortIndex */
1535 ret
= snprintf(page
, PAGE_SIZE
, "%u\n",
1536 tpg
->se_tpg_tfo
->sess_get_index(se_sess
));
1537 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1540 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(indx
);
1542 static ssize_t
target_stat_scsi_att_intr_port_show_attr_port_auth_indx(
1543 struct se_ml_stat_grps
*lgrps
, char *page
)
1545 struct se_lun_acl
*lacl
= container_of(lgrps
,
1546 struct se_lun_acl
, ml_stat_grps
);
1547 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1548 struct se_dev_entry
*deve
;
1551 spin_lock_irq(&nacl
->device_list_lock
);
1552 deve
= nacl
->device_list
[lacl
->mapped_lun
];
1553 if (!deve
->se_lun
|| !deve
->se_lun_acl
) {
1554 spin_unlock_irq(&nacl
->device_list_lock
);
1557 /* scsiAttIntrPortAuthIntrIdx */
1558 ret
= snprintf(page
, PAGE_SIZE
, "%u\n", nacl
->acl_index
);
1559 spin_unlock_irq(&nacl
->device_list_lock
);
1562 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_auth_indx
);
1564 static ssize_t
target_stat_scsi_att_intr_port_show_attr_port_ident(
1565 struct se_ml_stat_grps
*lgrps
, char *page
)
1567 struct se_lun_acl
*lacl
= container_of(lgrps
,
1568 struct se_lun_acl
, ml_stat_grps
);
1569 struct se_node_acl
*nacl
= lacl
->se_lun_nacl
;
1570 struct se_session
*se_sess
;
1571 struct se_portal_group
*tpg
;
1573 unsigned char buf
[64];
1575 spin_lock_irq(&nacl
->nacl_sess_lock
);
1576 se_sess
= nacl
->nacl_sess
;
1578 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1583 /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1585 if (tpg
->se_tpg_tfo
->sess_get_initiator_sid
!= NULL
)
1586 tpg
->se_tpg_tfo
->sess_get_initiator_sid(se_sess
, buf
, 64);
1588 ret
= snprintf(page
, PAGE_SIZE
, "%s+i+%s\n", nacl
->initiatorname
, buf
);
1589 spin_unlock_irq(&nacl
->nacl_sess_lock
);
1592 DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_ident
);
1594 CONFIGFS_EATTR_OPS(target_stat_scsi_att_intr_port
, se_ml_stat_grps
,
1595 scsi_att_intr_port_group
);
1597 static struct configfs_attribute
*target_stat_scsi_ath_intr_port_attrs
[] = {
1598 &target_stat_scsi_att_intr_port_inst
.attr
,
1599 &target_stat_scsi_att_intr_port_dev
.attr
,
1600 &target_stat_scsi_att_intr_port_port
.attr
,
1601 &target_stat_scsi_att_intr_port_indx
.attr
,
1602 &target_stat_scsi_att_intr_port_port_auth_indx
.attr
,
1603 &target_stat_scsi_att_intr_port_port_ident
.attr
,
1607 static struct configfs_item_operations target_stat_scsi_att_intr_port_attrib_ops
= {
1608 .show_attribute
= target_stat_scsi_att_intr_port_attr_show
,
1609 .store_attribute
= target_stat_scsi_att_intr_port_attr_store
,
1612 static struct config_item_type target_stat_scsi_att_intr_port_cit
= {
1613 .ct_item_ops
= &target_stat_scsi_att_intr_port_attrib_ops
,
1614 .ct_attrs
= target_stat_scsi_ath_intr_port_attrs
,
1615 .ct_owner
= THIS_MODULE
,
1619 * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
1620 * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
1622 void target_stat_setup_mappedlun_default_groups(struct se_lun_acl
*lacl
)
1624 struct config_group
*ml_stat_grp
= &lacl
->ml_stat_grps
.stat_group
;
1626 config_group_init_type_name(&lacl
->ml_stat_grps
.scsi_auth_intr_group
,
1627 "scsi_auth_intr", &target_stat_scsi_auth_intr_cit
);
1628 config_group_init_type_name(&lacl
->ml_stat_grps
.scsi_att_intr_port_group
,
1629 "scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit
);
1631 ml_stat_grp
->default_groups
[0] = &lacl
->ml_stat_grps
.scsi_auth_intr_group
;
1632 ml_stat_grp
->default_groups
[1] = &lacl
->ml_stat_grps
.scsi_att_intr_port_group
;
1633 ml_stat_grp
->default_groups
[2] = NULL
;