iscsi_target_stat.c 23 KB

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