cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

iscsi_target_stat.c (23248B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*******************************************************************************
      3 * Modern ConfigFS group context specific iSCSI statistics based on original
      4 * iscsi_target_mib.c code
      5 *
      6 * Copyright (c) 2011-2013 Datera, Inc.
      7 *
      8 * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
      9 *
     10 ******************************************************************************/
     11
     12#include <linux/configfs.h>
     13#include <linux/export.h>
     14#include <scsi/iscsi_proto.h>
     15#include <target/target_core_base.h>
     16
     17#include <target/iscsi/iscsi_target_core.h>
     18#include "iscsi_target_parameters.h"
     19#include "iscsi_target_device.h"
     20#include "iscsi_target_tpg.h"
     21#include "iscsi_target_util.h"
     22#include <target/iscsi/iscsi_target_stat.h>
     23
     24#ifndef INITIAL_JIFFIES
     25#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
     26#endif
     27
     28/* Instance Attributes Table */
     29#define ISCSI_INST_NUM_NODES		1
     30#define ISCSI_INST_DESCR		"Storage Engine Target"
     31#define ISCSI_DISCONTINUITY_TIME	0
     32
     33#define ISCSI_NODE_INDEX		1
     34
     35#define ISPRINT(a)   ((a >= ' ') && (a <= '~'))
     36
     37/****************************************************************************
     38 * iSCSI MIB Tables
     39 ****************************************************************************/
     40/*
     41 * Instance Attributes Table
     42 */
     43static struct iscsi_tiqn *iscsi_instance_tiqn(struct config_item *item)
     44{
     45	struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
     46			struct iscsi_wwn_stat_grps, iscsi_instance_group);
     47	return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
     48}
     49
     50static ssize_t iscsi_stat_instance_inst_show(struct config_item *item,
     51		char *page)
     52{
     53	return snprintf(page, PAGE_SIZE, "%u\n",
     54			iscsi_instance_tiqn(item)->tiqn_index);
     55}
     56
     57static ssize_t iscsi_stat_instance_min_ver_show(struct config_item *item,
     58		char *page)
     59{
     60	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DRAFT20_VERSION);
     61}
     62
     63static ssize_t iscsi_stat_instance_max_ver_show(struct config_item *item,
     64		char *page)
     65{
     66	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DRAFT20_VERSION);
     67}
     68
     69static ssize_t iscsi_stat_instance_portals_show(struct config_item *item,
     70		char *page)
     71{
     72	return snprintf(page, PAGE_SIZE, "%u\n",
     73			iscsi_instance_tiqn(item)->tiqn_num_tpg_nps);
     74}
     75
     76static ssize_t iscsi_stat_instance_nodes_show(struct config_item *item,
     77		char *page)
     78{
     79	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_INST_NUM_NODES);
     80}
     81
     82static ssize_t iscsi_stat_instance_sessions_show(struct config_item *item,
     83		char *page)
     84{
     85	return snprintf(page, PAGE_SIZE, "%u\n",
     86		iscsi_instance_tiqn(item)->tiqn_nsessions);
     87}
     88
     89static ssize_t iscsi_stat_instance_fail_sess_show(struct config_item *item,
     90		char *page)
     91{
     92	struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
     93	struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
     94	u32 sess_err_count;
     95
     96	spin_lock_bh(&sess_err->lock);
     97	sess_err_count = (sess_err->digest_errors +
     98			  sess_err->cxn_timeout_errors +
     99			  sess_err->pdu_format_errors);
    100	spin_unlock_bh(&sess_err->lock);
    101
    102	return snprintf(page, PAGE_SIZE, "%u\n", sess_err_count);
    103}
    104
    105static ssize_t iscsi_stat_instance_fail_type_show(struct config_item *item,
    106		char *page)
    107{
    108	struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
    109	struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
    110
    111	return snprintf(page, PAGE_SIZE, "%u\n",
    112			sess_err->last_sess_failure_type);
    113}
    114
    115static ssize_t iscsi_stat_instance_fail_rem_name_show(struct config_item *item,
    116		char *page)
    117{
    118	struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
    119	struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
    120
    121	return snprintf(page, PAGE_SIZE, "%s\n",
    122			sess_err->last_sess_fail_rem_name[0] ?
    123			sess_err->last_sess_fail_rem_name : NONE);
    124}
    125
    126static ssize_t iscsi_stat_instance_disc_time_show(struct config_item *item,
    127		char *page)
    128{
    129	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DISCONTINUITY_TIME);
    130}
    131
    132static ssize_t iscsi_stat_instance_description_show(struct config_item *item,
    133		char *page)
    134{
    135	return snprintf(page, PAGE_SIZE, "%s\n", ISCSI_INST_DESCR);
    136}
    137
    138static ssize_t iscsi_stat_instance_vendor_show(struct config_item *item,
    139		char *page)
    140{
    141	return snprintf(page, PAGE_SIZE, "Datera, Inc. iSCSI-Target\n");
    142}
    143
    144static ssize_t iscsi_stat_instance_version_show(struct config_item *item,
    145		char *page)
    146{
    147	return snprintf(page, PAGE_SIZE, "%s\n", ISCSIT_VERSION);
    148}
    149
    150CONFIGFS_ATTR_RO(iscsi_stat_instance_, inst);
    151CONFIGFS_ATTR_RO(iscsi_stat_instance_, min_ver);
    152CONFIGFS_ATTR_RO(iscsi_stat_instance_, max_ver);
    153CONFIGFS_ATTR_RO(iscsi_stat_instance_, portals);
    154CONFIGFS_ATTR_RO(iscsi_stat_instance_, nodes);
    155CONFIGFS_ATTR_RO(iscsi_stat_instance_, sessions);
    156CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_sess);
    157CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_type);
    158CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_rem_name);
    159CONFIGFS_ATTR_RO(iscsi_stat_instance_, disc_time);
    160CONFIGFS_ATTR_RO(iscsi_stat_instance_, description);
    161CONFIGFS_ATTR_RO(iscsi_stat_instance_, vendor);
    162CONFIGFS_ATTR_RO(iscsi_stat_instance_, version);
    163
    164static struct configfs_attribute *iscsi_stat_instance_attrs[] = {
    165	&iscsi_stat_instance_attr_inst,
    166	&iscsi_stat_instance_attr_min_ver,
    167	&iscsi_stat_instance_attr_max_ver,
    168	&iscsi_stat_instance_attr_portals,
    169	&iscsi_stat_instance_attr_nodes,
    170	&iscsi_stat_instance_attr_sessions,
    171	&iscsi_stat_instance_attr_fail_sess,
    172	&iscsi_stat_instance_attr_fail_type,
    173	&iscsi_stat_instance_attr_fail_rem_name,
    174	&iscsi_stat_instance_attr_disc_time,
    175	&iscsi_stat_instance_attr_description,
    176	&iscsi_stat_instance_attr_vendor,
    177	&iscsi_stat_instance_attr_version,
    178	NULL,
    179};
    180
    181const struct config_item_type iscsi_stat_instance_cit = {
    182	.ct_attrs		= iscsi_stat_instance_attrs,
    183	.ct_owner		= THIS_MODULE,
    184};
    185
    186/*
    187 * Instance Session Failure Stats Table
    188 */
    189static struct iscsi_tiqn *iscsi_sess_err_tiqn(struct config_item *item)
    190{
    191	struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
    192			struct iscsi_wwn_stat_grps, iscsi_sess_err_group);
    193	return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
    194}
    195
    196static ssize_t iscsi_stat_sess_err_inst_show(struct config_item *item,
    197		char *page)
    198{
    199	return snprintf(page, PAGE_SIZE, "%u\n",
    200		iscsi_sess_err_tiqn(item)->tiqn_index);
    201}
    202
    203static ssize_t iscsi_stat_sess_err_digest_errors_show(struct config_item *item,
    204		char *page)
    205{
    206	struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
    207	struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
    208
    209	return snprintf(page, PAGE_SIZE, "%u\n", sess_err->digest_errors);
    210}
    211
    212static ssize_t iscsi_stat_sess_err_cxn_errors_show(struct config_item *item,
    213		char *page)
    214{
    215	struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
    216	struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
    217
    218	return snprintf(page, PAGE_SIZE, "%u\n", sess_err->cxn_timeout_errors);
    219}
    220
    221static ssize_t iscsi_stat_sess_err_format_errors_show(struct config_item *item,
    222		char *page)
    223{
    224	struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
    225	struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
    226
    227	return snprintf(page, PAGE_SIZE, "%u\n", sess_err->pdu_format_errors);
    228}
    229
    230CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, inst);
    231CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, digest_errors);
    232CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, cxn_errors);
    233CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, format_errors);
    234
    235static struct configfs_attribute *iscsi_stat_sess_err_attrs[] = {
    236	&iscsi_stat_sess_err_attr_inst,
    237	&iscsi_stat_sess_err_attr_digest_errors,
    238	&iscsi_stat_sess_err_attr_cxn_errors,
    239	&iscsi_stat_sess_err_attr_format_errors,
    240	NULL,
    241};
    242
    243const struct config_item_type iscsi_stat_sess_err_cit = {
    244	.ct_attrs		= iscsi_stat_sess_err_attrs,
    245	.ct_owner		= THIS_MODULE,
    246};
    247
    248/*
    249 * Target Attributes Table
    250 */
    251static struct iscsi_tiqn *iscsi_tgt_attr_tiqn(struct config_item *item)
    252{
    253	struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
    254			struct iscsi_wwn_stat_grps, iscsi_tgt_attr_group);
    255	return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
    256}
    257
    258static ssize_t iscsi_stat_tgt_attr_inst_show(struct config_item *item,
    259		char *page)
    260{
    261	return snprintf(page, PAGE_SIZE, "%u\n",
    262			iscsi_tgt_attr_tiqn(item)->tiqn_index);
    263}
    264
    265static ssize_t iscsi_stat_tgt_attr_indx_show(struct config_item *item,
    266		char *page)
    267{
    268	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
    269}
    270
    271static ssize_t iscsi_stat_tgt_attr_login_fails_show(struct config_item *item,
    272		char *page)
    273{
    274	struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
    275	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    276	u32 fail_count;
    277
    278	spin_lock(&lstat->lock);
    279	fail_count = (lstat->redirects + lstat->authorize_fails +
    280			lstat->authenticate_fails + lstat->negotiate_fails +
    281			lstat->other_fails);
    282	spin_unlock(&lstat->lock);
    283
    284	return snprintf(page, PAGE_SIZE, "%u\n", fail_count);
    285}
    286
    287static ssize_t iscsi_stat_tgt_attr_last_fail_time_show(struct config_item *item,
    288		char *page)
    289{
    290	struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
    291	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    292	u32 last_fail_time;
    293
    294	spin_lock(&lstat->lock);
    295	last_fail_time = lstat->last_fail_time ?
    296			(u32)(((u32)lstat->last_fail_time -
    297				INITIAL_JIFFIES) * 100 / HZ) : 0;
    298	spin_unlock(&lstat->lock);
    299
    300	return snprintf(page, PAGE_SIZE, "%u\n", last_fail_time);
    301}
    302
    303static ssize_t iscsi_stat_tgt_attr_last_fail_type_show(struct config_item *item,
    304		char *page)
    305{
    306	struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
    307	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    308	u32 last_fail_type;
    309
    310	spin_lock(&lstat->lock);
    311	last_fail_type = lstat->last_fail_type;
    312	spin_unlock(&lstat->lock);
    313
    314	return snprintf(page, PAGE_SIZE, "%u\n", last_fail_type);
    315}
    316
    317static ssize_t iscsi_stat_tgt_attr_fail_intr_name_show(struct config_item *item,
    318		char *page)
    319{
    320	struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
    321	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    322	unsigned char buf[ISCSI_IQN_LEN];
    323
    324	spin_lock(&lstat->lock);
    325	snprintf(buf, ISCSI_IQN_LEN, "%s", lstat->last_intr_fail_name[0] ?
    326				lstat->last_intr_fail_name : NONE);
    327	spin_unlock(&lstat->lock);
    328
    329	return snprintf(page, PAGE_SIZE, "%s\n", buf);
    330}
    331
    332static ssize_t iscsi_stat_tgt_attr_fail_intr_addr_type_show(struct config_item *item,
    333		char *page)
    334{
    335	struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
    336	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    337	int ret;
    338
    339	spin_lock(&lstat->lock);
    340	if (lstat->last_intr_fail_ip_family == AF_INET6)
    341		ret = snprintf(page, PAGE_SIZE, "ipv6\n");
    342	else
    343		ret = snprintf(page, PAGE_SIZE, "ipv4\n");
    344	spin_unlock(&lstat->lock);
    345
    346	return ret;
    347}
    348
    349static ssize_t iscsi_stat_tgt_attr_fail_intr_addr_show(struct config_item *item,
    350		char *page)
    351{
    352	struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
    353	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    354	int ret;
    355
    356	spin_lock(&lstat->lock);
    357	ret = snprintf(page, PAGE_SIZE, "%pISc\n", &lstat->last_intr_fail_sockaddr);
    358	spin_unlock(&lstat->lock);
    359
    360	return ret;
    361}
    362
    363CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, inst);
    364CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, indx);
    365CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, login_fails);
    366CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, last_fail_time);
    367CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, last_fail_type);
    368CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_name);
    369CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_addr_type);
    370CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_addr);
    371
    372static struct configfs_attribute *iscsi_stat_tgt_attr_attrs[] = {
    373	&iscsi_stat_tgt_attr_attr_inst,
    374	&iscsi_stat_tgt_attr_attr_indx,
    375	&iscsi_stat_tgt_attr_attr_login_fails,
    376	&iscsi_stat_tgt_attr_attr_last_fail_time,
    377	&iscsi_stat_tgt_attr_attr_last_fail_type,
    378	&iscsi_stat_tgt_attr_attr_fail_intr_name,
    379	&iscsi_stat_tgt_attr_attr_fail_intr_addr_type,
    380	&iscsi_stat_tgt_attr_attr_fail_intr_addr,
    381	NULL,
    382};
    383
    384const struct config_item_type iscsi_stat_tgt_attr_cit = {
    385	.ct_attrs		= iscsi_stat_tgt_attr_attrs,
    386	.ct_owner		= THIS_MODULE,
    387};
    388
    389/*
    390 * Target Login Stats Table
    391 */
    392static struct iscsi_tiqn *iscsi_login_stat_tiqn(struct config_item *item)
    393{
    394	struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
    395			struct iscsi_wwn_stat_grps, iscsi_login_stats_group);
    396	return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
    397}
    398
    399static ssize_t iscsi_stat_login_inst_show(struct config_item *item, char *page)
    400{
    401	return snprintf(page, PAGE_SIZE, "%u\n",
    402		iscsi_login_stat_tiqn(item)->tiqn_index);
    403}
    404
    405static ssize_t iscsi_stat_login_indx_show(struct config_item *item,
    406		char *page)
    407{
    408	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
    409}
    410
    411static ssize_t iscsi_stat_login_accepts_show(struct config_item *item,
    412		char *page)
    413{
    414	struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
    415	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    416	ssize_t ret;
    417
    418	spin_lock(&lstat->lock);
    419	ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->accepts);
    420	spin_unlock(&lstat->lock);
    421
    422	return ret;
    423}
    424
    425static ssize_t iscsi_stat_login_other_fails_show(struct config_item *item,
    426		char *page)
    427{
    428	struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
    429	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    430	ssize_t ret;
    431
    432	spin_lock(&lstat->lock);
    433	ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->other_fails);
    434	spin_unlock(&lstat->lock);
    435
    436	return ret;
    437}
    438
    439static ssize_t iscsi_stat_login_redirects_show(struct config_item *item,
    440		char *page)
    441{
    442	struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
    443	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    444	ssize_t ret;
    445
    446	spin_lock(&lstat->lock);
    447	ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->redirects);
    448	spin_unlock(&lstat->lock);
    449
    450	return ret;
    451}
    452
    453static ssize_t iscsi_stat_login_authorize_fails_show(struct config_item *item,
    454		char *page)
    455{
    456	struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
    457	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    458	ssize_t ret;
    459
    460	spin_lock(&lstat->lock);
    461	ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->authorize_fails);
    462	spin_unlock(&lstat->lock);
    463
    464	return ret;
    465}
    466
    467static ssize_t iscsi_stat_login_authenticate_fails_show(
    468		struct config_item *item, char *page)
    469{
    470	struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
    471	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    472	ssize_t ret;
    473
    474	spin_lock(&lstat->lock);
    475	ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->authenticate_fails);
    476	spin_unlock(&lstat->lock);
    477
    478	return ret;
    479}
    480
    481static ssize_t iscsi_stat_login_negotiate_fails_show(struct config_item *item,
    482		char *page)
    483{
    484	struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
    485	struct iscsi_login_stats *lstat = &tiqn->login_stats;
    486	ssize_t ret;
    487
    488	spin_lock(&lstat->lock);
    489	ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->negotiate_fails);
    490	spin_unlock(&lstat->lock);
    491
    492	return ret;
    493}
    494
    495CONFIGFS_ATTR_RO(iscsi_stat_login_, inst);
    496CONFIGFS_ATTR_RO(iscsi_stat_login_, indx);
    497CONFIGFS_ATTR_RO(iscsi_stat_login_, accepts);
    498CONFIGFS_ATTR_RO(iscsi_stat_login_, other_fails);
    499CONFIGFS_ATTR_RO(iscsi_stat_login_, redirects);
    500CONFIGFS_ATTR_RO(iscsi_stat_login_, authorize_fails);
    501CONFIGFS_ATTR_RO(iscsi_stat_login_, authenticate_fails);
    502CONFIGFS_ATTR_RO(iscsi_stat_login_, negotiate_fails);
    503
    504static struct configfs_attribute *iscsi_stat_login_stats_attrs[] = {
    505	&iscsi_stat_login_attr_inst,
    506	&iscsi_stat_login_attr_indx,
    507	&iscsi_stat_login_attr_accepts,
    508	&iscsi_stat_login_attr_other_fails,
    509	&iscsi_stat_login_attr_redirects,
    510	&iscsi_stat_login_attr_authorize_fails,
    511	&iscsi_stat_login_attr_authenticate_fails,
    512	&iscsi_stat_login_attr_negotiate_fails,
    513	NULL,
    514};
    515
    516const struct config_item_type iscsi_stat_login_cit = {
    517	.ct_attrs		= iscsi_stat_login_stats_attrs,
    518	.ct_owner		= THIS_MODULE,
    519};
    520
    521/*
    522 * Target Logout Stats Table
    523 */
    524static struct iscsi_tiqn *iscsi_logout_stat_tiqn(struct config_item *item)
    525{
    526	struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
    527			struct iscsi_wwn_stat_grps, iscsi_logout_stats_group);
    528	return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
    529}
    530
    531static ssize_t iscsi_stat_logout_inst_show(struct config_item *item, char *page)
    532{
    533	return snprintf(page, PAGE_SIZE, "%u\n",
    534		iscsi_logout_stat_tiqn(item)->tiqn_index);
    535}
    536
    537static ssize_t iscsi_stat_logout_indx_show(struct config_item *item, char *page)
    538{
    539	return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
    540}
    541
    542static ssize_t iscsi_stat_logout_normal_logouts_show(struct config_item *item,
    543		char *page)
    544{
    545	struct iscsi_tiqn *tiqn = iscsi_logout_stat_tiqn(item);
    546	struct iscsi_logout_stats *lstats = &tiqn->logout_stats;
    547
    548	return snprintf(page, PAGE_SIZE, "%u\n", lstats->normal_logouts);
    549}
    550
    551static ssize_t iscsi_stat_logout_abnormal_logouts_show(struct config_item *item,
    552		char *page)
    553{
    554	struct iscsi_tiqn *tiqn = iscsi_logout_stat_tiqn(item);
    555	struct iscsi_logout_stats *lstats = &tiqn->logout_stats;
    556
    557	return snprintf(page, PAGE_SIZE, "%u\n", lstats->abnormal_logouts);
    558}
    559
    560CONFIGFS_ATTR_RO(iscsi_stat_logout_, inst);
    561CONFIGFS_ATTR_RO(iscsi_stat_logout_, indx);
    562CONFIGFS_ATTR_RO(iscsi_stat_logout_, normal_logouts);
    563CONFIGFS_ATTR_RO(iscsi_stat_logout_, abnormal_logouts);
    564
    565static struct configfs_attribute *iscsi_stat_logout_stats_attrs[] = {
    566	&iscsi_stat_logout_attr_inst,
    567	&iscsi_stat_logout_attr_indx,
    568	&iscsi_stat_logout_attr_normal_logouts,
    569	&iscsi_stat_logout_attr_abnormal_logouts,
    570	NULL,
    571};
    572
    573const struct config_item_type iscsi_stat_logout_cit = {
    574	.ct_attrs		= iscsi_stat_logout_stats_attrs,
    575	.ct_owner		= THIS_MODULE,
    576};
    577
    578/*
    579 * Session Stats Table
    580 */
    581static struct iscsi_node_acl *iscsi_stat_nacl(struct config_item *item)
    582{
    583	struct iscsi_node_stat_grps *igrps = container_of(to_config_group(item),
    584			struct iscsi_node_stat_grps, iscsi_sess_stats_group);
    585	return container_of(igrps, struct iscsi_node_acl, node_stat_grps);
    586}
    587
    588static ssize_t iscsi_stat_sess_inst_show(struct config_item *item, char *page)
    589{
    590	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    591	struct se_wwn *wwn = acl->se_node_acl.se_tpg->se_tpg_wwn;
    592	struct iscsi_tiqn *tiqn = container_of(wwn,
    593			struct iscsi_tiqn, tiqn_wwn);
    594
    595	return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
    596}
    597
    598static ssize_t iscsi_stat_sess_node_show(struct config_item *item, char *page)
    599{
    600	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    601	struct se_node_acl *se_nacl = &acl->se_node_acl;
    602	struct iscsit_session *sess;
    603	struct se_session *se_sess;
    604	ssize_t ret = 0;
    605
    606	spin_lock_bh(&se_nacl->nacl_sess_lock);
    607	se_sess = se_nacl->nacl_sess;
    608	if (se_sess) {
    609		sess = se_sess->fabric_sess_ptr;
    610		if (sess)
    611			ret = snprintf(page, PAGE_SIZE, "%u\n",
    612				sess->sess_ops->SessionType ? 0 : ISCSI_NODE_INDEX);
    613	}
    614	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    615
    616	return ret;
    617}
    618
    619static ssize_t iscsi_stat_sess_indx_show(struct config_item *item, char *page)
    620{
    621	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    622	struct se_node_acl *se_nacl = &acl->se_node_acl;
    623	struct iscsit_session *sess;
    624	struct se_session *se_sess;
    625	ssize_t ret = 0;
    626
    627	spin_lock_bh(&se_nacl->nacl_sess_lock);
    628	se_sess = se_nacl->nacl_sess;
    629	if (se_sess) {
    630		sess = se_sess->fabric_sess_ptr;
    631		if (sess)
    632			ret = snprintf(page, PAGE_SIZE, "%u\n",
    633					sess->session_index);
    634	}
    635	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    636
    637	return ret;
    638}
    639
    640static ssize_t iscsi_stat_sess_cmd_pdus_show(struct config_item *item,
    641		char *page)
    642{
    643	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    644	struct se_node_acl *se_nacl = &acl->se_node_acl;
    645	struct iscsit_session *sess;
    646	struct se_session *se_sess;
    647	ssize_t ret = 0;
    648
    649	spin_lock_bh(&se_nacl->nacl_sess_lock);
    650	se_sess = se_nacl->nacl_sess;
    651	if (se_sess) {
    652		sess = se_sess->fabric_sess_ptr;
    653		if (sess)
    654			ret = snprintf(page, PAGE_SIZE, "%lu\n",
    655				       atomic_long_read(&sess->cmd_pdus));
    656	}
    657	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    658
    659	return ret;
    660}
    661
    662static ssize_t iscsi_stat_sess_rsp_pdus_show(struct config_item *item,
    663		char *page)
    664{
    665	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    666	struct se_node_acl *se_nacl = &acl->se_node_acl;
    667	struct iscsit_session *sess;
    668	struct se_session *se_sess;
    669	ssize_t ret = 0;
    670
    671	spin_lock_bh(&se_nacl->nacl_sess_lock);
    672	se_sess = se_nacl->nacl_sess;
    673	if (se_sess) {
    674		sess = se_sess->fabric_sess_ptr;
    675		if (sess)
    676			ret = snprintf(page, PAGE_SIZE, "%lu\n",
    677				       atomic_long_read(&sess->rsp_pdus));
    678	}
    679	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    680
    681	return ret;
    682}
    683
    684static ssize_t iscsi_stat_sess_txdata_octs_show(struct config_item *item,
    685		char *page)
    686{
    687	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    688	struct se_node_acl *se_nacl = &acl->se_node_acl;
    689	struct iscsit_session *sess;
    690	struct se_session *se_sess;
    691	ssize_t ret = 0;
    692
    693	spin_lock_bh(&se_nacl->nacl_sess_lock);
    694	se_sess = se_nacl->nacl_sess;
    695	if (se_sess) {
    696		sess = se_sess->fabric_sess_ptr;
    697		if (sess)
    698			ret = snprintf(page, PAGE_SIZE, "%lu\n",
    699				       atomic_long_read(&sess->tx_data_octets));
    700	}
    701	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    702
    703	return ret;
    704}
    705
    706static ssize_t iscsi_stat_sess_rxdata_octs_show(struct config_item *item,
    707		char *page)
    708{
    709	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    710	struct se_node_acl *se_nacl = &acl->se_node_acl;
    711	struct iscsit_session *sess;
    712	struct se_session *se_sess;
    713	ssize_t ret = 0;
    714
    715	spin_lock_bh(&se_nacl->nacl_sess_lock);
    716	se_sess = se_nacl->nacl_sess;
    717	if (se_sess) {
    718		sess = se_sess->fabric_sess_ptr;
    719		if (sess)
    720			ret = snprintf(page, PAGE_SIZE, "%lu\n",
    721				       atomic_long_read(&sess->rx_data_octets));
    722	}
    723	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    724
    725	return ret;
    726}
    727
    728static ssize_t iscsi_stat_sess_conn_digest_errors_show(struct config_item *item,
    729		char *page)
    730{
    731	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    732	struct se_node_acl *se_nacl = &acl->se_node_acl;
    733	struct iscsit_session *sess;
    734	struct se_session *se_sess;
    735	ssize_t ret = 0;
    736
    737	spin_lock_bh(&se_nacl->nacl_sess_lock);
    738	se_sess = se_nacl->nacl_sess;
    739	if (se_sess) {
    740		sess = se_sess->fabric_sess_ptr;
    741		if (sess)
    742			ret = snprintf(page, PAGE_SIZE, "%lu\n",
    743				       atomic_long_read(&sess->conn_digest_errors));
    744	}
    745	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    746
    747	return ret;
    748}
    749
    750static ssize_t iscsi_stat_sess_conn_timeout_errors_show(
    751		struct config_item *item, char *page)
    752{
    753	struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
    754	struct se_node_acl *se_nacl = &acl->se_node_acl;
    755	struct iscsit_session *sess;
    756	struct se_session *se_sess;
    757	ssize_t ret = 0;
    758
    759	spin_lock_bh(&se_nacl->nacl_sess_lock);
    760	se_sess = se_nacl->nacl_sess;
    761	if (se_sess) {
    762		sess = se_sess->fabric_sess_ptr;
    763		if (sess)
    764			ret = snprintf(page, PAGE_SIZE, "%lu\n",
    765				       atomic_long_read(&sess->conn_timeout_errors));
    766	}
    767	spin_unlock_bh(&se_nacl->nacl_sess_lock);
    768
    769	return ret;
    770}
    771
    772CONFIGFS_ATTR_RO(iscsi_stat_sess_, inst);
    773CONFIGFS_ATTR_RO(iscsi_stat_sess_, node);
    774CONFIGFS_ATTR_RO(iscsi_stat_sess_, indx);
    775CONFIGFS_ATTR_RO(iscsi_stat_sess_, cmd_pdus);
    776CONFIGFS_ATTR_RO(iscsi_stat_sess_, rsp_pdus);
    777CONFIGFS_ATTR_RO(iscsi_stat_sess_, txdata_octs);
    778CONFIGFS_ATTR_RO(iscsi_stat_sess_, rxdata_octs);
    779CONFIGFS_ATTR_RO(iscsi_stat_sess_, conn_digest_errors);
    780CONFIGFS_ATTR_RO(iscsi_stat_sess_, conn_timeout_errors);
    781
    782static struct configfs_attribute *iscsi_stat_sess_stats_attrs[] = {
    783	&iscsi_stat_sess_attr_inst,
    784	&iscsi_stat_sess_attr_node,
    785	&iscsi_stat_sess_attr_indx,
    786	&iscsi_stat_sess_attr_cmd_pdus,
    787	&iscsi_stat_sess_attr_rsp_pdus,
    788	&iscsi_stat_sess_attr_txdata_octs,
    789	&iscsi_stat_sess_attr_rxdata_octs,
    790	&iscsi_stat_sess_attr_conn_digest_errors,
    791	&iscsi_stat_sess_attr_conn_timeout_errors,
    792	NULL,
    793};
    794
    795const struct config_item_type iscsi_stat_sess_cit = {
    796	.ct_attrs		= iscsi_stat_sess_stats_attrs,
    797	.ct_owner		= THIS_MODULE,
    798};