0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/configfs.h>
0013 #include <linux/export.h>
0014 #include <scsi/iscsi_proto.h>
0015 #include <target/target_core_base.h>
0016
0017 #include <target/iscsi/iscsi_target_core.h>
0018 #include "iscsi_target_parameters.h"
0019 #include "iscsi_target_device.h"
0020 #include "iscsi_target_tpg.h"
0021 #include "iscsi_target_util.h"
0022 #include <target/iscsi/iscsi_target_stat.h>
0023
0024 #ifndef INITIAL_JIFFIES
0025 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
0026 #endif
0027
0028
0029 #define ISCSI_INST_NUM_NODES 1
0030 #define ISCSI_INST_DESCR "Storage Engine Target"
0031 #define ISCSI_DISCONTINUITY_TIME 0
0032
0033 #define ISCSI_NODE_INDEX 1
0034
0035 #define ISPRINT(a) ((a >= ' ') && (a <= '~'))
0036
0037
0038
0039
0040
0041
0042
0043 static struct iscsi_tiqn *iscsi_instance_tiqn(struct config_item *item)
0044 {
0045 struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
0046 struct iscsi_wwn_stat_grps, iscsi_instance_group);
0047 return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
0048 }
0049
0050 static ssize_t iscsi_stat_instance_inst_show(struct config_item *item,
0051 char *page)
0052 {
0053 return snprintf(page, PAGE_SIZE, "%u\n",
0054 iscsi_instance_tiqn(item)->tiqn_index);
0055 }
0056
0057 static ssize_t iscsi_stat_instance_min_ver_show(struct config_item *item,
0058 char *page)
0059 {
0060 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DRAFT20_VERSION);
0061 }
0062
0063 static ssize_t iscsi_stat_instance_max_ver_show(struct config_item *item,
0064 char *page)
0065 {
0066 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DRAFT20_VERSION);
0067 }
0068
0069 static ssize_t iscsi_stat_instance_portals_show(struct config_item *item,
0070 char *page)
0071 {
0072 return snprintf(page, PAGE_SIZE, "%u\n",
0073 iscsi_instance_tiqn(item)->tiqn_num_tpg_nps);
0074 }
0075
0076 static ssize_t iscsi_stat_instance_nodes_show(struct config_item *item,
0077 char *page)
0078 {
0079 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_INST_NUM_NODES);
0080 }
0081
0082 static ssize_t iscsi_stat_instance_sessions_show(struct config_item *item,
0083 char *page)
0084 {
0085 return snprintf(page, PAGE_SIZE, "%u\n",
0086 iscsi_instance_tiqn(item)->tiqn_nsessions);
0087 }
0088
0089 static ssize_t iscsi_stat_instance_fail_sess_show(struct config_item *item,
0090 char *page)
0091 {
0092 struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
0093 struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
0094 u32 sess_err_count;
0095
0096 spin_lock_bh(&sess_err->lock);
0097 sess_err_count = (sess_err->digest_errors +
0098 sess_err->cxn_timeout_errors +
0099 sess_err->pdu_format_errors);
0100 spin_unlock_bh(&sess_err->lock);
0101
0102 return snprintf(page, PAGE_SIZE, "%u\n", sess_err_count);
0103 }
0104
0105 static ssize_t iscsi_stat_instance_fail_type_show(struct config_item *item,
0106 char *page)
0107 {
0108 struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
0109 struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
0110
0111 return snprintf(page, PAGE_SIZE, "%u\n",
0112 sess_err->last_sess_failure_type);
0113 }
0114
0115 static ssize_t iscsi_stat_instance_fail_rem_name_show(struct config_item *item,
0116 char *page)
0117 {
0118 struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
0119 struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
0120
0121 return snprintf(page, PAGE_SIZE, "%s\n",
0122 sess_err->last_sess_fail_rem_name[0] ?
0123 sess_err->last_sess_fail_rem_name : NONE);
0124 }
0125
0126 static ssize_t iscsi_stat_instance_disc_time_show(struct config_item *item,
0127 char *page)
0128 {
0129 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DISCONTINUITY_TIME);
0130 }
0131
0132 static ssize_t iscsi_stat_instance_description_show(struct config_item *item,
0133 char *page)
0134 {
0135 return snprintf(page, PAGE_SIZE, "%s\n", ISCSI_INST_DESCR);
0136 }
0137
0138 static ssize_t iscsi_stat_instance_vendor_show(struct config_item *item,
0139 char *page)
0140 {
0141 return snprintf(page, PAGE_SIZE, "Datera, Inc. iSCSI-Target\n");
0142 }
0143
0144 static ssize_t iscsi_stat_instance_version_show(struct config_item *item,
0145 char *page)
0146 {
0147 return snprintf(page, PAGE_SIZE, "%s\n", ISCSIT_VERSION);
0148 }
0149
0150 CONFIGFS_ATTR_RO(iscsi_stat_instance_, inst);
0151 CONFIGFS_ATTR_RO(iscsi_stat_instance_, min_ver);
0152 CONFIGFS_ATTR_RO(iscsi_stat_instance_, max_ver);
0153 CONFIGFS_ATTR_RO(iscsi_stat_instance_, portals);
0154 CONFIGFS_ATTR_RO(iscsi_stat_instance_, nodes);
0155 CONFIGFS_ATTR_RO(iscsi_stat_instance_, sessions);
0156 CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_sess);
0157 CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_type);
0158 CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_rem_name);
0159 CONFIGFS_ATTR_RO(iscsi_stat_instance_, disc_time);
0160 CONFIGFS_ATTR_RO(iscsi_stat_instance_, description);
0161 CONFIGFS_ATTR_RO(iscsi_stat_instance_, vendor);
0162 CONFIGFS_ATTR_RO(iscsi_stat_instance_, version);
0163
0164 static struct configfs_attribute *iscsi_stat_instance_attrs[] = {
0165 &iscsi_stat_instance_attr_inst,
0166 &iscsi_stat_instance_attr_min_ver,
0167 &iscsi_stat_instance_attr_max_ver,
0168 &iscsi_stat_instance_attr_portals,
0169 &iscsi_stat_instance_attr_nodes,
0170 &iscsi_stat_instance_attr_sessions,
0171 &iscsi_stat_instance_attr_fail_sess,
0172 &iscsi_stat_instance_attr_fail_type,
0173 &iscsi_stat_instance_attr_fail_rem_name,
0174 &iscsi_stat_instance_attr_disc_time,
0175 &iscsi_stat_instance_attr_description,
0176 &iscsi_stat_instance_attr_vendor,
0177 &iscsi_stat_instance_attr_version,
0178 NULL,
0179 };
0180
0181 const struct config_item_type iscsi_stat_instance_cit = {
0182 .ct_attrs = iscsi_stat_instance_attrs,
0183 .ct_owner = THIS_MODULE,
0184 };
0185
0186
0187
0188
0189 static struct iscsi_tiqn *iscsi_sess_err_tiqn(struct config_item *item)
0190 {
0191 struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
0192 struct iscsi_wwn_stat_grps, iscsi_sess_err_group);
0193 return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
0194 }
0195
0196 static ssize_t iscsi_stat_sess_err_inst_show(struct config_item *item,
0197 char *page)
0198 {
0199 return snprintf(page, PAGE_SIZE, "%u\n",
0200 iscsi_sess_err_tiqn(item)->tiqn_index);
0201 }
0202
0203 static ssize_t iscsi_stat_sess_err_digest_errors_show(struct config_item *item,
0204 char *page)
0205 {
0206 struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
0207 struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
0208
0209 return snprintf(page, PAGE_SIZE, "%u\n", sess_err->digest_errors);
0210 }
0211
0212 static ssize_t iscsi_stat_sess_err_cxn_errors_show(struct config_item *item,
0213 char *page)
0214 {
0215 struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
0216 struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
0217
0218 return snprintf(page, PAGE_SIZE, "%u\n", sess_err->cxn_timeout_errors);
0219 }
0220
0221 static ssize_t iscsi_stat_sess_err_format_errors_show(struct config_item *item,
0222 char *page)
0223 {
0224 struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
0225 struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
0226
0227 return snprintf(page, PAGE_SIZE, "%u\n", sess_err->pdu_format_errors);
0228 }
0229
0230 CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, inst);
0231 CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, digest_errors);
0232 CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, cxn_errors);
0233 CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, format_errors);
0234
0235 static struct configfs_attribute *iscsi_stat_sess_err_attrs[] = {
0236 &iscsi_stat_sess_err_attr_inst,
0237 &iscsi_stat_sess_err_attr_digest_errors,
0238 &iscsi_stat_sess_err_attr_cxn_errors,
0239 &iscsi_stat_sess_err_attr_format_errors,
0240 NULL,
0241 };
0242
0243 const struct config_item_type iscsi_stat_sess_err_cit = {
0244 .ct_attrs = iscsi_stat_sess_err_attrs,
0245 .ct_owner = THIS_MODULE,
0246 };
0247
0248
0249
0250
0251 static struct iscsi_tiqn *iscsi_tgt_attr_tiqn(struct config_item *item)
0252 {
0253 struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
0254 struct iscsi_wwn_stat_grps, iscsi_tgt_attr_group);
0255 return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
0256 }
0257
0258 static ssize_t iscsi_stat_tgt_attr_inst_show(struct config_item *item,
0259 char *page)
0260 {
0261 return snprintf(page, PAGE_SIZE, "%u\n",
0262 iscsi_tgt_attr_tiqn(item)->tiqn_index);
0263 }
0264
0265 static ssize_t iscsi_stat_tgt_attr_indx_show(struct config_item *item,
0266 char *page)
0267 {
0268 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
0269 }
0270
0271 static ssize_t iscsi_stat_tgt_attr_login_fails_show(struct config_item *item,
0272 char *page)
0273 {
0274 struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
0275 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0276 u32 fail_count;
0277
0278 spin_lock(&lstat->lock);
0279 fail_count = (lstat->redirects + lstat->authorize_fails +
0280 lstat->authenticate_fails + lstat->negotiate_fails +
0281 lstat->other_fails);
0282 spin_unlock(&lstat->lock);
0283
0284 return snprintf(page, PAGE_SIZE, "%u\n", fail_count);
0285 }
0286
0287 static ssize_t iscsi_stat_tgt_attr_last_fail_time_show(struct config_item *item,
0288 char *page)
0289 {
0290 struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
0291 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0292 u32 last_fail_time;
0293
0294 spin_lock(&lstat->lock);
0295 last_fail_time = lstat->last_fail_time ?
0296 (u32)(((u32)lstat->last_fail_time -
0297 INITIAL_JIFFIES) * 100 / HZ) : 0;
0298 spin_unlock(&lstat->lock);
0299
0300 return snprintf(page, PAGE_SIZE, "%u\n", last_fail_time);
0301 }
0302
0303 static ssize_t iscsi_stat_tgt_attr_last_fail_type_show(struct config_item *item,
0304 char *page)
0305 {
0306 struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
0307 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0308 u32 last_fail_type;
0309
0310 spin_lock(&lstat->lock);
0311 last_fail_type = lstat->last_fail_type;
0312 spin_unlock(&lstat->lock);
0313
0314 return snprintf(page, PAGE_SIZE, "%u\n", last_fail_type);
0315 }
0316
0317 static ssize_t iscsi_stat_tgt_attr_fail_intr_name_show(struct config_item *item,
0318 char *page)
0319 {
0320 struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
0321 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0322 unsigned char buf[ISCSI_IQN_LEN];
0323
0324 spin_lock(&lstat->lock);
0325 snprintf(buf, ISCSI_IQN_LEN, "%s", lstat->last_intr_fail_name[0] ?
0326 lstat->last_intr_fail_name : NONE);
0327 spin_unlock(&lstat->lock);
0328
0329 return snprintf(page, PAGE_SIZE, "%s\n", buf);
0330 }
0331
0332 static ssize_t iscsi_stat_tgt_attr_fail_intr_addr_type_show(struct config_item *item,
0333 char *page)
0334 {
0335 struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
0336 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0337 int ret;
0338
0339 spin_lock(&lstat->lock);
0340 if (lstat->last_intr_fail_ip_family == AF_INET6)
0341 ret = snprintf(page, PAGE_SIZE, "ipv6\n");
0342 else
0343 ret = snprintf(page, PAGE_SIZE, "ipv4\n");
0344 spin_unlock(&lstat->lock);
0345
0346 return ret;
0347 }
0348
0349 static ssize_t iscsi_stat_tgt_attr_fail_intr_addr_show(struct config_item *item,
0350 char *page)
0351 {
0352 struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
0353 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0354 int ret;
0355
0356 spin_lock(&lstat->lock);
0357 ret = snprintf(page, PAGE_SIZE, "%pISc\n", &lstat->last_intr_fail_sockaddr);
0358 spin_unlock(&lstat->lock);
0359
0360 return ret;
0361 }
0362
0363 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, inst);
0364 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, indx);
0365 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, login_fails);
0366 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, last_fail_time);
0367 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, last_fail_type);
0368 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_name);
0369 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_addr_type);
0370 CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_addr);
0371
0372 static struct configfs_attribute *iscsi_stat_tgt_attr_attrs[] = {
0373 &iscsi_stat_tgt_attr_attr_inst,
0374 &iscsi_stat_tgt_attr_attr_indx,
0375 &iscsi_stat_tgt_attr_attr_login_fails,
0376 &iscsi_stat_tgt_attr_attr_last_fail_time,
0377 &iscsi_stat_tgt_attr_attr_last_fail_type,
0378 &iscsi_stat_tgt_attr_attr_fail_intr_name,
0379 &iscsi_stat_tgt_attr_attr_fail_intr_addr_type,
0380 &iscsi_stat_tgt_attr_attr_fail_intr_addr,
0381 NULL,
0382 };
0383
0384 const struct config_item_type iscsi_stat_tgt_attr_cit = {
0385 .ct_attrs = iscsi_stat_tgt_attr_attrs,
0386 .ct_owner = THIS_MODULE,
0387 };
0388
0389
0390
0391
0392 static struct iscsi_tiqn *iscsi_login_stat_tiqn(struct config_item *item)
0393 {
0394 struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
0395 struct iscsi_wwn_stat_grps, iscsi_login_stats_group);
0396 return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
0397 }
0398
0399 static ssize_t iscsi_stat_login_inst_show(struct config_item *item, char *page)
0400 {
0401 return snprintf(page, PAGE_SIZE, "%u\n",
0402 iscsi_login_stat_tiqn(item)->tiqn_index);
0403 }
0404
0405 static ssize_t iscsi_stat_login_indx_show(struct config_item *item,
0406 char *page)
0407 {
0408 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
0409 }
0410
0411 static ssize_t iscsi_stat_login_accepts_show(struct config_item *item,
0412 char *page)
0413 {
0414 struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
0415 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0416 ssize_t ret;
0417
0418 spin_lock(&lstat->lock);
0419 ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->accepts);
0420 spin_unlock(&lstat->lock);
0421
0422 return ret;
0423 }
0424
0425 static ssize_t iscsi_stat_login_other_fails_show(struct config_item *item,
0426 char *page)
0427 {
0428 struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
0429 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0430 ssize_t ret;
0431
0432 spin_lock(&lstat->lock);
0433 ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->other_fails);
0434 spin_unlock(&lstat->lock);
0435
0436 return ret;
0437 }
0438
0439 static ssize_t iscsi_stat_login_redirects_show(struct config_item *item,
0440 char *page)
0441 {
0442 struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
0443 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0444 ssize_t ret;
0445
0446 spin_lock(&lstat->lock);
0447 ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->redirects);
0448 spin_unlock(&lstat->lock);
0449
0450 return ret;
0451 }
0452
0453 static ssize_t iscsi_stat_login_authorize_fails_show(struct config_item *item,
0454 char *page)
0455 {
0456 struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
0457 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0458 ssize_t ret;
0459
0460 spin_lock(&lstat->lock);
0461 ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->authorize_fails);
0462 spin_unlock(&lstat->lock);
0463
0464 return ret;
0465 }
0466
0467 static ssize_t iscsi_stat_login_authenticate_fails_show(
0468 struct config_item *item, char *page)
0469 {
0470 struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
0471 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0472 ssize_t ret;
0473
0474 spin_lock(&lstat->lock);
0475 ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->authenticate_fails);
0476 spin_unlock(&lstat->lock);
0477
0478 return ret;
0479 }
0480
0481 static ssize_t iscsi_stat_login_negotiate_fails_show(struct config_item *item,
0482 char *page)
0483 {
0484 struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
0485 struct iscsi_login_stats *lstat = &tiqn->login_stats;
0486 ssize_t ret;
0487
0488 spin_lock(&lstat->lock);
0489 ret = snprintf(page, PAGE_SIZE, "%u\n", lstat->negotiate_fails);
0490 spin_unlock(&lstat->lock);
0491
0492 return ret;
0493 }
0494
0495 CONFIGFS_ATTR_RO(iscsi_stat_login_, inst);
0496 CONFIGFS_ATTR_RO(iscsi_stat_login_, indx);
0497 CONFIGFS_ATTR_RO(iscsi_stat_login_, accepts);
0498 CONFIGFS_ATTR_RO(iscsi_stat_login_, other_fails);
0499 CONFIGFS_ATTR_RO(iscsi_stat_login_, redirects);
0500 CONFIGFS_ATTR_RO(iscsi_stat_login_, authorize_fails);
0501 CONFIGFS_ATTR_RO(iscsi_stat_login_, authenticate_fails);
0502 CONFIGFS_ATTR_RO(iscsi_stat_login_, negotiate_fails);
0503
0504 static struct configfs_attribute *iscsi_stat_login_stats_attrs[] = {
0505 &iscsi_stat_login_attr_inst,
0506 &iscsi_stat_login_attr_indx,
0507 &iscsi_stat_login_attr_accepts,
0508 &iscsi_stat_login_attr_other_fails,
0509 &iscsi_stat_login_attr_redirects,
0510 &iscsi_stat_login_attr_authorize_fails,
0511 &iscsi_stat_login_attr_authenticate_fails,
0512 &iscsi_stat_login_attr_negotiate_fails,
0513 NULL,
0514 };
0515
0516 const struct config_item_type iscsi_stat_login_cit = {
0517 .ct_attrs = iscsi_stat_login_stats_attrs,
0518 .ct_owner = THIS_MODULE,
0519 };
0520
0521
0522
0523
0524 static struct iscsi_tiqn *iscsi_logout_stat_tiqn(struct config_item *item)
0525 {
0526 struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
0527 struct iscsi_wwn_stat_grps, iscsi_logout_stats_group);
0528 return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
0529 }
0530
0531 static ssize_t iscsi_stat_logout_inst_show(struct config_item *item, char *page)
0532 {
0533 return snprintf(page, PAGE_SIZE, "%u\n",
0534 iscsi_logout_stat_tiqn(item)->tiqn_index);
0535 }
0536
0537 static ssize_t iscsi_stat_logout_indx_show(struct config_item *item, char *page)
0538 {
0539 return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
0540 }
0541
0542 static ssize_t iscsi_stat_logout_normal_logouts_show(struct config_item *item,
0543 char *page)
0544 {
0545 struct iscsi_tiqn *tiqn = iscsi_logout_stat_tiqn(item);
0546 struct iscsi_logout_stats *lstats = &tiqn->logout_stats;
0547
0548 return snprintf(page, PAGE_SIZE, "%u\n", lstats->normal_logouts);
0549 }
0550
0551 static ssize_t iscsi_stat_logout_abnormal_logouts_show(struct config_item *item,
0552 char *page)
0553 {
0554 struct iscsi_tiqn *tiqn = iscsi_logout_stat_tiqn(item);
0555 struct iscsi_logout_stats *lstats = &tiqn->logout_stats;
0556
0557 return snprintf(page, PAGE_SIZE, "%u\n", lstats->abnormal_logouts);
0558 }
0559
0560 CONFIGFS_ATTR_RO(iscsi_stat_logout_, inst);
0561 CONFIGFS_ATTR_RO(iscsi_stat_logout_, indx);
0562 CONFIGFS_ATTR_RO(iscsi_stat_logout_, normal_logouts);
0563 CONFIGFS_ATTR_RO(iscsi_stat_logout_, abnormal_logouts);
0564
0565 static struct configfs_attribute *iscsi_stat_logout_stats_attrs[] = {
0566 &iscsi_stat_logout_attr_inst,
0567 &iscsi_stat_logout_attr_indx,
0568 &iscsi_stat_logout_attr_normal_logouts,
0569 &iscsi_stat_logout_attr_abnormal_logouts,
0570 NULL,
0571 };
0572
0573 const struct config_item_type iscsi_stat_logout_cit = {
0574 .ct_attrs = iscsi_stat_logout_stats_attrs,
0575 .ct_owner = THIS_MODULE,
0576 };
0577
0578
0579
0580
0581 static struct iscsi_node_acl *iscsi_stat_nacl(struct config_item *item)
0582 {
0583 struct iscsi_node_stat_grps *igrps = container_of(to_config_group(item),
0584 struct iscsi_node_stat_grps, iscsi_sess_stats_group);
0585 return container_of(igrps, struct iscsi_node_acl, node_stat_grps);
0586 }
0587
0588 static ssize_t iscsi_stat_sess_inst_show(struct config_item *item, char *page)
0589 {
0590 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0591 struct se_wwn *wwn = acl->se_node_acl.se_tpg->se_tpg_wwn;
0592 struct iscsi_tiqn *tiqn = container_of(wwn,
0593 struct iscsi_tiqn, tiqn_wwn);
0594
0595 return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
0596 }
0597
0598 static ssize_t iscsi_stat_sess_node_show(struct config_item *item, char *page)
0599 {
0600 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0601 struct se_node_acl *se_nacl = &acl->se_node_acl;
0602 struct iscsit_session *sess;
0603 struct se_session *se_sess;
0604 ssize_t ret = 0;
0605
0606 spin_lock_bh(&se_nacl->nacl_sess_lock);
0607 se_sess = se_nacl->nacl_sess;
0608 if (se_sess) {
0609 sess = se_sess->fabric_sess_ptr;
0610 if (sess)
0611 ret = snprintf(page, PAGE_SIZE, "%u\n",
0612 sess->sess_ops->SessionType ? 0 : ISCSI_NODE_INDEX);
0613 }
0614 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0615
0616 return ret;
0617 }
0618
0619 static ssize_t iscsi_stat_sess_indx_show(struct config_item *item, char *page)
0620 {
0621 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0622 struct se_node_acl *se_nacl = &acl->se_node_acl;
0623 struct iscsit_session *sess;
0624 struct se_session *se_sess;
0625 ssize_t ret = 0;
0626
0627 spin_lock_bh(&se_nacl->nacl_sess_lock);
0628 se_sess = se_nacl->nacl_sess;
0629 if (se_sess) {
0630 sess = se_sess->fabric_sess_ptr;
0631 if (sess)
0632 ret = snprintf(page, PAGE_SIZE, "%u\n",
0633 sess->session_index);
0634 }
0635 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0636
0637 return ret;
0638 }
0639
0640 static ssize_t iscsi_stat_sess_cmd_pdus_show(struct config_item *item,
0641 char *page)
0642 {
0643 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0644 struct se_node_acl *se_nacl = &acl->se_node_acl;
0645 struct iscsit_session *sess;
0646 struct se_session *se_sess;
0647 ssize_t ret = 0;
0648
0649 spin_lock_bh(&se_nacl->nacl_sess_lock);
0650 se_sess = se_nacl->nacl_sess;
0651 if (se_sess) {
0652 sess = se_sess->fabric_sess_ptr;
0653 if (sess)
0654 ret = snprintf(page, PAGE_SIZE, "%lu\n",
0655 atomic_long_read(&sess->cmd_pdus));
0656 }
0657 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0658
0659 return ret;
0660 }
0661
0662 static ssize_t iscsi_stat_sess_rsp_pdus_show(struct config_item *item,
0663 char *page)
0664 {
0665 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0666 struct se_node_acl *se_nacl = &acl->se_node_acl;
0667 struct iscsit_session *sess;
0668 struct se_session *se_sess;
0669 ssize_t ret = 0;
0670
0671 spin_lock_bh(&se_nacl->nacl_sess_lock);
0672 se_sess = se_nacl->nacl_sess;
0673 if (se_sess) {
0674 sess = se_sess->fabric_sess_ptr;
0675 if (sess)
0676 ret = snprintf(page, PAGE_SIZE, "%lu\n",
0677 atomic_long_read(&sess->rsp_pdus));
0678 }
0679 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0680
0681 return ret;
0682 }
0683
0684 static ssize_t iscsi_stat_sess_txdata_octs_show(struct config_item *item,
0685 char *page)
0686 {
0687 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0688 struct se_node_acl *se_nacl = &acl->se_node_acl;
0689 struct iscsit_session *sess;
0690 struct se_session *se_sess;
0691 ssize_t ret = 0;
0692
0693 spin_lock_bh(&se_nacl->nacl_sess_lock);
0694 se_sess = se_nacl->nacl_sess;
0695 if (se_sess) {
0696 sess = se_sess->fabric_sess_ptr;
0697 if (sess)
0698 ret = snprintf(page, PAGE_SIZE, "%lu\n",
0699 atomic_long_read(&sess->tx_data_octets));
0700 }
0701 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0702
0703 return ret;
0704 }
0705
0706 static ssize_t iscsi_stat_sess_rxdata_octs_show(struct config_item *item,
0707 char *page)
0708 {
0709 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0710 struct se_node_acl *se_nacl = &acl->se_node_acl;
0711 struct iscsit_session *sess;
0712 struct se_session *se_sess;
0713 ssize_t ret = 0;
0714
0715 spin_lock_bh(&se_nacl->nacl_sess_lock);
0716 se_sess = se_nacl->nacl_sess;
0717 if (se_sess) {
0718 sess = se_sess->fabric_sess_ptr;
0719 if (sess)
0720 ret = snprintf(page, PAGE_SIZE, "%lu\n",
0721 atomic_long_read(&sess->rx_data_octets));
0722 }
0723 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0724
0725 return ret;
0726 }
0727
0728 static ssize_t iscsi_stat_sess_conn_digest_errors_show(struct config_item *item,
0729 char *page)
0730 {
0731 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0732 struct se_node_acl *se_nacl = &acl->se_node_acl;
0733 struct iscsit_session *sess;
0734 struct se_session *se_sess;
0735 ssize_t ret = 0;
0736
0737 spin_lock_bh(&se_nacl->nacl_sess_lock);
0738 se_sess = se_nacl->nacl_sess;
0739 if (se_sess) {
0740 sess = se_sess->fabric_sess_ptr;
0741 if (sess)
0742 ret = snprintf(page, PAGE_SIZE, "%lu\n",
0743 atomic_long_read(&sess->conn_digest_errors));
0744 }
0745 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0746
0747 return ret;
0748 }
0749
0750 static ssize_t iscsi_stat_sess_conn_timeout_errors_show(
0751 struct config_item *item, char *page)
0752 {
0753 struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
0754 struct se_node_acl *se_nacl = &acl->se_node_acl;
0755 struct iscsit_session *sess;
0756 struct se_session *se_sess;
0757 ssize_t ret = 0;
0758
0759 spin_lock_bh(&se_nacl->nacl_sess_lock);
0760 se_sess = se_nacl->nacl_sess;
0761 if (se_sess) {
0762 sess = se_sess->fabric_sess_ptr;
0763 if (sess)
0764 ret = snprintf(page, PAGE_SIZE, "%lu\n",
0765 atomic_long_read(&sess->conn_timeout_errors));
0766 }
0767 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0768
0769 return ret;
0770 }
0771
0772 CONFIGFS_ATTR_RO(iscsi_stat_sess_, inst);
0773 CONFIGFS_ATTR_RO(iscsi_stat_sess_, node);
0774 CONFIGFS_ATTR_RO(iscsi_stat_sess_, indx);
0775 CONFIGFS_ATTR_RO(iscsi_stat_sess_, cmd_pdus);
0776 CONFIGFS_ATTR_RO(iscsi_stat_sess_, rsp_pdus);
0777 CONFIGFS_ATTR_RO(iscsi_stat_sess_, txdata_octs);
0778 CONFIGFS_ATTR_RO(iscsi_stat_sess_, rxdata_octs);
0779 CONFIGFS_ATTR_RO(iscsi_stat_sess_, conn_digest_errors);
0780 CONFIGFS_ATTR_RO(iscsi_stat_sess_, conn_timeout_errors);
0781
0782 static struct configfs_attribute *iscsi_stat_sess_stats_attrs[] = {
0783 &iscsi_stat_sess_attr_inst,
0784 &iscsi_stat_sess_attr_node,
0785 &iscsi_stat_sess_attr_indx,
0786 &iscsi_stat_sess_attr_cmd_pdus,
0787 &iscsi_stat_sess_attr_rsp_pdus,
0788 &iscsi_stat_sess_attr_txdata_octs,
0789 &iscsi_stat_sess_attr_rxdata_octs,
0790 &iscsi_stat_sess_attr_conn_digest_errors,
0791 &iscsi_stat_sess_attr_conn_timeout_errors,
0792 NULL,
0793 };
0794
0795 const struct config_item_type iscsi_stat_sess_cit = {
0796 .ct_attrs = iscsi_stat_sess_stats_attrs,
0797 .ct_owner = THIS_MODULE,
0798 };