target_core_stat.c 36 KB

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