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 } 1633