linux/drivers/target/target_core_stat.c
<<
>>
Prefs
   1/*******************************************************************************
   2 * Filename:  target_core_stat.c
   3 *
   4 * Modern ConfigFS group context specific statistics based on original
   5 * target_core_mib.c code
   6 *
   7 * (c) Copyright 2006-2013 Datera, Inc.
   8 *
   9 * Nicholas A. Bellinger <nab@linux-iscsi.org>
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2 of the License, or
  14 * (at your option) any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24 *
  25 ******************************************************************************/
  26
  27#include <linux/kernel.h>
  28#include <linux/module.h>
  29#include <linux/delay.h>
  30#include <linux/timer.h>
  31#include <linux/string.h>
  32#include <linux/utsname.h>
  33#include <linux/proc_fs.h>
  34#include <linux/seq_file.h>
  35#include <linux/configfs.h>
  36
  37#include <target/target_core_base.h>
  38#include <target/target_core_backend.h>
  39#include <target/target_core_fabric.h>
  40
  41#include "target_core_internal.h"
  42
  43#ifndef INITIAL_JIFFIES
  44#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
  45#endif
  46
  47#define NONE            "None"
  48#define ISPRINT(a)   ((a >= ' ') && (a <= '~'))
  49
  50#define SCSI_LU_INDEX                   1
  51#define LU_COUNT                        1
  52
  53/*
  54 * SCSI Device Table
  55 */
  56
  57static struct se_device *to_stat_dev(struct config_item *item)
  58{
  59        struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
  60                        struct se_dev_stat_grps, scsi_dev_group);
  61        return container_of(sgrps, struct se_device, dev_stat_grps);
  62}
  63
  64static ssize_t target_stat_inst_show(struct config_item *item, char *page)
  65{
  66        struct se_hba *hba = to_stat_dev(item)->se_hba;
  67
  68        return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  69}
  70
  71static ssize_t target_stat_indx_show(struct config_item *item, char *page)
  72{
  73        return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->dev_index);
  74}
  75
  76static ssize_t target_stat_role_show(struct config_item *item, char *page)
  77{
  78        return snprintf(page, PAGE_SIZE, "Target\n");
  79}
  80
  81static ssize_t target_stat_ports_show(struct config_item *item, char *page)
  82{
  83        return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->export_count);
  84}
  85
  86CONFIGFS_ATTR_RO(target_stat_, inst);
  87CONFIGFS_ATTR_RO(target_stat_, indx);
  88CONFIGFS_ATTR_RO(target_stat_, role);
  89CONFIGFS_ATTR_RO(target_stat_, ports);
  90
  91static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
  92        &target_stat_attr_inst,
  93        &target_stat_attr_indx,
  94        &target_stat_attr_role,
  95        &target_stat_attr_ports,
  96        NULL,
  97};
  98
  99static const struct config_item_type target_stat_scsi_dev_cit = {
 100        .ct_attrs               = target_stat_scsi_dev_attrs,
 101        .ct_owner               = THIS_MODULE,
 102};
 103
 104/*
 105 * SCSI Target Device Table
 106 */
 107static struct se_device *to_stat_tgt_dev(struct config_item *item)
 108{
 109        struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
 110                        struct se_dev_stat_grps, scsi_tgt_dev_group);
 111        return container_of(sgrps, struct se_device, dev_stat_grps);
 112}
 113
 114static ssize_t target_stat_tgt_inst_show(struct config_item *item, char *page)
 115{
 116        struct se_hba *hba = to_stat_tgt_dev(item)->se_hba;
 117
 118        return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
 119}
 120
 121static ssize_t target_stat_tgt_indx_show(struct config_item *item, char *page)
 122{
 123        return snprintf(page, PAGE_SIZE, "%u\n", to_stat_tgt_dev(item)->dev_index);
 124}
 125
 126static ssize_t target_stat_tgt_num_lus_show(struct config_item *item,
 127                char *page)
 128{
 129        return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
 130}
 131
 132static ssize_t target_stat_tgt_status_show(struct config_item *item,
 133                char *page)
 134{
 135        if (to_stat_tgt_dev(item)->export_count)
 136                return snprintf(page, PAGE_SIZE, "activated");
 137        else
 138                return snprintf(page, PAGE_SIZE, "deactivated");
 139}
 140
 141static ssize_t target_stat_tgt_non_access_lus_show(struct config_item *item,
 142                char *page)
 143{
 144        int non_accessible_lus;
 145
 146        if (to_stat_tgt_dev(item)->export_count)
 147                non_accessible_lus = 0;
 148        else
 149                non_accessible_lus = 1;
 150
 151        return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
 152}
 153
 154static ssize_t target_stat_tgt_resets_show(struct config_item *item,
 155                char *page)
 156{
 157        return snprintf(page, PAGE_SIZE, "%lu\n",
 158                        atomic_long_read(&to_stat_tgt_dev(item)->num_resets));
 159}
 160
 161static ssize_t target_stat_tgt_aborts_complete_show(struct config_item *item,
 162                char *page)
 163{
 164        return snprintf(page, PAGE_SIZE, "%lu\n",
 165                        atomic_long_read(&to_stat_tgt_dev(item)->aborts_complete));
 166}
 167
 168static ssize_t target_stat_tgt_aborts_no_task_show(struct config_item *item,
 169                char *page)
 170{
 171        return snprintf(page, PAGE_SIZE, "%lu\n",
 172                        atomic_long_read(&to_stat_tgt_dev(item)->aborts_no_task));
 173}
 174
 175CONFIGFS_ATTR_RO(target_stat_tgt_, inst);
 176CONFIGFS_ATTR_RO(target_stat_tgt_, indx);
 177CONFIGFS_ATTR_RO(target_stat_tgt_, num_lus);
 178CONFIGFS_ATTR_RO(target_stat_tgt_, status);
 179CONFIGFS_ATTR_RO(target_stat_tgt_, non_access_lus);
 180CONFIGFS_ATTR_RO(target_stat_tgt_, resets);
 181CONFIGFS_ATTR_RO(target_stat_tgt_, aborts_complete);
 182CONFIGFS_ATTR_RO(target_stat_tgt_, aborts_no_task);
 183
 184static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
 185        &target_stat_tgt_attr_inst,
 186        &target_stat_tgt_attr_indx,
 187        &target_stat_tgt_attr_num_lus,
 188        &target_stat_tgt_attr_status,
 189        &target_stat_tgt_attr_non_access_lus,
 190        &target_stat_tgt_attr_resets,
 191        &target_stat_tgt_attr_aborts_complete,
 192        &target_stat_tgt_attr_aborts_no_task,
 193        NULL,
 194};
 195
 196static const struct config_item_type target_stat_scsi_tgt_dev_cit = {
 197        .ct_attrs               = target_stat_scsi_tgt_dev_attrs,
 198        .ct_owner               = THIS_MODULE,
 199};
 200
 201/*
 202 * SCSI Logical Unit Table
 203 */
 204
 205static struct se_device *to_stat_lu_dev(struct config_item *item)
 206{
 207        struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
 208                        struct se_dev_stat_grps, scsi_lu_group);
 209        return container_of(sgrps, struct se_device, dev_stat_grps);
 210}
 211
 212static ssize_t target_stat_lu_inst_show(struct config_item *item, char *page)
 213{
 214        struct se_hba *hba = to_stat_lu_dev(item)->se_hba;
 215
 216        return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
 217}
 218
 219static ssize_t target_stat_lu_dev_show(struct config_item *item, char *page)
 220{
 221        return snprintf(page, PAGE_SIZE, "%u\n",
 222                        to_stat_lu_dev(item)->dev_index);
 223}
 224
 225static ssize_t target_stat_lu_indx_show(struct config_item *item, char *page)
 226{
 227        return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
 228}
 229
 230static ssize_t target_stat_lu_lun_show(struct config_item *item, char *page)
 231{
 232        /* FIXME: scsiLuDefaultLun */
 233        return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
 234}
 235
 236static ssize_t target_stat_lu_lu_name_show(struct config_item *item, char *page)
 237{
 238        struct se_device *dev = to_stat_lu_dev(item);
 239
 240        /* scsiLuWwnName */
 241        return snprintf(page, PAGE_SIZE, "%s\n",
 242                        (strlen(dev->t10_wwn.unit_serial)) ?
 243                        dev->t10_wwn.unit_serial : "None");
 244}
 245
 246static ssize_t target_stat_lu_vend_show(struct config_item *item, char *page)
 247{
 248        struct se_device *dev = to_stat_lu_dev(item);
 249        int i;
 250        char str[sizeof(dev->t10_wwn.vendor)+1];
 251
 252        /* scsiLuVendorId */
 253        for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
 254                str[i] = ISPRINT(dev->t10_wwn.vendor[i]) ?
 255                        dev->t10_wwn.vendor[i] : ' ';
 256        str[i] = '\0';
 257        return snprintf(page, PAGE_SIZE, "%s\n", str);
 258}
 259
 260static ssize_t target_stat_lu_prod_show(struct config_item *item, char *page)
 261{
 262        struct se_device *dev = to_stat_lu_dev(item);
 263        int i;
 264        char str[sizeof(dev->t10_wwn.model)+1];
 265
 266        /* scsiLuProductId */
 267        for (i = 0; i < sizeof(dev->t10_wwn.model); i++)
 268                str[i] = ISPRINT(dev->t10_wwn.model[i]) ?
 269                        dev->t10_wwn.model[i] : ' ';
 270        str[i] = '\0';
 271        return snprintf(page, PAGE_SIZE, "%s\n", str);
 272}
 273
 274static ssize_t target_stat_lu_rev_show(struct config_item *item, char *page)
 275{
 276        struct se_device *dev = to_stat_lu_dev(item);
 277        int i;
 278        char str[sizeof(dev->t10_wwn.revision)+1];
 279
 280        /* scsiLuRevisionId */
 281        for (i = 0; i < sizeof(dev->t10_wwn.revision); i++)
 282                str[i] = ISPRINT(dev->t10_wwn.revision[i]) ?
 283                        dev->t10_wwn.revision[i] : ' ';
 284        str[i] = '\0';
 285        return snprintf(page, PAGE_SIZE, "%s\n", str);
 286}
 287
 288static ssize_t target_stat_lu_dev_type_show(struct config_item *item, char *page)
 289{
 290        struct se_device *dev = to_stat_lu_dev(item);
 291
 292        /* scsiLuPeripheralType */
 293        return snprintf(page, PAGE_SIZE, "%u\n",
 294                        dev->transport->get_device_type(dev));
 295}
 296
 297static ssize_t target_stat_lu_status_show(struct config_item *item, char *page)
 298{
 299        struct se_device *dev = to_stat_lu_dev(item);
 300
 301        /* scsiLuStatus */
 302        return snprintf(page, PAGE_SIZE, "%s\n",
 303                (dev->export_count) ? "available" : "notavailable");
 304}
 305
 306static ssize_t target_stat_lu_state_bit_show(struct config_item *item,
 307                char *page)
 308{
 309        /* scsiLuState */
 310        return snprintf(page, PAGE_SIZE, "exposed\n");
 311}
 312
 313static ssize_t target_stat_lu_num_cmds_show(struct config_item *item,
 314                char *page)
 315{
 316        struct se_device *dev = to_stat_lu_dev(item);
 317
 318        /* scsiLuNumCommands */
 319        return snprintf(page, PAGE_SIZE, "%lu\n",
 320                        atomic_long_read(&dev->num_cmds));
 321}
 322
 323static ssize_t target_stat_lu_read_mbytes_show(struct config_item *item,
 324                char *page)
 325{
 326        struct se_device *dev = to_stat_lu_dev(item);
 327
 328        /* scsiLuReadMegaBytes */
 329        return snprintf(page, PAGE_SIZE, "%lu\n",
 330                        atomic_long_read(&dev->read_bytes) >> 20);
 331}
 332
 333static ssize_t target_stat_lu_write_mbytes_show(struct config_item *item,
 334                char *page)
 335{
 336        struct se_device *dev = to_stat_lu_dev(item);
 337
 338        /* scsiLuWrittenMegaBytes */
 339        return snprintf(page, PAGE_SIZE, "%lu\n",
 340                        atomic_long_read(&dev->write_bytes) >> 20);
 341}
 342
 343static ssize_t target_stat_lu_resets_show(struct config_item *item, char *page)
 344{
 345        struct se_device *dev = to_stat_lu_dev(item);
 346
 347        /* scsiLuInResets */
 348        return snprintf(page, PAGE_SIZE, "%lu\n",
 349                atomic_long_read(&dev->num_resets));
 350}
 351
 352static ssize_t target_stat_lu_full_stat_show(struct config_item *item,
 353                char *page)
 354{
 355        /* FIXME: scsiLuOutTaskSetFullStatus */
 356        return snprintf(page, PAGE_SIZE, "%u\n", 0);
 357}
 358
 359static ssize_t target_stat_lu_hs_num_cmds_show(struct config_item *item,
 360                char *page)
 361{
 362        /* FIXME: scsiLuHSInCommands */
 363        return snprintf(page, PAGE_SIZE, "%u\n", 0);
 364}
 365
 366static ssize_t target_stat_lu_creation_time_show(struct config_item *item,
 367                char *page)
 368{
 369        struct se_device *dev = to_stat_lu_dev(item);
 370
 371        /* scsiLuCreationTime */
 372        return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
 373                                INITIAL_JIFFIES) * 100 / HZ));
 374}
 375
 376CONFIGFS_ATTR_RO(target_stat_lu_, inst);
 377CONFIGFS_ATTR_RO(target_stat_lu_, dev);
 378CONFIGFS_ATTR_RO(target_stat_lu_, indx);
 379CONFIGFS_ATTR_RO(target_stat_lu_, lun);
 380CONFIGFS_ATTR_RO(target_stat_lu_, lu_name);
 381CONFIGFS_ATTR_RO(target_stat_lu_, vend);
 382CONFIGFS_ATTR_RO(target_stat_lu_, prod);
 383CONFIGFS_ATTR_RO(target_stat_lu_, rev);
 384CONFIGFS_ATTR_RO(target_stat_lu_, dev_type);
 385CONFIGFS_ATTR_RO(target_stat_lu_, status);
 386CONFIGFS_ATTR_RO(target_stat_lu_, state_bit);
 387CONFIGFS_ATTR_RO(target_stat_lu_, num_cmds);
 388CONFIGFS_ATTR_RO(target_stat_lu_, read_mbytes);
 389CONFIGFS_ATTR_RO(target_stat_lu_, write_mbytes);
 390CONFIGFS_ATTR_RO(target_stat_lu_, resets);
 391CONFIGFS_ATTR_RO(target_stat_lu_, full_stat);
 392CONFIGFS_ATTR_RO(target_stat_lu_, hs_num_cmds);
 393CONFIGFS_ATTR_RO(target_stat_lu_, creation_time);
 394
 395static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
 396        &target_stat_lu_attr_inst,
 397        &target_stat_lu_attr_dev,
 398        &target_stat_lu_attr_indx,
 399        &target_stat_lu_attr_lun,
 400        &target_stat_lu_attr_lu_name,
 401        &target_stat_lu_attr_vend,
 402        &target_stat_lu_attr_prod,
 403        &target_stat_lu_attr_rev,
 404        &target_stat_lu_attr_dev_type,
 405        &target_stat_lu_attr_status,
 406        &target_stat_lu_attr_state_bit,
 407        &target_stat_lu_attr_num_cmds,
 408        &target_stat_lu_attr_read_mbytes,
 409        &target_stat_lu_attr_write_mbytes,
 410        &target_stat_lu_attr_resets,
 411        &target_stat_lu_attr_full_stat,
 412        &target_stat_lu_attr_hs_num_cmds,
 413        &target_stat_lu_attr_creation_time,
 414        NULL,
 415};
 416
 417static const struct config_item_type target_stat_scsi_lu_cit = {
 418        .ct_attrs               = target_stat_scsi_lu_attrs,
 419        .ct_owner               = THIS_MODULE,
 420};
 421
 422/*
 423 * Called from target_core_configfs.c:target_core_make_subdev() to setup
 424 * the target statistics groups + configfs CITs located in target_core_stat.c
 425 */
 426void target_stat_setup_dev_default_groups(struct se_device *dev)
 427{
 428        config_group_init_type_name(&dev->dev_stat_grps.scsi_dev_group,
 429                        "scsi_dev", &target_stat_scsi_dev_cit);
 430        configfs_add_default_group(&dev->dev_stat_grps.scsi_dev_group,
 431                        &dev->dev_stat_grps.stat_group);
 432
 433        config_group_init_type_name(&dev->dev_stat_grps.scsi_tgt_dev_group,
 434                        "scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit);
 435        configfs_add_default_group(&dev->dev_stat_grps.scsi_tgt_dev_group,
 436                        &dev->dev_stat_grps.stat_group);
 437
 438        config_group_init_type_name(&dev->dev_stat_grps.scsi_lu_group,
 439                        "scsi_lu", &target_stat_scsi_lu_cit);
 440        configfs_add_default_group(&dev->dev_stat_grps.scsi_lu_group,
 441                        &dev->dev_stat_grps.stat_group);
 442}
 443
 444/*
 445 * SCSI Port Table
 446 */
 447
 448static struct se_lun *to_stat_port(struct config_item *item)
 449{
 450        struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
 451                        struct se_port_stat_grps, scsi_port_group);
 452        return container_of(pgrps, struct se_lun, port_stat_grps);
 453}
 454
 455static ssize_t target_stat_port_inst_show(struct config_item *item, char *page)
 456{
 457        struct se_lun *lun = to_stat_port(item);
 458        struct se_device *dev;
 459        ssize_t ret = -ENODEV;
 460
 461        rcu_read_lock();
 462        dev = rcu_dereference(lun->lun_se_dev);
 463        if (dev)
 464                ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
 465        rcu_read_unlock();
 466        return ret;
 467}
 468
 469static ssize_t target_stat_port_dev_show(struct config_item *item, char *page)
 470{
 471        struct se_lun *lun = to_stat_port(item);
 472        struct se_device *dev;
 473        ssize_t ret = -ENODEV;
 474
 475        rcu_read_lock();
 476        dev = rcu_dereference(lun->lun_se_dev);
 477        if (dev)
 478                ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
 479        rcu_read_unlock();
 480        return ret;
 481}
 482
 483static ssize_t target_stat_port_indx_show(struct config_item *item, char *page)
 484{
 485        struct se_lun *lun = to_stat_port(item);
 486        struct se_device *dev;
 487        ssize_t ret = -ENODEV;
 488
 489        rcu_read_lock();
 490        dev = rcu_dereference(lun->lun_se_dev);
 491        if (dev)
 492                ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
 493        rcu_read_unlock();
 494        return ret;
 495}
 496
 497static ssize_t target_stat_port_role_show(struct config_item *item, char *page)
 498{
 499        struct se_lun *lun = to_stat_port(item);
 500        struct se_device *dev;
 501        ssize_t ret = -ENODEV;
 502
 503        rcu_read_lock();
 504        dev = rcu_dereference(lun->lun_se_dev);
 505        if (dev)
 506                ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
 507        rcu_read_unlock();
 508        return ret;
 509}
 510
 511static ssize_t target_stat_port_busy_count_show(struct config_item *item,
 512                char *page)
 513{
 514        struct se_lun *lun = to_stat_port(item);
 515        struct se_device *dev;
 516        ssize_t ret = -ENODEV;
 517
 518        rcu_read_lock();
 519        dev = rcu_dereference(lun->lun_se_dev);
 520        if (dev) {
 521                /* FIXME: scsiPortBusyStatuses  */
 522                ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
 523        }
 524        rcu_read_unlock();
 525        return ret;
 526}
 527
 528CONFIGFS_ATTR_RO(target_stat_port_, inst);
 529CONFIGFS_ATTR_RO(target_stat_port_, dev);
 530CONFIGFS_ATTR_RO(target_stat_port_, indx);
 531CONFIGFS_ATTR_RO(target_stat_port_, role);
 532CONFIGFS_ATTR_RO(target_stat_port_, busy_count);
 533
 534static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
 535        &target_stat_port_attr_inst,
 536        &target_stat_port_attr_dev,
 537        &target_stat_port_attr_indx,
 538        &target_stat_port_attr_role,
 539        &target_stat_port_attr_busy_count,
 540        NULL,
 541};
 542
 543static const struct config_item_type target_stat_scsi_port_cit = {
 544        .ct_attrs               = target_stat_scsi_port_attrs,
 545        .ct_owner               = THIS_MODULE,
 546};
 547
 548/*
 549 * SCSI Target Port Table
 550 */
 551static struct se_lun *to_stat_tgt_port(struct config_item *item)
 552{
 553        struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
 554                        struct se_port_stat_grps, scsi_tgt_port_group);
 555        return container_of(pgrps, struct se_lun, port_stat_grps);
 556}
 557
 558static ssize_t target_stat_tgt_port_inst_show(struct config_item *item,
 559                char *page)
 560{
 561        struct se_lun *lun = to_stat_tgt_port(item);
 562        struct se_device *dev;
 563        ssize_t ret = -ENODEV;
 564
 565        rcu_read_lock();
 566        dev = rcu_dereference(lun->lun_se_dev);
 567        if (dev)
 568                ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
 569        rcu_read_unlock();
 570        return ret;
 571}
 572
 573static ssize_t target_stat_tgt_port_dev_show(struct config_item *item,
 574                char *page)
 575{
 576        struct se_lun *lun = to_stat_tgt_port(item);
 577        struct se_device *dev;
 578        ssize_t ret = -ENODEV;
 579
 580        rcu_read_lock();
 581        dev = rcu_dereference(lun->lun_se_dev);
 582        if (dev)
 583                ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
 584        rcu_read_unlock();
 585        return ret;
 586}
 587
 588static ssize_t target_stat_tgt_port_indx_show(struct config_item *item,
 589                char *page)
 590{
 591        struct se_lun *lun = to_stat_tgt_port(item);
 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, "%u\n", lun->lun_rtpi);
 599        rcu_read_unlock();
 600        return ret;
 601}
 602
 603static ssize_t target_stat_tgt_port_name_show(struct config_item *item,
 604                char *page)
 605{
 606        struct se_lun *lun = to_stat_tgt_port(item);
 607        struct se_portal_group *tpg = lun->lun_tpg;
 608        struct se_device *dev;
 609        ssize_t ret = -ENODEV;
 610
 611        rcu_read_lock();
 612        dev = rcu_dereference(lun->lun_se_dev);
 613        if (dev)
 614                ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
 615                        tpg->se_tpg_tfo->get_fabric_name(),
 616                        lun->lun_rtpi);
 617        rcu_read_unlock();
 618        return ret;
 619}
 620
 621static ssize_t target_stat_tgt_port_port_index_show(struct config_item *item,
 622                char *page)
 623{
 624        struct se_lun *lun = to_stat_tgt_port(item);
 625        struct se_portal_group *tpg = lun->lun_tpg;
 626        struct se_device *dev;
 627        ssize_t ret = -ENODEV;
 628
 629        rcu_read_lock();
 630        dev = rcu_dereference(lun->lun_se_dev);
 631        if (dev)
 632                ret = snprintf(page, PAGE_SIZE, "%s%s%d\n",
 633                        tpg->se_tpg_tfo->tpg_get_wwn(tpg), "+t+",
 634                        tpg->se_tpg_tfo->tpg_get_tag(tpg));
 635        rcu_read_unlock();
 636        return ret;
 637}
 638
 639static ssize_t target_stat_tgt_port_in_cmds_show(struct config_item *item,
 640                char *page)
 641{
 642        struct se_lun *lun = to_stat_tgt_port(item);
 643        struct se_device *dev;
 644        ssize_t ret = -ENODEV;
 645
 646        rcu_read_lock();
 647        dev = rcu_dereference(lun->lun_se_dev);
 648        if (dev)
 649                ret = snprintf(page, PAGE_SIZE, "%lu\n",
 650                               atomic_long_read(&lun->lun_stats.cmd_pdus));
 651        rcu_read_unlock();
 652        return ret;
 653}
 654
 655static ssize_t target_stat_tgt_port_write_mbytes_show(struct config_item *item,
 656                char *page)
 657{
 658        struct se_lun *lun = to_stat_tgt_port(item);
 659        struct se_device *dev;
 660        ssize_t ret = -ENODEV;
 661
 662        rcu_read_lock();
 663        dev = rcu_dereference(lun->lun_se_dev);
 664        if (dev)
 665                ret = snprintf(page, PAGE_SIZE, "%u\n",
 666                        (u32)(atomic_long_read(&lun->lun_stats.rx_data_octets) >> 20));
 667        rcu_read_unlock();
 668        return ret;
 669}
 670
 671static ssize_t target_stat_tgt_port_read_mbytes_show(struct config_item *item,
 672                char *page)
 673{
 674        struct se_lun *lun = to_stat_tgt_port(item);
 675        struct se_device *dev;
 676        ssize_t ret = -ENODEV;
 677
 678        rcu_read_lock();
 679        dev = rcu_dereference(lun->lun_se_dev);
 680        if (dev)
 681                ret = snprintf(page, PAGE_SIZE, "%u\n",
 682                                (u32)(atomic_long_read(&lun->lun_stats.tx_data_octets) >> 20));
 683        rcu_read_unlock();
 684        return ret;
 685}
 686
 687static ssize_t target_stat_tgt_port_hs_in_cmds_show(struct config_item *item,
 688                char *page)
 689{
 690        struct se_lun *lun = to_stat_tgt_port(item);
 691        struct se_device *dev;
 692        ssize_t ret = -ENODEV;
 693
 694        rcu_read_lock();
 695        dev = rcu_dereference(lun->lun_se_dev);
 696        if (dev) {
 697                /* FIXME: scsiTgtPortHsInCommands */
 698                ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
 699        }
 700        rcu_read_unlock();
 701        return ret;
 702}
 703
 704CONFIGFS_ATTR_RO(target_stat_tgt_port_, inst);
 705CONFIGFS_ATTR_RO(target_stat_tgt_port_, dev);
 706CONFIGFS_ATTR_RO(target_stat_tgt_port_, indx);
 707CONFIGFS_ATTR_RO(target_stat_tgt_port_, name);
 708CONFIGFS_ATTR_RO(target_stat_tgt_port_, port_index);
 709CONFIGFS_ATTR_RO(target_stat_tgt_port_, in_cmds);
 710CONFIGFS_ATTR_RO(target_stat_tgt_port_, write_mbytes);
 711CONFIGFS_ATTR_RO(target_stat_tgt_port_, read_mbytes);
 712CONFIGFS_ATTR_RO(target_stat_tgt_port_, hs_in_cmds);
 713
 714static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
 715        &target_stat_tgt_port_attr_inst,
 716        &target_stat_tgt_port_attr_dev,
 717        &target_stat_tgt_port_attr_indx,
 718        &target_stat_tgt_port_attr_name,
 719        &target_stat_tgt_port_attr_port_index,
 720        &target_stat_tgt_port_attr_in_cmds,
 721        &target_stat_tgt_port_attr_write_mbytes,
 722        &target_stat_tgt_port_attr_read_mbytes,
 723        &target_stat_tgt_port_attr_hs_in_cmds,
 724        NULL,
 725};
 726
 727static const struct config_item_type target_stat_scsi_tgt_port_cit = {
 728        .ct_attrs               = target_stat_scsi_tgt_port_attrs,
 729        .ct_owner               = THIS_MODULE,
 730};
 731
 732/*
 733 * SCSI Transport Table
 734 */
 735static struct se_lun *to_transport_stat(struct config_item *item)
 736{
 737        struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
 738                        struct se_port_stat_grps, scsi_transport_group);
 739        return container_of(pgrps, struct se_lun, port_stat_grps);
 740}
 741
 742static ssize_t target_stat_transport_inst_show(struct config_item *item,
 743                char *page)
 744{
 745        struct se_lun *lun = to_transport_stat(item);
 746        struct se_device *dev;
 747        ssize_t ret = -ENODEV;
 748
 749        rcu_read_lock();
 750        dev = rcu_dereference(lun->lun_se_dev);
 751        if (dev)
 752                ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
 753        rcu_read_unlock();
 754        return ret;
 755}
 756
 757static ssize_t target_stat_transport_device_show(struct config_item *item,
 758                char *page)
 759{
 760        struct se_lun *lun = to_transport_stat(item);
 761        struct se_device *dev;
 762        struct se_portal_group *tpg = lun->lun_tpg;
 763        ssize_t ret = -ENODEV;
 764
 765        rcu_read_lock();
 766        dev = rcu_dereference(lun->lun_se_dev);
 767        if (dev) {
 768                /* scsiTransportType */
 769                ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
 770                               tpg->se_tpg_tfo->get_fabric_name());
 771        }
 772        rcu_read_unlock();
 773        return ret;
 774}
 775
 776static ssize_t target_stat_transport_indx_show(struct config_item *item,
 777                char *page)
 778{
 779        struct se_lun *lun = to_transport_stat(item);
 780        struct se_device *dev;
 781        struct se_portal_group *tpg = lun->lun_tpg;
 782        ssize_t ret = -ENODEV;
 783
 784        rcu_read_lock();
 785        dev = rcu_dereference(lun->lun_se_dev);
 786        if (dev)
 787                ret = snprintf(page, PAGE_SIZE, "%u\n",
 788                               tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
 789        rcu_read_unlock();
 790        return ret;
 791}
 792
 793static ssize_t target_stat_transport_dev_name_show(struct config_item *item,
 794                char *page)
 795{
 796        struct se_lun *lun = to_transport_stat(item);
 797        struct se_device *dev;
 798        struct se_portal_group *tpg = lun->lun_tpg;
 799        struct t10_wwn *wwn;
 800        ssize_t ret = -ENODEV;
 801
 802        rcu_read_lock();
 803        dev = rcu_dereference(lun->lun_se_dev);
 804        if (dev) {
 805                wwn = &dev->t10_wwn;
 806                /* scsiTransportDevName */
 807                ret = snprintf(page, PAGE_SIZE, "%s+%s\n",
 808                                tpg->se_tpg_tfo->tpg_get_wwn(tpg),
 809                                (strlen(wwn->unit_serial)) ? wwn->unit_serial :
 810                                wwn->vendor);
 811        }
 812        rcu_read_unlock();
 813        return ret;
 814}
 815
 816static ssize_t target_stat_transport_proto_id_show(struct config_item *item,
 817                char *page)
 818{
 819        struct se_lun *lun = to_transport_stat(item);
 820        struct se_device *dev;
 821        struct se_portal_group *tpg = lun->lun_tpg;
 822        ssize_t ret = -ENODEV;
 823
 824        rcu_read_lock();
 825        dev = rcu_dereference(lun->lun_se_dev);
 826        if (dev)
 827                ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->proto_id);
 828        rcu_read_unlock();
 829        return ret;
 830}
 831
 832CONFIGFS_ATTR_RO(target_stat_transport_, inst);
 833CONFIGFS_ATTR_RO(target_stat_transport_, device);
 834CONFIGFS_ATTR_RO(target_stat_transport_, indx);
 835CONFIGFS_ATTR_RO(target_stat_transport_, dev_name);
 836CONFIGFS_ATTR_RO(target_stat_transport_, proto_id);
 837
 838static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
 839        &target_stat_transport_attr_inst,
 840        &target_stat_transport_attr_device,
 841        &target_stat_transport_attr_indx,
 842        &target_stat_transport_attr_dev_name,
 843        &target_stat_transport_attr_proto_id,
 844        NULL,
 845};
 846
 847static const struct config_item_type target_stat_scsi_transport_cit = {
 848        .ct_attrs               = target_stat_scsi_transport_attrs,
 849        .ct_owner               = THIS_MODULE,
 850};
 851
 852/*
 853 * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
 854 * the target port statistics groups + configfs CITs located in target_core_stat.c
 855 */
 856void target_stat_setup_port_default_groups(struct se_lun *lun)
 857{
 858        config_group_init_type_name(&lun->port_stat_grps.scsi_port_group,
 859                        "scsi_port", &target_stat_scsi_port_cit);
 860        configfs_add_default_group(&lun->port_stat_grps.scsi_port_group,
 861                        &lun->port_stat_grps.stat_group);
 862
 863        config_group_init_type_name(&lun->port_stat_grps.scsi_tgt_port_group,
 864                        "scsi_tgt_port", &target_stat_scsi_tgt_port_cit);
 865        configfs_add_default_group(&lun->port_stat_grps.scsi_tgt_port_group,
 866                        &lun->port_stat_grps.stat_group);
 867
 868        config_group_init_type_name(&lun->port_stat_grps.scsi_transport_group,
 869                        "scsi_transport", &target_stat_scsi_transport_cit);
 870        configfs_add_default_group(&lun->port_stat_grps.scsi_transport_group,
 871                        &lun->port_stat_grps.stat_group);
 872}
 873
 874/*
 875 * SCSI Authorized Initiator Table
 876 */
 877
 878static struct se_lun_acl *auth_to_lacl(struct config_item *item)
 879{
 880        struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
 881                        struct se_ml_stat_grps, scsi_auth_intr_group);
 882        return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
 883}
 884
 885static ssize_t target_stat_auth_inst_show(struct config_item *item,
 886                char *page)
 887{
 888        struct se_lun_acl *lacl = auth_to_lacl(item);
 889        struct se_node_acl *nacl = lacl->se_lun_nacl;
 890        struct se_dev_entry *deve;
 891        struct se_portal_group *tpg;
 892        ssize_t ret;
 893
 894        rcu_read_lock();
 895        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
 896        if (!deve) {
 897                rcu_read_unlock();
 898                return -ENODEV;
 899        }
 900        tpg = nacl->se_tpg;
 901        /* scsiInstIndex */
 902        ret = snprintf(page, PAGE_SIZE, "%u\n",
 903                        tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
 904        rcu_read_unlock();
 905        return ret;
 906}
 907
 908static ssize_t target_stat_auth_dev_show(struct config_item *item,
 909                char *page)
 910{
 911        struct se_lun_acl *lacl = auth_to_lacl(item);
 912        struct se_node_acl *nacl = lacl->se_lun_nacl;
 913        struct se_dev_entry *deve;
 914        struct se_lun *lun;
 915        ssize_t ret;
 916
 917        rcu_read_lock();
 918        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
 919        if (!deve) {
 920                rcu_read_unlock();
 921                return -ENODEV;
 922        }
 923        lun = rcu_dereference(deve->se_lun);
 924        /* scsiDeviceIndex */
 925        ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
 926        rcu_read_unlock();
 927        return ret;
 928}
 929
 930static ssize_t target_stat_auth_port_show(struct config_item *item,
 931                char *page)
 932{
 933        struct se_lun_acl *lacl = auth_to_lacl(item);
 934        struct se_node_acl *nacl = lacl->se_lun_nacl;
 935        struct se_dev_entry *deve;
 936        struct se_portal_group *tpg;
 937        ssize_t ret;
 938
 939        rcu_read_lock();
 940        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
 941        if (!deve) {
 942                rcu_read_unlock();
 943                return -ENODEV;
 944        }
 945        tpg = nacl->se_tpg;
 946        /* scsiAuthIntrTgtPortIndex */
 947        ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
 948        rcu_read_unlock();
 949        return ret;
 950}
 951
 952static ssize_t target_stat_auth_indx_show(struct config_item *item,
 953                char *page)
 954{
 955        struct se_lun_acl *lacl = auth_to_lacl(item);
 956        struct se_node_acl *nacl = lacl->se_lun_nacl;
 957        struct se_dev_entry *deve;
 958        ssize_t ret;
 959
 960        rcu_read_lock();
 961        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
 962        if (!deve) {
 963                rcu_read_unlock();
 964                return -ENODEV;
 965        }
 966        /* scsiAuthIntrIndex */
 967        ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
 968        rcu_read_unlock();
 969        return ret;
 970}
 971
 972static ssize_t target_stat_auth_dev_or_port_show(struct config_item *item,
 973                char *page)
 974{
 975        struct se_lun_acl *lacl = auth_to_lacl(item);
 976        struct se_node_acl *nacl = lacl->se_lun_nacl;
 977        struct se_dev_entry *deve;
 978        ssize_t ret;
 979
 980        rcu_read_lock();
 981        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
 982        if (!deve) {
 983                rcu_read_unlock();
 984                return -ENODEV;
 985        }
 986        /* scsiAuthIntrDevOrPort */
 987        ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
 988        rcu_read_unlock();
 989        return ret;
 990}
 991
 992static ssize_t target_stat_auth_intr_name_show(struct config_item *item,
 993                char *page)
 994{
 995        struct se_lun_acl *lacl = auth_to_lacl(item);
 996        struct se_node_acl *nacl = lacl->se_lun_nacl;
 997        struct se_dev_entry *deve;
 998        ssize_t ret;
 999
1000        rcu_read_lock();
1001        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1002        if (!deve) {
1003                rcu_read_unlock();
1004                return -ENODEV;
1005        }
1006        /* scsiAuthIntrName */
1007        ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
1008        rcu_read_unlock();
1009        return ret;
1010}
1011
1012static ssize_t target_stat_auth_map_indx_show(struct config_item *item,
1013                char *page)
1014{
1015        struct se_lun_acl *lacl = auth_to_lacl(item);
1016        struct se_node_acl *nacl = lacl->se_lun_nacl;
1017        struct se_dev_entry *deve;
1018        ssize_t ret;
1019
1020        rcu_read_lock();
1021        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1022        if (!deve) {
1023                rcu_read_unlock();
1024                return -ENODEV;
1025        }
1026        /* FIXME: scsiAuthIntrLunMapIndex */
1027        ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1028        rcu_read_unlock();
1029        return ret;
1030}
1031
1032static ssize_t target_stat_auth_att_count_show(struct config_item *item,
1033                char *page)
1034{
1035        struct se_lun_acl *lacl = auth_to_lacl(item);
1036        struct se_node_acl *nacl = lacl->se_lun_nacl;
1037        struct se_dev_entry *deve;
1038        ssize_t ret;
1039
1040        rcu_read_lock();
1041        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1042        if (!deve) {
1043                rcu_read_unlock();
1044                return -ENODEV;
1045        }
1046        /* scsiAuthIntrAttachedTimes */
1047        ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
1048        rcu_read_unlock();
1049        return ret;
1050}
1051
1052static ssize_t target_stat_auth_num_cmds_show(struct config_item *item,
1053                char *page)
1054{
1055        struct se_lun_acl *lacl = auth_to_lacl(item);
1056        struct se_node_acl *nacl = lacl->se_lun_nacl;
1057        struct se_dev_entry *deve;
1058        ssize_t ret;
1059
1060        rcu_read_lock();
1061        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1062        if (!deve) {
1063                rcu_read_unlock();
1064                return -ENODEV;
1065        }
1066        /* scsiAuthIntrOutCommands */
1067        ret = snprintf(page, PAGE_SIZE, "%lu\n",
1068                       atomic_long_read(&deve->total_cmds));
1069        rcu_read_unlock();
1070        return ret;
1071}
1072
1073static ssize_t target_stat_auth_read_mbytes_show(struct config_item *item,
1074                char *page)
1075{
1076        struct se_lun_acl *lacl = auth_to_lacl(item);
1077        struct se_node_acl *nacl = lacl->se_lun_nacl;
1078        struct se_dev_entry *deve;
1079        ssize_t ret;
1080
1081        rcu_read_lock();
1082        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1083        if (!deve) {
1084                rcu_read_unlock();
1085                return -ENODEV;
1086        }
1087        /* scsiAuthIntrReadMegaBytes */
1088        ret = snprintf(page, PAGE_SIZE, "%u\n",
1089                      (u32)(atomic_long_read(&deve->read_bytes) >> 20));
1090        rcu_read_unlock();
1091        return ret;
1092}
1093
1094static ssize_t target_stat_auth_write_mbytes_show(struct config_item *item,
1095                char *page)
1096{
1097        struct se_lun_acl *lacl = auth_to_lacl(item);
1098        struct se_node_acl *nacl = lacl->se_lun_nacl;
1099        struct se_dev_entry *deve;
1100        ssize_t ret;
1101
1102        rcu_read_lock();
1103        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1104        if (!deve) {
1105                rcu_read_unlock();
1106                return -ENODEV;
1107        }
1108        /* scsiAuthIntrWrittenMegaBytes */
1109        ret = snprintf(page, PAGE_SIZE, "%u\n",
1110                      (u32)(atomic_long_read(&deve->write_bytes) >> 20));
1111        rcu_read_unlock();
1112        return ret;
1113}
1114
1115static ssize_t target_stat_auth_hs_num_cmds_show(struct config_item *item,
1116                char *page)
1117{
1118        struct se_lun_acl *lacl = auth_to_lacl(item);
1119        struct se_node_acl *nacl = lacl->se_lun_nacl;
1120        struct se_dev_entry *deve;
1121        ssize_t ret;
1122
1123        rcu_read_lock();
1124        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1125        if (!deve) {
1126                rcu_read_unlock();
1127                return -ENODEV;
1128        }
1129        /* FIXME: scsiAuthIntrHSOutCommands */
1130        ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1131        rcu_read_unlock();
1132        return ret;
1133}
1134
1135static ssize_t target_stat_auth_creation_time_show(struct config_item *item,
1136                char *page)
1137{
1138        struct se_lun_acl *lacl = auth_to_lacl(item);
1139        struct se_node_acl *nacl = lacl->se_lun_nacl;
1140        struct se_dev_entry *deve;
1141        ssize_t ret;
1142
1143        rcu_read_lock();
1144        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1145        if (!deve) {
1146                rcu_read_unlock();
1147                return -ENODEV;
1148        }
1149        /* scsiAuthIntrLastCreation */
1150        ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
1151                                INITIAL_JIFFIES) * 100 / HZ));
1152        rcu_read_unlock();
1153        return ret;
1154}
1155
1156static ssize_t target_stat_auth_row_status_show(struct config_item *item,
1157                char *page)
1158{
1159        struct se_lun_acl *lacl = auth_to_lacl(item);
1160        struct se_node_acl *nacl = lacl->se_lun_nacl;
1161        struct se_dev_entry *deve;
1162        ssize_t ret;
1163
1164        rcu_read_lock();
1165        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1166        if (!deve) {
1167                rcu_read_unlock();
1168                return -ENODEV;
1169        }
1170        /* FIXME: scsiAuthIntrRowStatus */
1171        ret = snprintf(page, PAGE_SIZE, "Ready\n");
1172        rcu_read_unlock();
1173        return ret;
1174}
1175
1176CONFIGFS_ATTR_RO(target_stat_auth_, inst);
1177CONFIGFS_ATTR_RO(target_stat_auth_, dev);
1178CONFIGFS_ATTR_RO(target_stat_auth_, port);
1179CONFIGFS_ATTR_RO(target_stat_auth_, indx);
1180CONFIGFS_ATTR_RO(target_stat_auth_, dev_or_port);
1181CONFIGFS_ATTR_RO(target_stat_auth_, intr_name);
1182CONFIGFS_ATTR_RO(target_stat_auth_, map_indx);
1183CONFIGFS_ATTR_RO(target_stat_auth_, att_count);
1184CONFIGFS_ATTR_RO(target_stat_auth_, num_cmds);
1185CONFIGFS_ATTR_RO(target_stat_auth_, read_mbytes);
1186CONFIGFS_ATTR_RO(target_stat_auth_, write_mbytes);
1187CONFIGFS_ATTR_RO(target_stat_auth_, hs_num_cmds);
1188CONFIGFS_ATTR_RO(target_stat_auth_, creation_time);
1189CONFIGFS_ATTR_RO(target_stat_auth_, row_status);
1190
1191static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
1192        &target_stat_auth_attr_inst,
1193        &target_stat_auth_attr_dev,
1194        &target_stat_auth_attr_port,
1195        &target_stat_auth_attr_indx,
1196        &target_stat_auth_attr_dev_or_port,
1197        &target_stat_auth_attr_intr_name,
1198        &target_stat_auth_attr_map_indx,
1199        &target_stat_auth_attr_att_count,
1200        &target_stat_auth_attr_num_cmds,
1201        &target_stat_auth_attr_read_mbytes,
1202        &target_stat_auth_attr_write_mbytes,
1203        &target_stat_auth_attr_hs_num_cmds,
1204        &target_stat_auth_attr_creation_time,
1205        &target_stat_auth_attr_row_status,
1206        NULL,
1207};
1208
1209static const struct config_item_type target_stat_scsi_auth_intr_cit = {
1210        .ct_attrs               = target_stat_scsi_auth_intr_attrs,
1211        .ct_owner               = THIS_MODULE,
1212};
1213
1214/*
1215 * SCSI Attached Initiator Port Table
1216 */
1217
1218static struct se_lun_acl *iport_to_lacl(struct config_item *item)
1219{
1220        struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
1221                        struct se_ml_stat_grps, scsi_att_intr_port_group);
1222        return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
1223}
1224
1225static ssize_t target_stat_iport_inst_show(struct config_item *item,
1226                char *page)
1227{
1228        struct se_lun_acl *lacl = iport_to_lacl(item);
1229        struct se_node_acl *nacl = lacl->se_lun_nacl;
1230        struct se_dev_entry *deve;
1231        struct se_portal_group *tpg;
1232        ssize_t ret;
1233
1234        rcu_read_lock();
1235        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1236        if (!deve) {
1237                rcu_read_unlock();
1238                return -ENODEV;
1239        }
1240        tpg = nacl->se_tpg;
1241        /* scsiInstIndex */
1242        ret = snprintf(page, PAGE_SIZE, "%u\n",
1243                        tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
1244        rcu_read_unlock();
1245        return ret;
1246}
1247
1248static ssize_t target_stat_iport_dev_show(struct config_item *item,
1249                char *page)
1250{
1251        struct se_lun_acl *lacl = iport_to_lacl(item);
1252        struct se_node_acl *nacl = lacl->se_lun_nacl;
1253        struct se_dev_entry *deve;
1254        struct se_lun *lun;
1255        ssize_t ret;
1256
1257        rcu_read_lock();
1258        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1259        if (!deve) {
1260                rcu_read_unlock();
1261                return -ENODEV;
1262        }
1263        lun = rcu_dereference(deve->se_lun);
1264        /* scsiDeviceIndex */
1265        ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
1266        rcu_read_unlock();
1267        return ret;
1268}
1269
1270static ssize_t target_stat_iport_port_show(struct config_item *item,
1271                char *page)
1272{
1273        struct se_lun_acl *lacl = iport_to_lacl(item);
1274        struct se_node_acl *nacl = lacl->se_lun_nacl;
1275        struct se_dev_entry *deve;
1276        struct se_portal_group *tpg;
1277        ssize_t ret;
1278
1279        rcu_read_lock();
1280        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1281        if (!deve) {
1282                rcu_read_unlock();
1283                return -ENODEV;
1284        }
1285        tpg = nacl->se_tpg;
1286        /* scsiPortIndex */
1287        ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
1288        rcu_read_unlock();
1289        return ret;
1290}
1291
1292static ssize_t target_stat_iport_indx_show(struct config_item *item,
1293                char *page)
1294{
1295        struct se_lun_acl *lacl = iport_to_lacl(item);
1296        struct se_node_acl *nacl = lacl->se_lun_nacl;
1297        struct se_session *se_sess;
1298        struct se_portal_group *tpg;
1299        ssize_t ret;
1300
1301        spin_lock_irq(&nacl->nacl_sess_lock);
1302        se_sess = nacl->nacl_sess;
1303        if (!se_sess) {
1304                spin_unlock_irq(&nacl->nacl_sess_lock);
1305                return -ENODEV;
1306        }
1307
1308        tpg = nacl->se_tpg;
1309        /* scsiAttIntrPortIndex */
1310        ret = snprintf(page, PAGE_SIZE, "%u\n",
1311                        tpg->se_tpg_tfo->sess_get_index(se_sess));
1312        spin_unlock_irq(&nacl->nacl_sess_lock);
1313        return ret;
1314}
1315
1316static ssize_t target_stat_iport_port_auth_indx_show(struct config_item *item,
1317                char *page)
1318{
1319        struct se_lun_acl *lacl = iport_to_lacl(item);
1320        struct se_node_acl *nacl = lacl->se_lun_nacl;
1321        struct se_dev_entry *deve;
1322        ssize_t ret;
1323
1324        rcu_read_lock();
1325        deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
1326        if (!deve) {
1327                rcu_read_unlock();
1328                return -ENODEV;
1329        }
1330        /* scsiAttIntrPortAuthIntrIdx */
1331        ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1332        rcu_read_unlock();
1333        return ret;
1334}
1335
1336static ssize_t target_stat_iport_port_ident_show(struct config_item *item,
1337                char *page)
1338{
1339        struct se_lun_acl *lacl = iport_to_lacl(item);
1340        struct se_node_acl *nacl = lacl->se_lun_nacl;
1341        struct se_session *se_sess;
1342        struct se_portal_group *tpg;
1343        ssize_t ret;
1344        unsigned char buf[64];
1345
1346        spin_lock_irq(&nacl->nacl_sess_lock);
1347        se_sess = nacl->nacl_sess;
1348        if (!se_sess) {
1349                spin_unlock_irq(&nacl->nacl_sess_lock);
1350                return -ENODEV;
1351        }
1352
1353        tpg = nacl->se_tpg;
1354        /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1355        memset(buf, 0, 64);
1356        if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
1357                tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
1358
1359        ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
1360        spin_unlock_irq(&nacl->nacl_sess_lock);
1361        return ret;
1362}
1363
1364CONFIGFS_ATTR_RO(target_stat_iport_, inst);
1365CONFIGFS_ATTR_RO(target_stat_iport_, dev);
1366CONFIGFS_ATTR_RO(target_stat_iport_, port);
1367CONFIGFS_ATTR_RO(target_stat_iport_, indx);
1368CONFIGFS_ATTR_RO(target_stat_iport_, port_auth_indx);
1369CONFIGFS_ATTR_RO(target_stat_iport_, port_ident);
1370
1371static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
1372        &target_stat_iport_attr_inst,
1373        &target_stat_iport_attr_dev,
1374        &target_stat_iport_attr_port,
1375        &target_stat_iport_attr_indx,
1376        &target_stat_iport_attr_port_auth_indx,
1377        &target_stat_iport_attr_port_ident,
1378        NULL,
1379};
1380
1381static const struct config_item_type target_stat_scsi_att_intr_port_cit = {
1382        .ct_attrs               = target_stat_scsi_ath_intr_port_attrs,
1383        .ct_owner               = THIS_MODULE,
1384};
1385
1386/*
1387 * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
1388 * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
1389 */
1390void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
1391{
1392        config_group_init_type_name(&lacl->ml_stat_grps.scsi_auth_intr_group,
1393                        "scsi_auth_intr", &target_stat_scsi_auth_intr_cit);
1394        configfs_add_default_group(&lacl->ml_stat_grps.scsi_auth_intr_group,
1395                        &lacl->ml_stat_grps.stat_group);
1396
1397        config_group_init_type_name(&lacl->ml_stat_grps.scsi_att_intr_port_group,
1398                        "scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit);
1399        configfs_add_default_group(&lacl->ml_stat_grps.scsi_att_intr_port_group,
1400                        &lacl->ml_stat_grps.stat_group);
1401}
1402