target_core_stat.c 36 KB

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