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