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