]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/target/target_core_stat.c
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[mirror_ubuntu-artful-kernel.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
37 #include <target/target_core_base.h>
38 #include <target/target_core_backend.h>
39 #include <target/target_core_fabric.h>
40
41 #include "target_core_internal.h"
42
43 #ifndef INITIAL_JIFFIES
44 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
45 #endif
46
47 #define NONE "None"
48 #define ISPRINT(a) ((a >= ' ') && (a <= '~'))
49
50 #define SCSI_LU_INDEX 1
51 #define LU_COUNT 1
52
53 /*
54 * SCSI Device Table
55 */
56
57 static struct se_device *to_stat_dev(struct config_item *item)
58 {
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);
62 }
63
64 static ssize_t target_stat_inst_show(struct config_item *item, char *page)
65 {
66 struct se_hba *hba = to_stat_dev(item)->se_hba;
67
68 return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
69 }
70
71 static ssize_t target_stat_indx_show(struct config_item *item, char *page)
72 {
73 return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->dev_index);
74 }
75
76 static ssize_t target_stat_role_show(struct config_item *item, char *page)
77 {
78 return snprintf(page, PAGE_SIZE, "Target\n");
79 }
80
81 static ssize_t target_stat_ports_show(struct config_item *item, char *page)
82 {
83 return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->export_count);
84 }
85
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);
90
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,
96 NULL,
97 };
98
99 static struct config_item_type target_stat_scsi_dev_cit = {
100 .ct_attrs = target_stat_scsi_dev_attrs,
101 .ct_owner = THIS_MODULE,
102 };
103
104 /*
105 * SCSI Target Device Table
106 */
107 static struct se_device *to_stat_tgt_dev(struct config_item *item)
108 {
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);
112 }
113
114 static ssize_t target_stat_tgt_inst_show(struct config_item *item, char *page)
115 {
116 struct se_hba *hba = to_stat_tgt_dev(item)->se_hba;
117
118 return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
119 }
120
121 static ssize_t target_stat_tgt_indx_show(struct config_item *item, char *page)
122 {
123 return snprintf(page, PAGE_SIZE, "%u\n", to_stat_tgt_dev(item)->dev_index);
124 }
125
126 static ssize_t target_stat_tgt_num_lus_show(struct config_item *item,
127 char *page)
128 {
129 return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
130 }
131
132 static ssize_t target_stat_tgt_status_show(struct config_item *item,
133 char *page)
134 {
135 if (to_stat_tgt_dev(item)->export_count)
136 return snprintf(page, PAGE_SIZE, "activated");
137 else
138 return snprintf(page, PAGE_SIZE, "deactivated");
139 }
140
141 static ssize_t target_stat_tgt_non_access_lus_show(struct config_item *item,
142 char *page)
143 {
144 int non_accessible_lus;
145
146 if (to_stat_tgt_dev(item)->export_count)
147 non_accessible_lus = 0;
148 else
149 non_accessible_lus = 1;
150
151 return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
152 }
153
154 static ssize_t target_stat_tgt_resets_show(struct config_item *item,
155 char *page)
156 {
157 return snprintf(page, PAGE_SIZE, "%lu\n",
158 atomic_long_read(&to_stat_tgt_dev(item)->num_resets));
159 }
160
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);
167
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,
175 NULL,
176 };
177
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,
181 };
182
183 /*
184 * SCSI Logical Unit Table
185 */
186
187 static struct se_device *to_stat_lu_dev(struct config_item *item)
188 {
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);
192 }
193
194 static ssize_t target_stat_lu_inst_show(struct config_item *item, char *page)
195 {
196 struct se_hba *hba = to_stat_lu_dev(item)->se_hba;
197
198 return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
199 }
200
201 static ssize_t target_stat_lu_dev_show(struct config_item *item, char *page)
202 {
203 return snprintf(page, PAGE_SIZE, "%u\n",
204 to_stat_lu_dev(item)->dev_index);
205 }
206
207 static ssize_t target_stat_lu_indx_show(struct config_item *item, char *page)
208 {
209 return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
210 }
211
212 static ssize_t target_stat_lu_lun_show(struct config_item *item, char *page)
213 {
214 /* FIXME: scsiLuDefaultLun */
215 return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
216 }
217
218 static ssize_t target_stat_lu_lu_name_show(struct config_item *item, char *page)
219 {
220 struct se_device *dev = to_stat_lu_dev(item);
221
222 /* scsiLuWwnName */
223 return snprintf(page, PAGE_SIZE, "%s\n",
224 (strlen(dev->t10_wwn.unit_serial)) ?
225 dev->t10_wwn.unit_serial : "None");
226 }
227
228 static ssize_t target_stat_lu_vend_show(struct config_item *item, char *page)
229 {
230 struct se_device *dev = to_stat_lu_dev(item);
231 int i;
232 char str[sizeof(dev->t10_wwn.vendor)+1];
233
234 /* scsiLuVendorId */
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] : ' ';
238 str[i] = '\0';
239 return snprintf(page, PAGE_SIZE, "%s\n", str);
240 }
241
242 static ssize_t target_stat_lu_prod_show(struct config_item *item, char *page)
243 {
244 struct se_device *dev = to_stat_lu_dev(item);
245 int i;
246 char str[sizeof(dev->t10_wwn.model)+1];
247
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] : ' ';
252 str[i] = '\0';
253 return snprintf(page, PAGE_SIZE, "%s\n", str);
254 }
255
256 static ssize_t target_stat_lu_rev_show(struct config_item *item, char *page)
257 {
258 struct se_device *dev = to_stat_lu_dev(item);
259 int i;
260 char str[sizeof(dev->t10_wwn.revision)+1];
261
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] : ' ';
266 str[i] = '\0';
267 return snprintf(page, PAGE_SIZE, "%s\n", str);
268 }
269
270 static ssize_t target_stat_lu_dev_type_show(struct config_item *item, char *page)
271 {
272 struct se_device *dev = to_stat_lu_dev(item);
273
274 /* scsiLuPeripheralType */
275 return snprintf(page, PAGE_SIZE, "%u\n",
276 dev->transport->get_device_type(dev));
277 }
278
279 static ssize_t target_stat_lu_status_show(struct config_item *item, char *page)
280 {
281 struct se_device *dev = to_stat_lu_dev(item);
282
283 /* scsiLuStatus */
284 return snprintf(page, PAGE_SIZE, "%s\n",
285 (dev->export_count) ? "available" : "notavailable");
286 }
287
288 static ssize_t target_stat_lu_state_bit_show(struct config_item *item,
289 char *page)
290 {
291 /* scsiLuState */
292 return snprintf(page, PAGE_SIZE, "exposed\n");
293 }
294
295 static ssize_t target_stat_lu_num_cmds_show(struct config_item *item,
296 char *page)
297 {
298 struct se_device *dev = to_stat_lu_dev(item);
299
300 /* scsiLuNumCommands */
301 return snprintf(page, PAGE_SIZE, "%lu\n",
302 atomic_long_read(&dev->num_cmds));
303 }
304
305 static ssize_t target_stat_lu_read_mbytes_show(struct config_item *item,
306 char *page)
307 {
308 struct se_device *dev = to_stat_lu_dev(item);
309
310 /* scsiLuReadMegaBytes */
311 return snprintf(page, PAGE_SIZE, "%lu\n",
312 atomic_long_read(&dev->read_bytes) >> 20);
313 }
314
315 static ssize_t target_stat_lu_write_mbytes_show(struct config_item *item,
316 char *page)
317 {
318 struct se_device *dev = to_stat_lu_dev(item);
319
320 /* scsiLuWrittenMegaBytes */
321 return snprintf(page, PAGE_SIZE, "%lu\n",
322 atomic_long_read(&dev->write_bytes) >> 20);
323 }
324
325 static ssize_t target_stat_lu_resets_show(struct config_item *item, char *page)
326 {
327 struct se_device *dev = to_stat_lu_dev(item);
328
329 /* scsiLuInResets */
330 return snprintf(page, PAGE_SIZE, "%lu\n",
331 atomic_long_read(&dev->num_resets));
332 }
333
334 static ssize_t target_stat_lu_full_stat_show(struct config_item *item,
335 char *page)
336 {
337 /* FIXME: scsiLuOutTaskSetFullStatus */
338 return snprintf(page, PAGE_SIZE, "%u\n", 0);
339 }
340
341 static ssize_t target_stat_lu_hs_num_cmds_show(struct config_item *item,
342 char *page)
343 {
344 /* FIXME: scsiLuHSInCommands */
345 return snprintf(page, PAGE_SIZE, "%u\n", 0);
346 }
347
348 static ssize_t target_stat_lu_creation_time_show(struct config_item *item,
349 char *page)
350 {
351 struct se_device *dev = to_stat_lu_dev(item);
352
353 /* scsiLuCreationTime */
354 return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
355 INITIAL_JIFFIES) * 100 / HZ));
356 }
357
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);
376
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,
396 NULL,
397 };
398
399 static struct config_item_type target_stat_scsi_lu_cit = {
400 .ct_attrs = target_stat_scsi_lu_attrs,
401 .ct_owner = THIS_MODULE,
402 };
403
404 /*
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
407 */
408 void target_stat_setup_dev_default_groups(struct se_device *dev)
409 {
410 struct config_group *dev_stat_grp = &dev->dev_stat_grps.stat_group;
411
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);
418
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;
423 }
424
425 /*
426 * SCSI Port Table
427 */
428
429 static struct se_lun *to_stat_port(struct config_item *item)
430 {
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);
434 }
435
436 static ssize_t target_stat_port_inst_show(struct config_item *item, char *page)
437 {
438 struct se_lun *lun = to_stat_port(item);
439 struct se_device *dev;
440 ssize_t ret = -ENODEV;
441
442 rcu_read_lock();
443 dev = rcu_dereference(lun->lun_se_dev);
444 if (dev)
445 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
446 rcu_read_unlock();
447 return ret;
448 }
449
450 static ssize_t target_stat_port_dev_show(struct config_item *item, char *page)
451 {
452 struct se_lun *lun = to_stat_port(item);
453 struct se_device *dev;
454 ssize_t ret = -ENODEV;
455
456 rcu_read_lock();
457 dev = rcu_dereference(lun->lun_se_dev);
458 if (dev)
459 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
460 rcu_read_unlock();
461 return ret;
462 }
463
464 static ssize_t target_stat_port_indx_show(struct config_item *item, char *page)
465 {
466 struct se_lun *lun = to_stat_port(item);
467 struct se_device *dev;
468 ssize_t ret = -ENODEV;
469
470 rcu_read_lock();
471 dev = rcu_dereference(lun->lun_se_dev);
472 if (dev)
473 ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
474 rcu_read_unlock();
475 return ret;
476 }
477
478 static ssize_t target_stat_port_role_show(struct config_item *item, char *page)
479 {
480 struct se_lun *lun = to_stat_port(item);
481 struct se_device *dev;
482 ssize_t ret = -ENODEV;
483
484 rcu_read_lock();
485 dev = rcu_dereference(lun->lun_se_dev);
486 if (dev)
487 ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
488 rcu_read_unlock();
489 return ret;
490 }
491
492 static ssize_t target_stat_port_busy_count_show(struct config_item *item,
493 char *page)
494 {
495 struct se_lun *lun = to_stat_port(item);
496 struct se_device *dev;
497 ssize_t ret = -ENODEV;
498
499 rcu_read_lock();
500 dev = rcu_dereference(lun->lun_se_dev);
501 if (dev) {
502 /* FIXME: scsiPortBusyStatuses */
503 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
504 }
505 rcu_read_unlock();
506 return ret;
507 }
508
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);
514
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,
521 NULL,
522 };
523
524 static struct config_item_type target_stat_scsi_port_cit = {
525 .ct_attrs = target_stat_scsi_port_attrs,
526 .ct_owner = THIS_MODULE,
527 };
528
529 /*
530 * SCSI Target Port Table
531 */
532 static struct se_lun *to_stat_tgt_port(struct config_item *item)
533 {
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);
537 }
538
539 static ssize_t target_stat_tgt_port_inst_show(struct config_item *item,
540 char *page)
541 {
542 struct se_lun *lun = to_stat_tgt_port(item);
543 struct se_device *dev;
544 ssize_t ret = -ENODEV;
545
546 rcu_read_lock();
547 dev = rcu_dereference(lun->lun_se_dev);
548 if (dev)
549 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
550 rcu_read_unlock();
551 return ret;
552 }
553
554 static ssize_t target_stat_tgt_port_dev_show(struct config_item *item,
555 char *page)
556 {
557 struct se_lun *lun = to_stat_tgt_port(item);
558 struct se_device *dev;
559 ssize_t ret = -ENODEV;
560
561 rcu_read_lock();
562 dev = rcu_dereference(lun->lun_se_dev);
563 if (dev)
564 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
565 rcu_read_unlock();
566 return ret;
567 }
568
569 static ssize_t target_stat_tgt_port_indx_show(struct config_item *item,
570 char *page)
571 {
572 struct se_lun *lun = to_stat_tgt_port(item);
573 struct se_device *dev;
574 ssize_t ret = -ENODEV;
575
576 rcu_read_lock();
577 dev = rcu_dereference(lun->lun_se_dev);
578 if (dev)
579 ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
580 rcu_read_unlock();
581 return ret;
582 }
583
584 static ssize_t target_stat_tgt_port_name_show(struct config_item *item,
585 char *page)
586 {
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;
591
592 rcu_read_lock();
593 dev = rcu_dereference(lun->lun_se_dev);
594 if (dev)
595 ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
596 tpg->se_tpg_tfo->get_fabric_name(),
597 lun->lun_rtpi);
598 rcu_read_unlock();
599 return ret;
600 }
601
602 static ssize_t target_stat_tgt_port_port_index_show(struct config_item *item,
603 char *page)
604 {
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;
609
610 rcu_read_lock();
611 dev = rcu_dereference(lun->lun_se_dev);
612 if (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));
616 rcu_read_unlock();
617 return ret;
618 }
619
620 static ssize_t target_stat_tgt_port_in_cmds_show(struct config_item *item,
621 char *page)
622 {
623 struct se_lun *lun = to_stat_tgt_port(item);
624 struct se_device *dev;
625 ssize_t ret = -ENODEV;
626
627 rcu_read_lock();
628 dev = rcu_dereference(lun->lun_se_dev);
629 if (dev)
630 ret = snprintf(page, PAGE_SIZE, "%lu\n",
631 atomic_long_read(&lun->lun_stats.cmd_pdus));
632 rcu_read_unlock();
633 return ret;
634 }
635
636 static ssize_t target_stat_tgt_port_write_mbytes_show(struct config_item *item,
637 char *page)
638 {
639 struct se_lun *lun = to_stat_tgt_port(item);
640 struct se_device *dev;
641 ssize_t ret = -ENODEV;
642
643 rcu_read_lock();
644 dev = rcu_dereference(lun->lun_se_dev);
645 if (dev)
646 ret = snprintf(page, PAGE_SIZE, "%u\n",
647 (u32)(atomic_long_read(&lun->lun_stats.rx_data_octets) >> 20));
648 rcu_read_unlock();
649 return ret;
650 }
651
652 static ssize_t target_stat_tgt_port_read_mbytes_show(struct config_item *item,
653 char *page)
654 {
655 struct se_lun *lun = to_stat_tgt_port(item);
656 struct se_device *dev;
657 ssize_t ret = -ENODEV;
658
659 rcu_read_lock();
660 dev = rcu_dereference(lun->lun_se_dev);
661 if (dev)
662 ret = snprintf(page, PAGE_SIZE, "%u\n",
663 (u32)(atomic_long_read(&lun->lun_stats.tx_data_octets) >> 20));
664 rcu_read_unlock();
665 return ret;
666 }
667
668 static ssize_t target_stat_tgt_port_hs_in_cmds_show(struct config_item *item,
669 char *page)
670 {
671 struct se_lun *lun = to_stat_tgt_port(item);
672 struct se_device *dev;
673 ssize_t ret = -ENODEV;
674
675 rcu_read_lock();
676 dev = rcu_dereference(lun->lun_se_dev);
677 if (dev) {
678 /* FIXME: scsiTgtPortHsInCommands */
679 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
680 }
681 rcu_read_unlock();
682 return ret;
683 }
684
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);
694
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,
705 NULL,
706 };
707
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,
711 };
712
713 /*
714 * SCSI Transport Table
715 */
716 static struct se_lun *to_transport_stat(struct config_item *item)
717 {
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);
721 }
722
723 static ssize_t target_stat_transport_inst_show(struct config_item *item,
724 char *page)
725 {
726 struct se_lun *lun = to_transport_stat(item);
727 struct se_device *dev;
728 ssize_t ret = -ENODEV;
729
730 rcu_read_lock();
731 dev = rcu_dereference(lun->lun_se_dev);
732 if (dev)
733 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
734 rcu_read_unlock();
735 return ret;
736 }
737
738 static ssize_t target_stat_transport_device_show(struct config_item *item,
739 char *page)
740 {
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;
745
746 rcu_read_lock();
747 dev = rcu_dereference(lun->lun_se_dev);
748 if (dev) {
749 /* scsiTransportType */
750 ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
751 tpg->se_tpg_tfo->get_fabric_name());
752 }
753 rcu_read_unlock();
754 return ret;
755 }
756
757 static ssize_t target_stat_transport_indx_show(struct config_item *item,
758 char *page)
759 {
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;
764
765 rcu_read_lock();
766 dev = rcu_dereference(lun->lun_se_dev);
767 if (dev)
768 ret = snprintf(page, PAGE_SIZE, "%u\n",
769 tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
770 rcu_read_unlock();
771 return ret;
772 }
773
774 static ssize_t target_stat_transport_dev_name_show(struct config_item *item,
775 char *page)
776 {
777 struct se_lun *lun = to_transport_stat(item);
778 struct se_device *dev;
779 struct se_portal_group *tpg = lun->lun_tpg;
780 struct t10_wwn *wwn;
781 ssize_t ret = -ENODEV;
782
783 rcu_read_lock();
784 dev = rcu_dereference(lun->lun_se_dev);
785 if (dev) {
786 wwn = &dev->t10_wwn;
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 :
791 wwn->vendor);
792 }
793 rcu_read_unlock();
794 return ret;
795 }
796
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);
801
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,
807 NULL,
808 };
809
810 static struct config_item_type target_stat_scsi_transport_cit = {
811 .ct_attrs = target_stat_scsi_transport_attrs,
812 .ct_owner = THIS_MODULE,
813 };
814
815 /*
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
818 */
819 void target_stat_setup_port_default_groups(struct se_lun *lun)
820 {
821 struct config_group *port_stat_grp = &lun->port_stat_grps.stat_group;
822
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);
829
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;
834 }
835
836 /*
837 * SCSI Authorized Initiator Table
838 */
839
840 static struct se_lun_acl *auth_to_lacl(struct config_item *item)
841 {
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);
845 }
846
847 static ssize_t target_stat_auth_inst_show(struct config_item *item,
848 char *page)
849 {
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;
854 ssize_t ret;
855
856 rcu_read_lock();
857 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
858 if (!deve) {
859 rcu_read_unlock();
860 return -ENODEV;
861 }
862 tpg = nacl->se_tpg;
863 /* scsiInstIndex */
864 ret = snprintf(page, PAGE_SIZE, "%u\n",
865 tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
866 rcu_read_unlock();
867 return ret;
868 }
869
870 static ssize_t target_stat_auth_dev_show(struct config_item *item,
871 char *page)
872 {
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;
876 struct se_lun *lun;
877 ssize_t ret;
878
879 rcu_read_lock();
880 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
881 if (!deve) {
882 rcu_read_unlock();
883 return -ENODEV;
884 }
885 lun = rcu_dereference(deve->se_lun);
886 /* scsiDeviceIndex */
887 ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
888 rcu_read_unlock();
889 return ret;
890 }
891
892 static ssize_t target_stat_auth_port_show(struct config_item *item,
893 char *page)
894 {
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;
899 ssize_t ret;
900
901 rcu_read_lock();
902 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
903 if (!deve) {
904 rcu_read_unlock();
905 return -ENODEV;
906 }
907 tpg = nacl->se_tpg;
908 /* scsiAuthIntrTgtPortIndex */
909 ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
910 rcu_read_unlock();
911 return ret;
912 }
913
914 static ssize_t target_stat_auth_indx_show(struct config_item *item,
915 char *page)
916 {
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;
920 ssize_t ret;
921
922 rcu_read_lock();
923 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
924 if (!deve) {
925 rcu_read_unlock();
926 return -ENODEV;
927 }
928 /* scsiAuthIntrIndex */
929 ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
930 rcu_read_unlock();
931 return ret;
932 }
933
934 static ssize_t target_stat_auth_dev_or_port_show(struct config_item *item,
935 char *page)
936 {
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;
940 ssize_t ret;
941
942 rcu_read_lock();
943 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
944 if (!deve) {
945 rcu_read_unlock();
946 return -ENODEV;
947 }
948 /* scsiAuthIntrDevOrPort */
949 ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
950 rcu_read_unlock();
951 return ret;
952 }
953
954 static ssize_t target_stat_auth_intr_name_show(struct config_item *item,
955 char *page)
956 {
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;
960 ssize_t ret;
961
962 rcu_read_lock();
963 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
964 if (!deve) {
965 rcu_read_unlock();
966 return -ENODEV;
967 }
968 /* scsiAuthIntrName */
969 ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
970 rcu_read_unlock();
971 return ret;
972 }
973
974 static ssize_t target_stat_auth_map_indx_show(struct config_item *item,
975 char *page)
976 {
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;
980 ssize_t ret;
981
982 rcu_read_lock();
983 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
984 if (!deve) {
985 rcu_read_unlock();
986 return -ENODEV;
987 }
988 /* FIXME: scsiAuthIntrLunMapIndex */
989 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
990 rcu_read_unlock();
991 return ret;
992 }
993
994 static ssize_t target_stat_auth_att_count_show(struct config_item *item,
995 char *page)
996 {
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;
1000 ssize_t ret;
1001
1002 rcu_read_lock();
1003 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1004 if (!deve) {
1005 rcu_read_unlock();
1006 return -ENODEV;
1007 }
1008 /* scsiAuthIntrAttachedTimes */
1009 ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
1010 rcu_read_unlock();
1011 return ret;
1012 }
1013
1014 static ssize_t target_stat_auth_num_cmds_show(struct config_item *item,
1015 char *page)
1016 {
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;
1020 ssize_t ret;
1021
1022 rcu_read_lock();
1023 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1024 if (!deve) {
1025 rcu_read_unlock();
1026 return -ENODEV;
1027 }
1028 /* scsiAuthIntrOutCommands */
1029 ret = snprintf(page, PAGE_SIZE, "%lu\n",
1030 atomic_long_read(&deve->total_cmds));
1031 rcu_read_unlock();
1032 return ret;
1033 }
1034
1035 static ssize_t target_stat_auth_read_mbytes_show(struct config_item *item,
1036 char *page)
1037 {
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;
1041 ssize_t ret;
1042
1043 rcu_read_lock();
1044 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1045 if (!deve) {
1046 rcu_read_unlock();
1047 return -ENODEV;
1048 }
1049 /* scsiAuthIntrReadMegaBytes */
1050 ret = snprintf(page, PAGE_SIZE, "%u\n",
1051 (u32)(atomic_long_read(&deve->read_bytes) >> 20));
1052 rcu_read_unlock();
1053 return ret;
1054 }
1055
1056 static ssize_t target_stat_auth_write_mbytes_show(struct config_item *item,
1057 char *page)
1058 {
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;
1062 ssize_t ret;
1063
1064 rcu_read_lock();
1065 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1066 if (!deve) {
1067 rcu_read_unlock();
1068 return -ENODEV;
1069 }
1070 /* scsiAuthIntrWrittenMegaBytes */
1071 ret = snprintf(page, PAGE_SIZE, "%u\n",
1072 (u32)(atomic_long_read(&deve->write_bytes) >> 20));
1073 rcu_read_unlock();
1074 return ret;
1075 }
1076
1077 static ssize_t target_stat_auth_hs_num_cmds_show(struct config_item *item,
1078 char *page)
1079 {
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;
1083 ssize_t ret;
1084
1085 rcu_read_lock();
1086 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1087 if (!deve) {
1088 rcu_read_unlock();
1089 return -ENODEV;
1090 }
1091 /* FIXME: scsiAuthIntrHSOutCommands */
1092 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1093 rcu_read_unlock();
1094 return ret;
1095 }
1096
1097 static ssize_t target_stat_auth_creation_time_show(struct config_item *item,
1098 char *page)
1099 {
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;
1103 ssize_t ret;
1104
1105 rcu_read_lock();
1106 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1107 if (!deve) {
1108 rcu_read_unlock();
1109 return -ENODEV;
1110 }
1111 /* scsiAuthIntrLastCreation */
1112 ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
1113 INITIAL_JIFFIES) * 100 / HZ));
1114 rcu_read_unlock();
1115 return ret;
1116 }
1117
1118 static ssize_t target_stat_auth_row_status_show(struct config_item *item,
1119 char *page)
1120 {
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;
1124 ssize_t ret;
1125
1126 rcu_read_lock();
1127 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1128 if (!deve) {
1129 rcu_read_unlock();
1130 return -ENODEV;
1131 }
1132 /* FIXME: scsiAuthIntrRowStatus */
1133 ret = snprintf(page, PAGE_SIZE, "Ready\n");
1134 rcu_read_unlock();
1135 return ret;
1136 }
1137
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);
1152
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,
1168 NULL,
1169 };
1170
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,
1174 };
1175
1176 /*
1177 * SCSI Attached Initiator Port Table
1178 */
1179
1180 static struct se_lun_acl *iport_to_lacl(struct config_item *item)
1181 {
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);
1185 }
1186
1187 static ssize_t target_stat_iport_inst_show(struct config_item *item,
1188 char *page)
1189 {
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;
1194 ssize_t ret;
1195
1196 rcu_read_lock();
1197 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1198 if (!deve) {
1199 rcu_read_unlock();
1200 return -ENODEV;
1201 }
1202 tpg = nacl->se_tpg;
1203 /* scsiInstIndex */
1204 ret = snprintf(page, PAGE_SIZE, "%u\n",
1205 tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
1206 rcu_read_unlock();
1207 return ret;
1208 }
1209
1210 static ssize_t target_stat_iport_dev_show(struct config_item *item,
1211 char *page)
1212 {
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;
1216 struct se_lun *lun;
1217 ssize_t ret;
1218
1219 rcu_read_lock();
1220 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1221 if (!deve) {
1222 rcu_read_unlock();
1223 return -ENODEV;
1224 }
1225 lun = rcu_dereference(deve->se_lun);
1226 /* scsiDeviceIndex */
1227 ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
1228 rcu_read_unlock();
1229 return ret;
1230 }
1231
1232 static ssize_t target_stat_iport_port_show(struct config_item *item,
1233 char *page)
1234 {
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;
1239 ssize_t ret;
1240
1241 rcu_read_lock();
1242 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1243 if (!deve) {
1244 rcu_read_unlock();
1245 return -ENODEV;
1246 }
1247 tpg = nacl->se_tpg;
1248 /* scsiPortIndex */
1249 ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
1250 rcu_read_unlock();
1251 return ret;
1252 }
1253
1254 static ssize_t target_stat_iport_indx_show(struct config_item *item,
1255 char *page)
1256 {
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;
1261 ssize_t ret;
1262
1263 spin_lock_irq(&nacl->nacl_sess_lock);
1264 se_sess = nacl->nacl_sess;
1265 if (!se_sess) {
1266 spin_unlock_irq(&nacl->nacl_sess_lock);
1267 return -ENODEV;
1268 }
1269
1270 tpg = nacl->se_tpg;
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);
1275 return ret;
1276 }
1277
1278 static ssize_t target_stat_iport_port_auth_indx_show(struct config_item *item,
1279 char *page)
1280 {
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;
1284 ssize_t ret;
1285
1286 rcu_read_lock();
1287 deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1288 if (!deve) {
1289 rcu_read_unlock();
1290 return -ENODEV;
1291 }
1292 /* scsiAttIntrPortAuthIntrIdx */
1293 ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1294 rcu_read_unlock();
1295 return ret;
1296 }
1297
1298 static ssize_t target_stat_iport_port_ident_show(struct config_item *item,
1299 char *page)
1300 {
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;
1305 ssize_t ret;
1306 unsigned char buf[64];
1307
1308 spin_lock_irq(&nacl->nacl_sess_lock);
1309 se_sess = nacl->nacl_sess;
1310 if (!se_sess) {
1311 spin_unlock_irq(&nacl->nacl_sess_lock);
1312 return -ENODEV;
1313 }
1314
1315 tpg = nacl->se_tpg;
1316 /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1317 memset(buf, 0, 64);
1318 if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
1319 tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
1320
1321 ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
1322 spin_unlock_irq(&nacl->nacl_sess_lock);
1323 return ret;
1324 }
1325
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);
1332
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,
1340 NULL,
1341 };
1342
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,
1346 };
1347
1348 /*
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
1351 */
1352 void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
1353 {
1354 struct config_group *ml_stat_grp = &lacl->ml_stat_grps.stat_group;
1355
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);
1360
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;
1364 }