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