Linux Audio

Check our new training course

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