iscsi_target_stat.c 23 KB

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