target_core_stat.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402
  1. /*******************************************************************************
  2. * Filename: target_core_stat.c
  3. *
  4. * Modern ConfigFS group context specific statistics based on original
  5. * target_core_mib.c code
  6. *
  7. * (c) Copyright 2006-2013 Datera, Inc.
  8. *
  9. * Nicholas A. Bellinger <nab@linux-iscsi.org>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24. *
  25. ******************************************************************************/
  26. #include <linux/kernel.h>
  27. #include <linux/module.h>
  28. #include <linux/delay.h>
  29. #include <linux/timer.h>
  30. #include <linux/string.h>
  31. #include <linux/utsname.h>
  32. #include <linux/proc_fs.h>
  33. #include <linux/seq_file.h>
  34. #include <linux/configfs.h>
  35. #include <target/target_core_base.h>
  36. #include <target/target_core_backend.h>
  37. #include <target/target_core_fabric.h>
  38. #include "target_core_internal.h"
  39. #ifndef INITIAL_JIFFIES
  40. #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
  41. #endif
  42. #define NONE "None"
  43. #define ISPRINT(a) ((a >= ' ') && (a <= '~'))
  44. #define SCSI_LU_INDEX 1
  45. #define LU_COUNT 1
  46. /*
  47. * SCSI Device Table
  48. */
  49. static struct se_device *to_stat_dev(struct config_item *item)
  50. {
  51. struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
  52. struct se_dev_stat_grps, scsi_dev_group);
  53. return container_of(sgrps, struct se_device, dev_stat_grps);
  54. }
  55. static ssize_t target_stat_inst_show(struct config_item *item, char *page)
  56. {
  57. struct se_hba *hba = to_stat_dev(item)->se_hba;
  58. return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  59. }
  60. static ssize_t target_stat_indx_show(struct config_item *item, char *page)
  61. {
  62. return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->dev_index);
  63. }
  64. static ssize_t target_stat_role_show(struct config_item *item, char *page)
  65. {
  66. return snprintf(page, PAGE_SIZE, "Target\n");
  67. }
  68. static ssize_t target_stat_ports_show(struct config_item *item, char *page)
  69. {
  70. return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->export_count);
  71. }
  72. CONFIGFS_ATTR_RO(target_stat_, inst);
  73. CONFIGFS_ATTR_RO(target_stat_, indx);
  74. CONFIGFS_ATTR_RO(target_stat_, role);
  75. CONFIGFS_ATTR_RO(target_stat_, ports);
  76. static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
  77. &target_stat_attr_inst,
  78. &target_stat_attr_indx,
  79. &target_stat_attr_role,
  80. &target_stat_attr_ports,
  81. NULL,
  82. };
  83. static struct config_item_type target_stat_scsi_dev_cit = {
  84. .ct_attrs = target_stat_scsi_dev_attrs,
  85. .ct_owner = THIS_MODULE,
  86. };
  87. /*
  88. * SCSI Target Device Table
  89. */
  90. static struct se_device *to_stat_tgt_dev(struct config_item *item)
  91. {
  92. struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
  93. struct se_dev_stat_grps, scsi_tgt_dev_group);
  94. return container_of(sgrps, struct se_device, dev_stat_grps);
  95. }
  96. static ssize_t target_stat_tgt_inst_show(struct config_item *item, char *page)
  97. {
  98. struct se_hba *hba = to_stat_tgt_dev(item)->se_hba;
  99. return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  100. }
  101. static ssize_t target_stat_tgt_indx_show(struct config_item *item, char *page)
  102. {
  103. return snprintf(page, PAGE_SIZE, "%u\n", to_stat_tgt_dev(item)->dev_index);
  104. }
  105. static ssize_t target_stat_tgt_num_lus_show(struct config_item *item,
  106. char *page)
  107. {
  108. return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
  109. }
  110. static ssize_t target_stat_tgt_status_show(struct config_item *item,
  111. char *page)
  112. {
  113. if (to_stat_tgt_dev(item)->export_count)
  114. return snprintf(page, PAGE_SIZE, "activated");
  115. else
  116. return snprintf(page, PAGE_SIZE, "deactivated");
  117. }
  118. static ssize_t target_stat_tgt_non_access_lus_show(struct config_item *item,
  119. char *page)
  120. {
  121. int non_accessible_lus;
  122. if (to_stat_tgt_dev(item)->export_count)
  123. non_accessible_lus = 0;
  124. else
  125. non_accessible_lus = 1;
  126. return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
  127. }
  128. static ssize_t target_stat_tgt_resets_show(struct config_item *item,
  129. char *page)
  130. {
  131. return snprintf(page, PAGE_SIZE, "%lu\n",
  132. atomic_long_read(&to_stat_tgt_dev(item)->num_resets));
  133. }
  134. static ssize_t target_stat_tgt_aborts_complete_show(struct config_item *item,
  135. char *page)
  136. {
  137. return snprintf(page, PAGE_SIZE, "%lu\n",
  138. atomic_long_read(&to_stat_tgt_dev(item)->aborts_complete));
  139. }
  140. static ssize_t target_stat_tgt_aborts_no_task_show(struct config_item *item,
  141. char *page)
  142. {
  143. return snprintf(page, PAGE_SIZE, "%lu\n",
  144. atomic_long_read(&to_stat_tgt_dev(item)->aborts_no_task));
  145. }
  146. CONFIGFS_ATTR_RO(target_stat_tgt_, inst);
  147. CONFIGFS_ATTR_RO(target_stat_tgt_, indx);
  148. CONFIGFS_ATTR_RO(target_stat_tgt_, num_lus);
  149. CONFIGFS_ATTR_RO(target_stat_tgt_, status);
  150. CONFIGFS_ATTR_RO(target_stat_tgt_, non_access_lus);
  151. CONFIGFS_ATTR_RO(target_stat_tgt_, resets);
  152. CONFIGFS_ATTR_RO(target_stat_tgt_, aborts_complete);
  153. CONFIGFS_ATTR_RO(target_stat_tgt_, aborts_no_task);
  154. static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
  155. &target_stat_tgt_attr_inst,
  156. &target_stat_tgt_attr_indx,
  157. &target_stat_tgt_attr_num_lus,
  158. &target_stat_tgt_attr_status,
  159. &target_stat_tgt_attr_non_access_lus,
  160. &target_stat_tgt_attr_resets,
  161. &target_stat_tgt_attr_aborts_complete,
  162. &target_stat_tgt_attr_aborts_no_task,
  163. NULL,
  164. };
  165. static struct config_item_type target_stat_scsi_tgt_dev_cit = {
  166. .ct_attrs = target_stat_scsi_tgt_dev_attrs,
  167. .ct_owner = THIS_MODULE,
  168. };
  169. /*
  170. * SCSI Logical Unit Table
  171. */
  172. static struct se_device *to_stat_lu_dev(struct config_item *item)
  173. {
  174. struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
  175. struct se_dev_stat_grps, scsi_lu_group);
  176. return container_of(sgrps, struct se_device, dev_stat_grps);
  177. }
  178. static ssize_t target_stat_lu_inst_show(struct config_item *item, char *page)
  179. {
  180. struct se_hba *hba = to_stat_lu_dev(item)->se_hba;
  181. return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  182. }
  183. static ssize_t target_stat_lu_dev_show(struct config_item *item, char *page)
  184. {
  185. return snprintf(page, PAGE_SIZE, "%u\n",
  186. to_stat_lu_dev(item)->dev_index);
  187. }
  188. static ssize_t target_stat_lu_indx_show(struct config_item *item, char *page)
  189. {
  190. return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
  191. }
  192. static ssize_t target_stat_lu_lun_show(struct config_item *item, char *page)
  193. {
  194. /* FIXME: scsiLuDefaultLun */
  195. return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
  196. }
  197. static ssize_t target_stat_lu_lu_name_show(struct config_item *item, char *page)
  198. {
  199. struct se_device *dev = to_stat_lu_dev(item);
  200. /* scsiLuWwnName */
  201. return snprintf(page, PAGE_SIZE, "%s\n",
  202. (strlen(dev->t10_wwn.unit_serial)) ?
  203. dev->t10_wwn.unit_serial : "None");
  204. }
  205. static ssize_t target_stat_lu_vend_show(struct config_item *item, char *page)
  206. {
  207. struct se_device *dev = to_stat_lu_dev(item);
  208. int i;
  209. char str[sizeof(dev->t10_wwn.vendor)+1];
  210. /* scsiLuVendorId */
  211. for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
  212. str[i] = ISPRINT(dev->t10_wwn.vendor[i]) ?
  213. dev->t10_wwn.vendor[i] : ' ';
  214. str[i] = '\0';
  215. return snprintf(page, PAGE_SIZE, "%s\n", str);
  216. }
  217. static ssize_t target_stat_lu_prod_show(struct config_item *item, char *page)
  218. {
  219. struct se_device *dev = to_stat_lu_dev(item);
  220. int i;
  221. char str[sizeof(dev->t10_wwn.model)+1];
  222. /* scsiLuProductId */
  223. for (i = 0; i < sizeof(dev->t10_wwn.model); i++)
  224. str[i] = ISPRINT(dev->t10_wwn.model[i]) ?
  225. dev->t10_wwn.model[i] : ' ';
  226. str[i] = '\0';
  227. return snprintf(page, PAGE_SIZE, "%s\n", str);
  228. }
  229. static ssize_t target_stat_lu_rev_show(struct config_item *item, char *page)
  230. {
  231. struct se_device *dev = to_stat_lu_dev(item);
  232. int i;
  233. char str[sizeof(dev->t10_wwn.revision)+1];
  234. /* scsiLuRevisionId */
  235. for (i = 0; i < sizeof(dev->t10_wwn.revision); i++)
  236. str[i] = ISPRINT(dev->t10_wwn.revision[i]) ?
  237. dev->t10_wwn.revision[i] : ' ';
  238. str[i] = '\0';
  239. return snprintf(page, PAGE_SIZE, "%s\n", str);
  240. }
  241. static ssize_t target_stat_lu_dev_type_show(struct config_item *item, char *page)
  242. {
  243. struct se_device *dev = to_stat_lu_dev(item);
  244. /* scsiLuPeripheralType */
  245. return snprintf(page, PAGE_SIZE, "%u\n",
  246. dev->transport->get_device_type(dev));
  247. }
  248. static ssize_t target_stat_lu_status_show(struct config_item *item, char *page)
  249. {
  250. struct se_device *dev = to_stat_lu_dev(item);
  251. /* scsiLuStatus */
  252. return snprintf(page, PAGE_SIZE, "%s\n",
  253. (dev->export_count) ? "available" : "notavailable");
  254. }
  255. static ssize_t target_stat_lu_state_bit_show(struct config_item *item,
  256. char *page)
  257. {
  258. /* scsiLuState */
  259. return snprintf(page, PAGE_SIZE, "exposed\n");
  260. }
  261. static ssize_t target_stat_lu_num_cmds_show(struct config_item *item,
  262. char *page)
  263. {
  264. struct se_device *dev = to_stat_lu_dev(item);
  265. /* scsiLuNumCommands */
  266. return snprintf(page, PAGE_SIZE, "%lu\n",
  267. atomic_long_read(&dev->num_cmds));
  268. }
  269. static ssize_t target_stat_lu_read_mbytes_show(struct config_item *item,
  270. char *page)
  271. {
  272. struct se_device *dev = to_stat_lu_dev(item);
  273. /* scsiLuReadMegaBytes */
  274. return snprintf(page, PAGE_SIZE, "%lu\n",
  275. atomic_long_read(&dev->read_bytes) >> 20);
  276. }
  277. static ssize_t target_stat_lu_write_mbytes_show(struct config_item *item,
  278. char *page)
  279. {
  280. struct se_device *dev = to_stat_lu_dev(item);
  281. /* scsiLuWrittenMegaBytes */
  282. return snprintf(page, PAGE_SIZE, "%lu\n",
  283. atomic_long_read(&dev->write_bytes) >> 20);
  284. }
  285. static ssize_t target_stat_lu_resets_show(struct config_item *item, char *page)
  286. {
  287. struct se_device *dev = to_stat_lu_dev(item);
  288. /* scsiLuInResets */
  289. return snprintf(page, PAGE_SIZE, "%lu\n",
  290. atomic_long_read(&dev->num_resets));
  291. }
  292. static ssize_t target_stat_lu_full_stat_show(struct config_item *item,
  293. char *page)
  294. {
  295. /* FIXME: scsiLuOutTaskSetFullStatus */
  296. return snprintf(page, PAGE_SIZE, "%u\n", 0);
  297. }
  298. static ssize_t target_stat_lu_hs_num_cmds_show(struct config_item *item,
  299. char *page)
  300. {
  301. /* FIXME: scsiLuHSInCommands */
  302. return snprintf(page, PAGE_SIZE, "%u\n", 0);
  303. }
  304. static ssize_t target_stat_lu_creation_time_show(struct config_item *item,
  305. char *page)
  306. {
  307. struct se_device *dev = to_stat_lu_dev(item);
  308. /* scsiLuCreationTime */
  309. return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
  310. INITIAL_JIFFIES) * 100 / HZ));
  311. }
  312. CONFIGFS_ATTR_RO(target_stat_lu_, inst);
  313. CONFIGFS_ATTR_RO(target_stat_lu_, dev);
  314. CONFIGFS_ATTR_RO(target_stat_lu_, indx);
  315. CONFIGFS_ATTR_RO(target_stat_lu_, lun);
  316. CONFIGFS_ATTR_RO(target_stat_lu_, lu_name);
  317. CONFIGFS_ATTR_RO(target_stat_lu_, vend);
  318. CONFIGFS_ATTR_RO(target_stat_lu_, prod);
  319. CONFIGFS_ATTR_RO(target_stat_lu_, rev);
  320. CONFIGFS_ATTR_RO(target_stat_lu_, dev_type);
  321. CONFIGFS_ATTR_RO(target_stat_lu_, status);
  322. CONFIGFS_ATTR_RO(target_stat_lu_, state_bit);
  323. CONFIGFS_ATTR_RO(target_stat_lu_, num_cmds);
  324. CONFIGFS_ATTR_RO(target_stat_lu_, read_mbytes);
  325. CONFIGFS_ATTR_RO(target_stat_lu_, write_mbytes);
  326. CONFIGFS_ATTR_RO(target_stat_lu_, resets);
  327. CONFIGFS_ATTR_RO(target_stat_lu_, full_stat);
  328. CONFIGFS_ATTR_RO(target_stat_lu_, hs_num_cmds);
  329. CONFIGFS_ATTR_RO(target_stat_lu_, creation_time);
  330. static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
  331. &target_stat_lu_attr_inst,
  332. &target_stat_lu_attr_dev,
  333. &target_stat_lu_attr_indx,
  334. &target_stat_lu_attr_lun,
  335. &target_stat_lu_attr_lu_name,
  336. &target_stat_lu_attr_vend,
  337. &target_stat_lu_attr_prod,
  338. &target_stat_lu_attr_rev,
  339. &target_stat_lu_attr_dev_type,
  340. &target_stat_lu_attr_status,
  341. &target_stat_lu_attr_state_bit,
  342. &target_stat_lu_attr_num_cmds,
  343. &target_stat_lu_attr_read_mbytes,
  344. &target_stat_lu_attr_write_mbytes,
  345. &target_stat_lu_attr_resets,
  346. &target_stat_lu_attr_full_stat,
  347. &target_stat_lu_attr_hs_num_cmds,
  348. &target_stat_lu_attr_creation_time,
  349. NULL,
  350. };
  351. static struct config_item_type target_stat_scsi_lu_cit = {
  352. .ct_attrs = target_stat_scsi_lu_attrs,
  353. .ct_owner = THIS_MODULE,
  354. };
  355. /*
  356. * Called from target_core_configfs.c:target_core_make_subdev() to setup
  357. * the target statistics groups + configfs CITs located in target_core_stat.c
  358. */
  359. void target_stat_setup_dev_default_groups(struct se_device *dev)
  360. {
  361. config_group_init_type_name(&dev->dev_stat_grps.scsi_dev_group,
  362. "scsi_dev", &target_stat_scsi_dev_cit);
  363. configfs_add_default_group(&dev->dev_stat_grps.scsi_dev_group,
  364. &dev->dev_stat_grps.stat_group);
  365. config_group_init_type_name(&dev->dev_stat_grps.scsi_tgt_dev_group,
  366. "scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit);
  367. configfs_add_default_group(&dev->dev_stat_grps.scsi_tgt_dev_group,
  368. &dev->dev_stat_grps.stat_group);
  369. config_group_init_type_name(&dev->dev_stat_grps.scsi_lu_group,
  370. "scsi_lu", &target_stat_scsi_lu_cit);
  371. configfs_add_default_group(&dev->dev_stat_grps.scsi_lu_group,
  372. &dev->dev_stat_grps.stat_group);
  373. }
  374. /*
  375. * SCSI Port Table
  376. */
  377. static struct se_lun *to_stat_port(struct config_item *item)
  378. {
  379. struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
  380. struct se_port_stat_grps, scsi_port_group);
  381. return container_of(pgrps, struct se_lun, port_stat_grps);
  382. }
  383. static ssize_t target_stat_port_inst_show(struct config_item *item, char *page)
  384. {
  385. struct se_lun *lun = to_stat_port(item);
  386. struct se_device *dev;
  387. ssize_t ret = -ENODEV;
  388. rcu_read_lock();
  389. dev = rcu_dereference(lun->lun_se_dev);
  390. if (dev)
  391. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
  392. rcu_read_unlock();
  393. return ret;
  394. }
  395. static ssize_t target_stat_port_dev_show(struct config_item *item, char *page)
  396. {
  397. struct se_lun *lun = to_stat_port(item);
  398. struct se_device *dev;
  399. ssize_t ret = -ENODEV;
  400. rcu_read_lock();
  401. dev = rcu_dereference(lun->lun_se_dev);
  402. if (dev)
  403. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  404. rcu_read_unlock();
  405. return ret;
  406. }
  407. static ssize_t target_stat_port_indx_show(struct config_item *item, char *page)
  408. {
  409. struct se_lun *lun = to_stat_port(item);
  410. struct se_device *dev;
  411. ssize_t ret = -ENODEV;
  412. rcu_read_lock();
  413. dev = rcu_dereference(lun->lun_se_dev);
  414. if (dev)
  415. ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
  416. rcu_read_unlock();
  417. return ret;
  418. }
  419. static ssize_t target_stat_port_role_show(struct config_item *item, char *page)
  420. {
  421. struct se_lun *lun = to_stat_port(item);
  422. struct se_device *dev;
  423. ssize_t ret = -ENODEV;
  424. rcu_read_lock();
  425. dev = rcu_dereference(lun->lun_se_dev);
  426. if (dev)
  427. ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
  428. rcu_read_unlock();
  429. return ret;
  430. }
  431. static ssize_t target_stat_port_busy_count_show(struct config_item *item,
  432. char *page)
  433. {
  434. struct se_lun *lun = to_stat_port(item);
  435. struct se_device *dev;
  436. ssize_t ret = -ENODEV;
  437. rcu_read_lock();
  438. dev = rcu_dereference(lun->lun_se_dev);
  439. if (dev) {
  440. /* FIXME: scsiPortBusyStatuses */
  441. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  442. }
  443. rcu_read_unlock();
  444. return ret;
  445. }
  446. CONFIGFS_ATTR_RO(target_stat_port_, inst);
  447. CONFIGFS_ATTR_RO(target_stat_port_, dev);
  448. CONFIGFS_ATTR_RO(target_stat_port_, indx);
  449. CONFIGFS_ATTR_RO(target_stat_port_, role);
  450. CONFIGFS_ATTR_RO(target_stat_port_, busy_count);
  451. static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
  452. &target_stat_port_attr_inst,
  453. &target_stat_port_attr_dev,
  454. &target_stat_port_attr_indx,
  455. &target_stat_port_attr_role,
  456. &target_stat_port_attr_busy_count,
  457. NULL,
  458. };
  459. static struct config_item_type target_stat_scsi_port_cit = {
  460. .ct_attrs = target_stat_scsi_port_attrs,
  461. .ct_owner = THIS_MODULE,
  462. };
  463. /*
  464. * SCSI Target Port Table
  465. */
  466. static struct se_lun *to_stat_tgt_port(struct config_item *item)
  467. {
  468. struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
  469. struct se_port_stat_grps, scsi_tgt_port_group);
  470. return container_of(pgrps, struct se_lun, port_stat_grps);
  471. }
  472. static ssize_t target_stat_tgt_port_inst_show(struct config_item *item,
  473. char *page)
  474. {
  475. struct se_lun *lun = to_stat_tgt_port(item);
  476. struct se_device *dev;
  477. ssize_t ret = -ENODEV;
  478. rcu_read_lock();
  479. dev = rcu_dereference(lun->lun_se_dev);
  480. if (dev)
  481. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
  482. rcu_read_unlock();
  483. return ret;
  484. }
  485. static ssize_t target_stat_tgt_port_dev_show(struct config_item *item,
  486. char *page)
  487. {
  488. struct se_lun *lun = to_stat_tgt_port(item);
  489. struct se_device *dev;
  490. ssize_t ret = -ENODEV;
  491. rcu_read_lock();
  492. dev = rcu_dereference(lun->lun_se_dev);
  493. if (dev)
  494. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  495. rcu_read_unlock();
  496. return ret;
  497. }
  498. static ssize_t target_stat_tgt_port_indx_show(struct config_item *item,
  499. char *page)
  500. {
  501. struct se_lun *lun = to_stat_tgt_port(item);
  502. struct se_device *dev;
  503. ssize_t ret = -ENODEV;
  504. rcu_read_lock();
  505. dev = rcu_dereference(lun->lun_se_dev);
  506. if (dev)
  507. ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
  508. rcu_read_unlock();
  509. return ret;
  510. }
  511. static ssize_t target_stat_tgt_port_name_show(struct config_item *item,
  512. char *page)
  513. {
  514. struct se_lun *lun = to_stat_tgt_port(item);
  515. struct se_portal_group *tpg = lun->lun_tpg;
  516. struct se_device *dev;
  517. ssize_t ret = -ENODEV;
  518. rcu_read_lock();
  519. dev = rcu_dereference(lun->lun_se_dev);
  520. if (dev)
  521. ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
  522. tpg->se_tpg_tfo->get_fabric_name(),
  523. lun->lun_rtpi);
  524. rcu_read_unlock();
  525. return ret;
  526. }
  527. static ssize_t target_stat_tgt_port_port_index_show(struct config_item *item,
  528. char *page)
  529. {
  530. struct se_lun *lun = to_stat_tgt_port(item);
  531. struct se_portal_group *tpg = lun->lun_tpg;
  532. struct se_device *dev;
  533. ssize_t ret = -ENODEV;
  534. rcu_read_lock();
  535. dev = rcu_dereference(lun->lun_se_dev);
  536. if (dev)
  537. ret = snprintf(page, PAGE_SIZE, "%s%s%d\n",
  538. tpg->se_tpg_tfo->tpg_get_wwn(tpg), "+t+",
  539. tpg->se_tpg_tfo->tpg_get_tag(tpg));
  540. rcu_read_unlock();
  541. return ret;
  542. }
  543. static ssize_t target_stat_tgt_port_in_cmds_show(struct config_item *item,
  544. char *page)
  545. {
  546. struct se_lun *lun = to_stat_tgt_port(item);
  547. struct se_device *dev;
  548. ssize_t ret = -ENODEV;
  549. rcu_read_lock();
  550. dev = rcu_dereference(lun->lun_se_dev);
  551. if (dev)
  552. ret = snprintf(page, PAGE_SIZE, "%lu\n",
  553. atomic_long_read(&lun->lun_stats.cmd_pdus));
  554. rcu_read_unlock();
  555. return ret;
  556. }
  557. static ssize_t target_stat_tgt_port_write_mbytes_show(struct config_item *item,
  558. char *page)
  559. {
  560. struct se_lun *lun = to_stat_tgt_port(item);
  561. struct se_device *dev;
  562. ssize_t ret = -ENODEV;
  563. rcu_read_lock();
  564. dev = rcu_dereference(lun->lun_se_dev);
  565. if (dev)
  566. ret = snprintf(page, PAGE_SIZE, "%u\n",
  567. (u32)(atomic_long_read(&lun->lun_stats.rx_data_octets) >> 20));
  568. rcu_read_unlock();
  569. return ret;
  570. }
  571. static ssize_t target_stat_tgt_port_read_mbytes_show(struct config_item *item,
  572. char *page)
  573. {
  574. struct se_lun *lun = to_stat_tgt_port(item);
  575. struct se_device *dev;
  576. ssize_t ret = -ENODEV;
  577. rcu_read_lock();
  578. dev = rcu_dereference(lun->lun_se_dev);
  579. if (dev)
  580. ret = snprintf(page, PAGE_SIZE, "%u\n",
  581. (u32)(atomic_long_read(&lun->lun_stats.tx_data_octets) >> 20));
  582. rcu_read_unlock();
  583. return ret;
  584. }
  585. static ssize_t target_stat_tgt_port_hs_in_cmds_show(struct config_item *item,
  586. char *page)
  587. {
  588. struct se_lun *lun = to_stat_tgt_port(item);
  589. struct se_device *dev;
  590. ssize_t ret = -ENODEV;
  591. rcu_read_lock();
  592. dev = rcu_dereference(lun->lun_se_dev);
  593. if (dev) {
  594. /* FIXME: scsiTgtPortHsInCommands */
  595. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  596. }
  597. rcu_read_unlock();
  598. return ret;
  599. }
  600. CONFIGFS_ATTR_RO(target_stat_tgt_port_, inst);
  601. CONFIGFS_ATTR_RO(target_stat_tgt_port_, dev);
  602. CONFIGFS_ATTR_RO(target_stat_tgt_port_, indx);
  603. CONFIGFS_ATTR_RO(target_stat_tgt_port_, name);
  604. CONFIGFS_ATTR_RO(target_stat_tgt_port_, port_index);
  605. CONFIGFS_ATTR_RO(target_stat_tgt_port_, in_cmds);
  606. CONFIGFS_ATTR_RO(target_stat_tgt_port_, write_mbytes);
  607. CONFIGFS_ATTR_RO(target_stat_tgt_port_, read_mbytes);
  608. CONFIGFS_ATTR_RO(target_stat_tgt_port_, hs_in_cmds);
  609. static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
  610. &target_stat_tgt_port_attr_inst,
  611. &target_stat_tgt_port_attr_dev,
  612. &target_stat_tgt_port_attr_indx,
  613. &target_stat_tgt_port_attr_name,
  614. &target_stat_tgt_port_attr_port_index,
  615. &target_stat_tgt_port_attr_in_cmds,
  616. &target_stat_tgt_port_attr_write_mbytes,
  617. &target_stat_tgt_port_attr_read_mbytes,
  618. &target_stat_tgt_port_attr_hs_in_cmds,
  619. NULL,
  620. };
  621. static struct config_item_type target_stat_scsi_tgt_port_cit = {
  622. .ct_attrs = target_stat_scsi_tgt_port_attrs,
  623. .ct_owner = THIS_MODULE,
  624. };
  625. /*
  626. * SCSI Transport Table
  627. */
  628. static struct se_lun *to_transport_stat(struct config_item *item)
  629. {
  630. struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
  631. struct se_port_stat_grps, scsi_transport_group);
  632. return container_of(pgrps, struct se_lun, port_stat_grps);
  633. }
  634. static ssize_t target_stat_transport_inst_show(struct config_item *item,
  635. char *page)
  636. {
  637. struct se_lun *lun = to_transport_stat(item);
  638. struct se_device *dev;
  639. ssize_t ret = -ENODEV;
  640. rcu_read_lock();
  641. dev = rcu_dereference(lun->lun_se_dev);
  642. if (dev)
  643. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->hba_index);
  644. rcu_read_unlock();
  645. return ret;
  646. }
  647. static ssize_t target_stat_transport_device_show(struct config_item *item,
  648. char *page)
  649. {
  650. struct se_lun *lun = to_transport_stat(item);
  651. struct se_device *dev;
  652. struct se_portal_group *tpg = lun->lun_tpg;
  653. ssize_t ret = -ENODEV;
  654. rcu_read_lock();
  655. dev = rcu_dereference(lun->lun_se_dev);
  656. if (dev) {
  657. /* scsiTransportType */
  658. ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
  659. tpg->se_tpg_tfo->get_fabric_name());
  660. }
  661. rcu_read_unlock();
  662. return ret;
  663. }
  664. static ssize_t target_stat_transport_indx_show(struct config_item *item,
  665. char *page)
  666. {
  667. struct se_lun *lun = to_transport_stat(item);
  668. struct se_device *dev;
  669. struct se_portal_group *tpg = lun->lun_tpg;
  670. ssize_t ret = -ENODEV;
  671. rcu_read_lock();
  672. dev = rcu_dereference(lun->lun_se_dev);
  673. if (dev)
  674. ret = snprintf(page, PAGE_SIZE, "%u\n",
  675. tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
  676. rcu_read_unlock();
  677. return ret;
  678. }
  679. static ssize_t target_stat_transport_dev_name_show(struct config_item *item,
  680. char *page)
  681. {
  682. struct se_lun *lun = to_transport_stat(item);
  683. struct se_device *dev;
  684. struct se_portal_group *tpg = lun->lun_tpg;
  685. struct t10_wwn *wwn;
  686. ssize_t ret = -ENODEV;
  687. rcu_read_lock();
  688. dev = rcu_dereference(lun->lun_se_dev);
  689. if (dev) {
  690. wwn = &dev->t10_wwn;
  691. /* scsiTransportDevName */
  692. ret = snprintf(page, PAGE_SIZE, "%s+%s\n",
  693. tpg->se_tpg_tfo->tpg_get_wwn(tpg),
  694. (strlen(wwn->unit_serial)) ? wwn->unit_serial :
  695. wwn->vendor);
  696. }
  697. rcu_read_unlock();
  698. return ret;
  699. }
  700. static ssize_t target_stat_transport_proto_id_show(struct config_item *item,
  701. char *page)
  702. {
  703. struct se_lun *lun = to_transport_stat(item);
  704. struct se_device *dev;
  705. struct se_portal_group *tpg = lun->lun_tpg;
  706. ssize_t ret = -ENODEV;
  707. rcu_read_lock();
  708. dev = rcu_dereference(lun->lun_se_dev);
  709. if (dev)
  710. ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->proto_id);
  711. rcu_read_unlock();
  712. return ret;
  713. }
  714. CONFIGFS_ATTR_RO(target_stat_transport_, inst);
  715. CONFIGFS_ATTR_RO(target_stat_transport_, device);
  716. CONFIGFS_ATTR_RO(target_stat_transport_, indx);
  717. CONFIGFS_ATTR_RO(target_stat_transport_, dev_name);
  718. CONFIGFS_ATTR_RO(target_stat_transport_, proto_id);
  719. static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
  720. &target_stat_transport_attr_inst,
  721. &target_stat_transport_attr_device,
  722. &target_stat_transport_attr_indx,
  723. &target_stat_transport_attr_dev_name,
  724. &target_stat_transport_attr_proto_id,
  725. NULL,
  726. };
  727. static struct config_item_type target_stat_scsi_transport_cit = {
  728. .ct_attrs = target_stat_scsi_transport_attrs,
  729. .ct_owner = THIS_MODULE,
  730. };
  731. /*
  732. * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
  733. * the target port statistics groups + configfs CITs located in target_core_stat.c
  734. */
  735. void target_stat_setup_port_default_groups(struct se_lun *lun)
  736. {
  737. config_group_init_type_name(&lun->port_stat_grps.scsi_port_group,
  738. "scsi_port", &target_stat_scsi_port_cit);
  739. configfs_add_default_group(&lun->port_stat_grps.scsi_port_group,
  740. &lun->port_stat_grps.stat_group);
  741. config_group_init_type_name(&lun->port_stat_grps.scsi_tgt_port_group,
  742. "scsi_tgt_port", &target_stat_scsi_tgt_port_cit);
  743. configfs_add_default_group(&lun->port_stat_grps.scsi_tgt_port_group,
  744. &lun->port_stat_grps.stat_group);
  745. config_group_init_type_name(&lun->port_stat_grps.scsi_transport_group,
  746. "scsi_transport", &target_stat_scsi_transport_cit);
  747. configfs_add_default_group(&lun->port_stat_grps.scsi_transport_group,
  748. &lun->port_stat_grps.stat_group);
  749. }
  750. /*
  751. * SCSI Authorized Initiator Table
  752. */
  753. static struct se_lun_acl *auth_to_lacl(struct config_item *item)
  754. {
  755. struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
  756. struct se_ml_stat_grps, scsi_auth_intr_group);
  757. return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
  758. }
  759. static ssize_t target_stat_auth_inst_show(struct config_item *item,
  760. char *page)
  761. {
  762. struct se_lun_acl *lacl = auth_to_lacl(item);
  763. struct se_node_acl *nacl = lacl->se_lun_nacl;
  764. struct se_dev_entry *deve;
  765. struct se_portal_group *tpg;
  766. ssize_t ret;
  767. rcu_read_lock();
  768. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  769. if (!deve) {
  770. rcu_read_unlock();
  771. return -ENODEV;
  772. }
  773. tpg = nacl->se_tpg;
  774. /* scsiInstIndex */
  775. ret = snprintf(page, PAGE_SIZE, "%u\n",
  776. tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
  777. rcu_read_unlock();
  778. return ret;
  779. }
  780. static ssize_t target_stat_auth_dev_show(struct config_item *item,
  781. char *page)
  782. {
  783. struct se_lun_acl *lacl = auth_to_lacl(item);
  784. struct se_node_acl *nacl = lacl->se_lun_nacl;
  785. struct se_dev_entry *deve;
  786. struct se_lun *lun;
  787. ssize_t ret;
  788. rcu_read_lock();
  789. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  790. if (!deve) {
  791. rcu_read_unlock();
  792. return -ENODEV;
  793. }
  794. lun = rcu_dereference(deve->se_lun);
  795. /* scsiDeviceIndex */
  796. ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
  797. rcu_read_unlock();
  798. return ret;
  799. }
  800. static ssize_t target_stat_auth_port_show(struct config_item *item,
  801. char *page)
  802. {
  803. struct se_lun_acl *lacl = auth_to_lacl(item);
  804. struct se_node_acl *nacl = lacl->se_lun_nacl;
  805. struct se_dev_entry *deve;
  806. struct se_portal_group *tpg;
  807. ssize_t ret;
  808. rcu_read_lock();
  809. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  810. if (!deve) {
  811. rcu_read_unlock();
  812. return -ENODEV;
  813. }
  814. tpg = nacl->se_tpg;
  815. /* scsiAuthIntrTgtPortIndex */
  816. ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
  817. rcu_read_unlock();
  818. return ret;
  819. }
  820. static ssize_t target_stat_auth_indx_show(struct config_item *item,
  821. char *page)
  822. {
  823. struct se_lun_acl *lacl = auth_to_lacl(item);
  824. struct se_node_acl *nacl = lacl->se_lun_nacl;
  825. struct se_dev_entry *deve;
  826. ssize_t ret;
  827. rcu_read_lock();
  828. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  829. if (!deve) {
  830. rcu_read_unlock();
  831. return -ENODEV;
  832. }
  833. /* scsiAuthIntrIndex */
  834. ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
  835. rcu_read_unlock();
  836. return ret;
  837. }
  838. static ssize_t target_stat_auth_dev_or_port_show(struct config_item *item,
  839. char *page)
  840. {
  841. struct se_lun_acl *lacl = auth_to_lacl(item);
  842. struct se_node_acl *nacl = lacl->se_lun_nacl;
  843. struct se_dev_entry *deve;
  844. ssize_t ret;
  845. rcu_read_lock();
  846. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  847. if (!deve) {
  848. rcu_read_unlock();
  849. return -ENODEV;
  850. }
  851. /* scsiAuthIntrDevOrPort */
  852. ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
  853. rcu_read_unlock();
  854. return ret;
  855. }
  856. static ssize_t target_stat_auth_intr_name_show(struct config_item *item,
  857. char *page)
  858. {
  859. struct se_lun_acl *lacl = auth_to_lacl(item);
  860. struct se_node_acl *nacl = lacl->se_lun_nacl;
  861. struct se_dev_entry *deve;
  862. ssize_t ret;
  863. rcu_read_lock();
  864. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  865. if (!deve) {
  866. rcu_read_unlock();
  867. return -ENODEV;
  868. }
  869. /* scsiAuthIntrName */
  870. ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
  871. rcu_read_unlock();
  872. return ret;
  873. }
  874. static ssize_t target_stat_auth_map_indx_show(struct config_item *item,
  875. char *page)
  876. {
  877. struct se_lun_acl *lacl = auth_to_lacl(item);
  878. struct se_node_acl *nacl = lacl->se_lun_nacl;
  879. struct se_dev_entry *deve;
  880. ssize_t ret;
  881. rcu_read_lock();
  882. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  883. if (!deve) {
  884. rcu_read_unlock();
  885. return -ENODEV;
  886. }
  887. /* FIXME: scsiAuthIntrLunMapIndex */
  888. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  889. rcu_read_unlock();
  890. return ret;
  891. }
  892. static ssize_t target_stat_auth_att_count_show(struct config_item *item,
  893. char *page)
  894. {
  895. struct se_lun_acl *lacl = auth_to_lacl(item);
  896. struct se_node_acl *nacl = lacl->se_lun_nacl;
  897. struct se_dev_entry *deve;
  898. ssize_t ret;
  899. rcu_read_lock();
  900. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  901. if (!deve) {
  902. rcu_read_unlock();
  903. return -ENODEV;
  904. }
  905. /* scsiAuthIntrAttachedTimes */
  906. ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
  907. rcu_read_unlock();
  908. return ret;
  909. }
  910. static ssize_t target_stat_auth_num_cmds_show(struct config_item *item,
  911. char *page)
  912. {
  913. struct se_lun_acl *lacl = auth_to_lacl(item);
  914. struct se_node_acl *nacl = lacl->se_lun_nacl;
  915. struct se_dev_entry *deve;
  916. ssize_t ret;
  917. rcu_read_lock();
  918. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  919. if (!deve) {
  920. rcu_read_unlock();
  921. return -ENODEV;
  922. }
  923. /* scsiAuthIntrOutCommands */
  924. ret = snprintf(page, PAGE_SIZE, "%lu\n",
  925. atomic_long_read(&deve->total_cmds));
  926. rcu_read_unlock();
  927. return ret;
  928. }
  929. static ssize_t target_stat_auth_read_mbytes_show(struct config_item *item,
  930. char *page)
  931. {
  932. struct se_lun_acl *lacl = auth_to_lacl(item);
  933. struct se_node_acl *nacl = lacl->se_lun_nacl;
  934. struct se_dev_entry *deve;
  935. ssize_t ret;
  936. rcu_read_lock();
  937. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  938. if (!deve) {
  939. rcu_read_unlock();
  940. return -ENODEV;
  941. }
  942. /* scsiAuthIntrReadMegaBytes */
  943. ret = snprintf(page, PAGE_SIZE, "%u\n",
  944. (u32)(atomic_long_read(&deve->read_bytes) >> 20));
  945. rcu_read_unlock();
  946. return ret;
  947. }
  948. static ssize_t target_stat_auth_write_mbytes_show(struct config_item *item,
  949. char *page)
  950. {
  951. struct se_lun_acl *lacl = auth_to_lacl(item);
  952. struct se_node_acl *nacl = lacl->se_lun_nacl;
  953. struct se_dev_entry *deve;
  954. ssize_t ret;
  955. rcu_read_lock();
  956. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  957. if (!deve) {
  958. rcu_read_unlock();
  959. return -ENODEV;
  960. }
  961. /* scsiAuthIntrWrittenMegaBytes */
  962. ret = snprintf(page, PAGE_SIZE, "%u\n",
  963. (u32)(atomic_long_read(&deve->write_bytes) >> 20));
  964. rcu_read_unlock();
  965. return ret;
  966. }
  967. static ssize_t target_stat_auth_hs_num_cmds_show(struct config_item *item,
  968. char *page)
  969. {
  970. struct se_lun_acl *lacl = auth_to_lacl(item);
  971. struct se_node_acl *nacl = lacl->se_lun_nacl;
  972. struct se_dev_entry *deve;
  973. ssize_t ret;
  974. rcu_read_lock();
  975. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  976. if (!deve) {
  977. rcu_read_unlock();
  978. return -ENODEV;
  979. }
  980. /* FIXME: scsiAuthIntrHSOutCommands */
  981. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  982. rcu_read_unlock();
  983. return ret;
  984. }
  985. static ssize_t target_stat_auth_creation_time_show(struct config_item *item,
  986. char *page)
  987. {
  988. struct se_lun_acl *lacl = auth_to_lacl(item);
  989. struct se_node_acl *nacl = lacl->se_lun_nacl;
  990. struct se_dev_entry *deve;
  991. ssize_t ret;
  992. rcu_read_lock();
  993. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  994. if (!deve) {
  995. rcu_read_unlock();
  996. return -ENODEV;
  997. }
  998. /* scsiAuthIntrLastCreation */
  999. ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
  1000. INITIAL_JIFFIES) * 100 / HZ));
  1001. rcu_read_unlock();
  1002. return ret;
  1003. }
  1004. static ssize_t target_stat_auth_row_status_show(struct config_item *item,
  1005. char *page)
  1006. {
  1007. struct se_lun_acl *lacl = auth_to_lacl(item);
  1008. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1009. struct se_dev_entry *deve;
  1010. ssize_t ret;
  1011. rcu_read_lock();
  1012. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  1013. if (!deve) {
  1014. rcu_read_unlock();
  1015. return -ENODEV;
  1016. }
  1017. /* FIXME: scsiAuthIntrRowStatus */
  1018. ret = snprintf(page, PAGE_SIZE, "Ready\n");
  1019. rcu_read_unlock();
  1020. return ret;
  1021. }
  1022. CONFIGFS_ATTR_RO(target_stat_auth_, inst);
  1023. CONFIGFS_ATTR_RO(target_stat_auth_, dev);
  1024. CONFIGFS_ATTR_RO(target_stat_auth_, port);
  1025. CONFIGFS_ATTR_RO(target_stat_auth_, indx);
  1026. CONFIGFS_ATTR_RO(target_stat_auth_, dev_or_port);
  1027. CONFIGFS_ATTR_RO(target_stat_auth_, intr_name);
  1028. CONFIGFS_ATTR_RO(target_stat_auth_, map_indx);
  1029. CONFIGFS_ATTR_RO(target_stat_auth_, att_count);
  1030. CONFIGFS_ATTR_RO(target_stat_auth_, num_cmds);
  1031. CONFIGFS_ATTR_RO(target_stat_auth_, read_mbytes);
  1032. CONFIGFS_ATTR_RO(target_stat_auth_, write_mbytes);
  1033. CONFIGFS_ATTR_RO(target_stat_auth_, hs_num_cmds);
  1034. CONFIGFS_ATTR_RO(target_stat_auth_, creation_time);
  1035. CONFIGFS_ATTR_RO(target_stat_auth_, row_status);
  1036. static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
  1037. &target_stat_auth_attr_inst,
  1038. &target_stat_auth_attr_dev,
  1039. &target_stat_auth_attr_port,
  1040. &target_stat_auth_attr_indx,
  1041. &target_stat_auth_attr_dev_or_port,
  1042. &target_stat_auth_attr_intr_name,
  1043. &target_stat_auth_attr_map_indx,
  1044. &target_stat_auth_attr_att_count,
  1045. &target_stat_auth_attr_num_cmds,
  1046. &target_stat_auth_attr_read_mbytes,
  1047. &target_stat_auth_attr_write_mbytes,
  1048. &target_stat_auth_attr_hs_num_cmds,
  1049. &target_stat_auth_attr_creation_time,
  1050. &target_stat_auth_attr_row_status,
  1051. NULL,
  1052. };
  1053. static struct config_item_type target_stat_scsi_auth_intr_cit = {
  1054. .ct_attrs = target_stat_scsi_auth_intr_attrs,
  1055. .ct_owner = THIS_MODULE,
  1056. };
  1057. /*
  1058. * SCSI Attached Initiator Port Table
  1059. */
  1060. static struct se_lun_acl *iport_to_lacl(struct config_item *item)
  1061. {
  1062. struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
  1063. struct se_ml_stat_grps, scsi_att_intr_port_group);
  1064. return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
  1065. }
  1066. static ssize_t target_stat_iport_inst_show(struct config_item *item,
  1067. char *page)
  1068. {
  1069. struct se_lun_acl *lacl = iport_to_lacl(item);
  1070. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1071. struct se_dev_entry *deve;
  1072. struct se_portal_group *tpg;
  1073. ssize_t ret;
  1074. rcu_read_lock();
  1075. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  1076. if (!deve) {
  1077. rcu_read_unlock();
  1078. return -ENODEV;
  1079. }
  1080. tpg = nacl->se_tpg;
  1081. /* scsiInstIndex */
  1082. ret = snprintf(page, PAGE_SIZE, "%u\n",
  1083. tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
  1084. rcu_read_unlock();
  1085. return ret;
  1086. }
  1087. static ssize_t target_stat_iport_dev_show(struct config_item *item,
  1088. char *page)
  1089. {
  1090. struct se_lun_acl *lacl = iport_to_lacl(item);
  1091. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1092. struct se_dev_entry *deve;
  1093. struct se_lun *lun;
  1094. ssize_t ret;
  1095. rcu_read_lock();
  1096. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  1097. if (!deve) {
  1098. rcu_read_unlock();
  1099. return -ENODEV;
  1100. }
  1101. lun = rcu_dereference(deve->se_lun);
  1102. /* scsiDeviceIndex */
  1103. ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_index);
  1104. rcu_read_unlock();
  1105. return ret;
  1106. }
  1107. static ssize_t target_stat_iport_port_show(struct config_item *item,
  1108. char *page)
  1109. {
  1110. struct se_lun_acl *lacl = iport_to_lacl(item);
  1111. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1112. struct se_dev_entry *deve;
  1113. struct se_portal_group *tpg;
  1114. ssize_t ret;
  1115. rcu_read_lock();
  1116. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  1117. if (!deve) {
  1118. rcu_read_unlock();
  1119. return -ENODEV;
  1120. }
  1121. tpg = nacl->se_tpg;
  1122. /* scsiPortIndex */
  1123. ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
  1124. rcu_read_unlock();
  1125. return ret;
  1126. }
  1127. static ssize_t target_stat_iport_indx_show(struct config_item *item,
  1128. char *page)
  1129. {
  1130. struct se_lun_acl *lacl = iport_to_lacl(item);
  1131. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1132. struct se_session *se_sess;
  1133. struct se_portal_group *tpg;
  1134. ssize_t ret;
  1135. spin_lock_irq(&nacl->nacl_sess_lock);
  1136. se_sess = nacl->nacl_sess;
  1137. if (!se_sess) {
  1138. spin_unlock_irq(&nacl->nacl_sess_lock);
  1139. return -ENODEV;
  1140. }
  1141. tpg = nacl->se_tpg;
  1142. /* scsiAttIntrPortIndex */
  1143. ret = snprintf(page, PAGE_SIZE, "%u\n",
  1144. tpg->se_tpg_tfo->sess_get_index(se_sess));
  1145. spin_unlock_irq(&nacl->nacl_sess_lock);
  1146. return ret;
  1147. }
  1148. static ssize_t target_stat_iport_port_auth_indx_show(struct config_item *item,
  1149. char *page)
  1150. {
  1151. struct se_lun_acl *lacl = iport_to_lacl(item);
  1152. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1153. struct se_dev_entry *deve;
  1154. ssize_t ret;
  1155. rcu_read_lock();
  1156. deve = target_nacl_find_deve(nacl, lacl->mapped_lun);
  1157. if (!deve) {
  1158. rcu_read_unlock();
  1159. return -ENODEV;
  1160. }
  1161. /* scsiAttIntrPortAuthIntrIdx */
  1162. ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
  1163. rcu_read_unlock();
  1164. return ret;
  1165. }
  1166. static ssize_t target_stat_iport_port_ident_show(struct config_item *item,
  1167. char *page)
  1168. {
  1169. struct se_lun_acl *lacl = iport_to_lacl(item);
  1170. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1171. struct se_session *se_sess;
  1172. struct se_portal_group *tpg;
  1173. ssize_t ret;
  1174. unsigned char buf[64];
  1175. spin_lock_irq(&nacl->nacl_sess_lock);
  1176. se_sess = nacl->nacl_sess;
  1177. if (!se_sess) {
  1178. spin_unlock_irq(&nacl->nacl_sess_lock);
  1179. return -ENODEV;
  1180. }
  1181. tpg = nacl->se_tpg;
  1182. /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
  1183. memset(buf, 0, 64);
  1184. if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
  1185. tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
  1186. ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
  1187. spin_unlock_irq(&nacl->nacl_sess_lock);
  1188. return ret;
  1189. }
  1190. CONFIGFS_ATTR_RO(target_stat_iport_, inst);
  1191. CONFIGFS_ATTR_RO(target_stat_iport_, dev);
  1192. CONFIGFS_ATTR_RO(target_stat_iport_, port);
  1193. CONFIGFS_ATTR_RO(target_stat_iport_, indx);
  1194. CONFIGFS_ATTR_RO(target_stat_iport_, port_auth_indx);
  1195. CONFIGFS_ATTR_RO(target_stat_iport_, port_ident);
  1196. static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
  1197. &target_stat_iport_attr_inst,
  1198. &target_stat_iport_attr_dev,
  1199. &target_stat_iport_attr_port,
  1200. &target_stat_iport_attr_indx,
  1201. &target_stat_iport_attr_port_auth_indx,
  1202. &target_stat_iport_attr_port_ident,
  1203. NULL,
  1204. };
  1205. static struct config_item_type target_stat_scsi_att_intr_port_cit = {
  1206. .ct_attrs = target_stat_scsi_ath_intr_port_attrs,
  1207. .ct_owner = THIS_MODULE,
  1208. };
  1209. /*
  1210. * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
  1211. * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
  1212. */
  1213. void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
  1214. {
  1215. config_group_init_type_name(&lacl->ml_stat_grps.scsi_auth_intr_group,
  1216. "scsi_auth_intr", &target_stat_scsi_auth_intr_cit);
  1217. configfs_add_default_group(&lacl->ml_stat_grps.scsi_auth_intr_group,
  1218. &lacl->ml_stat_grps.stat_group);
  1219. config_group_init_type_name(&lacl->ml_stat_grps.scsi_att_intr_port_group,
  1220. "scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit);
  1221. configfs_add_default_group(&lacl->ml_stat_grps.scsi_att_intr_port_group,
  1222. &lacl->ml_stat_grps.stat_group);
  1223. }