target_core_stat.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635
  1. /*******************************************************************************
  2. * Filename: target_core_stat.c
  3. *
  4. * Modern ConfigFS group context specific statistics based on original
  5. * target_core_mib.c code
  6. *
  7. * (c) Copyright 2006-2013 Datera, Inc.
  8. *
  9. * Nicholas A. Bellinger <nab@linux-iscsi.org>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24. *
  25. ******************************************************************************/
  26. #include <linux/kernel.h>
  27. #include <linux/module.h>
  28. #include <linux/delay.h>
  29. #include <linux/timer.h>
  30. #include <linux/string.h>
  31. #include <linux/utsname.h>
  32. #include <linux/proc_fs.h>
  33. #include <linux/seq_file.h>
  34. #include <linux/configfs.h>
  35. #include <scsi/scsi.h>
  36. #include <scsi/scsi_device.h>
  37. #include <scsi/scsi_host.h>
  38. #include <target/target_core_base.h>
  39. #include <target/target_core_backend.h>
  40. #include <target/target_core_fabric.h>
  41. #include <target/target_core_configfs.h>
  42. #include <target/configfs_macros.h>
  43. #include "target_core_internal.h"
  44. #ifndef INITIAL_JIFFIES
  45. #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
  46. #endif
  47. #define NONE "None"
  48. #define ISPRINT(a) ((a >= ' ') && (a <= '~'))
  49. #define SCSI_LU_INDEX 1
  50. #define LU_COUNT 1
  51. /*
  52. * SCSI Device Table
  53. */
  54. CONFIGFS_EATTR_STRUCT(target_stat_scsi_dev, se_dev_stat_grps);
  55. #define DEV_STAT_SCSI_DEV_ATTR(_name, _mode) \
  56. static struct target_stat_scsi_dev_attribute \
  57. target_stat_scsi_dev_##_name = \
  58. __CONFIGFS_EATTR(_name, _mode, \
  59. target_stat_scsi_dev_show_attr_##_name, \
  60. target_stat_scsi_dev_store_attr_##_name);
  61. #define DEV_STAT_SCSI_DEV_ATTR_RO(_name) \
  62. static struct target_stat_scsi_dev_attribute \
  63. target_stat_scsi_dev_##_name = \
  64. __CONFIGFS_EATTR_RO(_name, \
  65. target_stat_scsi_dev_show_attr_##_name);
  66. static ssize_t target_stat_scsi_dev_show_attr_inst(
  67. struct se_dev_stat_grps *sgrps, char *page)
  68. {
  69. struct se_device *dev =
  70. container_of(sgrps, struct se_device, dev_stat_grps);
  71. struct se_hba *hba = dev->se_hba;
  72. return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  73. }
  74. DEV_STAT_SCSI_DEV_ATTR_RO(inst);
  75. static ssize_t target_stat_scsi_dev_show_attr_indx(
  76. struct se_dev_stat_grps *sgrps, char *page)
  77. {
  78. struct se_device *dev =
  79. container_of(sgrps, struct se_device, dev_stat_grps);
  80. return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  81. }
  82. DEV_STAT_SCSI_DEV_ATTR_RO(indx);
  83. static ssize_t target_stat_scsi_dev_show_attr_role(
  84. struct se_dev_stat_grps *sgrps, char *page)
  85. {
  86. return snprintf(page, PAGE_SIZE, "Target\n");
  87. }
  88. DEV_STAT_SCSI_DEV_ATTR_RO(role);
  89. static ssize_t target_stat_scsi_dev_show_attr_ports(
  90. struct se_dev_stat_grps *sgrps, char *page)
  91. {
  92. struct se_device *dev =
  93. container_of(sgrps, struct se_device, dev_stat_grps);
  94. return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_port_count);
  95. }
  96. DEV_STAT_SCSI_DEV_ATTR_RO(ports);
  97. CONFIGFS_EATTR_OPS(target_stat_scsi_dev, se_dev_stat_grps, scsi_dev_group);
  98. static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
  99. &target_stat_scsi_dev_inst.attr,
  100. &target_stat_scsi_dev_indx.attr,
  101. &target_stat_scsi_dev_role.attr,
  102. &target_stat_scsi_dev_ports.attr,
  103. NULL,
  104. };
  105. static struct configfs_item_operations target_stat_scsi_dev_attrib_ops = {
  106. .show_attribute = target_stat_scsi_dev_attr_show,
  107. .store_attribute = target_stat_scsi_dev_attr_store,
  108. };
  109. static struct config_item_type target_stat_scsi_dev_cit = {
  110. .ct_item_ops = &target_stat_scsi_dev_attrib_ops,
  111. .ct_attrs = target_stat_scsi_dev_attrs,
  112. .ct_owner = THIS_MODULE,
  113. };
  114. /*
  115. * SCSI Target Device Table
  116. */
  117. CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_dev, se_dev_stat_grps);
  118. #define DEV_STAT_SCSI_TGT_DEV_ATTR(_name, _mode) \
  119. static struct target_stat_scsi_tgt_dev_attribute \
  120. target_stat_scsi_tgt_dev_##_name = \
  121. __CONFIGFS_EATTR(_name, _mode, \
  122. target_stat_scsi_tgt_dev_show_attr_##_name, \
  123. target_stat_scsi_tgt_dev_store_attr_##_name);
  124. #define DEV_STAT_SCSI_TGT_DEV_ATTR_RO(_name) \
  125. static struct target_stat_scsi_tgt_dev_attribute \
  126. target_stat_scsi_tgt_dev_##_name = \
  127. __CONFIGFS_EATTR_RO(_name, \
  128. target_stat_scsi_tgt_dev_show_attr_##_name);
  129. static ssize_t target_stat_scsi_tgt_dev_show_attr_inst(
  130. struct se_dev_stat_grps *sgrps, char *page)
  131. {
  132. struct se_device *dev =
  133. container_of(sgrps, struct se_device, dev_stat_grps);
  134. struct se_hba *hba = dev->se_hba;
  135. return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  136. }
  137. DEV_STAT_SCSI_TGT_DEV_ATTR_RO(inst);
  138. static ssize_t target_stat_scsi_tgt_dev_show_attr_indx(
  139. struct se_dev_stat_grps *sgrps, char *page)
  140. {
  141. struct se_device *dev =
  142. container_of(sgrps, struct se_device, dev_stat_grps);
  143. return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  144. }
  145. DEV_STAT_SCSI_TGT_DEV_ATTR_RO(indx);
  146. static ssize_t target_stat_scsi_tgt_dev_show_attr_num_lus(
  147. struct se_dev_stat_grps *sgrps, char *page)
  148. {
  149. return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
  150. }
  151. DEV_STAT_SCSI_TGT_DEV_ATTR_RO(num_lus);
  152. static ssize_t target_stat_scsi_tgt_dev_show_attr_status(
  153. struct se_dev_stat_grps *sgrps, char *page)
  154. {
  155. struct se_device *dev =
  156. container_of(sgrps, struct se_device, dev_stat_grps);
  157. if (dev->export_count)
  158. return snprintf(page, PAGE_SIZE, "activated");
  159. else
  160. return snprintf(page, PAGE_SIZE, "deactivated");
  161. }
  162. DEV_STAT_SCSI_TGT_DEV_ATTR_RO(status);
  163. static ssize_t target_stat_scsi_tgt_dev_show_attr_non_access_lus(
  164. struct se_dev_stat_grps *sgrps, char *page)
  165. {
  166. struct se_device *dev =
  167. container_of(sgrps, struct se_device, dev_stat_grps);
  168. int non_accessible_lus;
  169. if (dev->export_count)
  170. non_accessible_lus = 0;
  171. else
  172. non_accessible_lus = 1;
  173. return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
  174. }
  175. DEV_STAT_SCSI_TGT_DEV_ATTR_RO(non_access_lus);
  176. static ssize_t target_stat_scsi_tgt_dev_show_attr_resets(
  177. struct se_dev_stat_grps *sgrps, char *page)
  178. {
  179. struct se_device *dev =
  180. container_of(sgrps, struct se_device, dev_stat_grps);
  181. return snprintf(page, PAGE_SIZE, "%lu\n",
  182. atomic_long_read(&dev->num_resets));
  183. }
  184. DEV_STAT_SCSI_TGT_DEV_ATTR_RO(resets);
  185. CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_dev, se_dev_stat_grps, scsi_tgt_dev_group);
  186. static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
  187. &target_stat_scsi_tgt_dev_inst.attr,
  188. &target_stat_scsi_tgt_dev_indx.attr,
  189. &target_stat_scsi_tgt_dev_num_lus.attr,
  190. &target_stat_scsi_tgt_dev_status.attr,
  191. &target_stat_scsi_tgt_dev_non_access_lus.attr,
  192. &target_stat_scsi_tgt_dev_resets.attr,
  193. NULL,
  194. };
  195. static struct configfs_item_operations target_stat_scsi_tgt_dev_attrib_ops = {
  196. .show_attribute = target_stat_scsi_tgt_dev_attr_show,
  197. .store_attribute = target_stat_scsi_tgt_dev_attr_store,
  198. };
  199. static struct config_item_type target_stat_scsi_tgt_dev_cit = {
  200. .ct_item_ops = &target_stat_scsi_tgt_dev_attrib_ops,
  201. .ct_attrs = target_stat_scsi_tgt_dev_attrs,
  202. .ct_owner = THIS_MODULE,
  203. };
  204. /*
  205. * SCSI Logical Unit Table
  206. */
  207. CONFIGFS_EATTR_STRUCT(target_stat_scsi_lu, se_dev_stat_grps);
  208. #define DEV_STAT_SCSI_LU_ATTR(_name, _mode) \
  209. static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
  210. __CONFIGFS_EATTR(_name, _mode, \
  211. target_stat_scsi_lu_show_attr_##_name, \
  212. target_stat_scsi_lu_store_attr_##_name);
  213. #define DEV_STAT_SCSI_LU_ATTR_RO(_name) \
  214. static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
  215. __CONFIGFS_EATTR_RO(_name, \
  216. target_stat_scsi_lu_show_attr_##_name);
  217. static ssize_t target_stat_scsi_lu_show_attr_inst(
  218. struct se_dev_stat_grps *sgrps, char *page)
  219. {
  220. struct se_device *dev =
  221. container_of(sgrps, struct se_device, dev_stat_grps);
  222. struct se_hba *hba = dev->se_hba;
  223. return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  224. }
  225. DEV_STAT_SCSI_LU_ATTR_RO(inst);
  226. static ssize_t target_stat_scsi_lu_show_attr_dev(
  227. struct se_dev_stat_grps *sgrps, char *page)
  228. {
  229. struct se_device *dev =
  230. container_of(sgrps, struct se_device, dev_stat_grps);
  231. return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  232. }
  233. DEV_STAT_SCSI_LU_ATTR_RO(dev);
  234. static ssize_t target_stat_scsi_lu_show_attr_indx(
  235. struct se_dev_stat_grps *sgrps, char *page)
  236. {
  237. return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
  238. }
  239. DEV_STAT_SCSI_LU_ATTR_RO(indx);
  240. static ssize_t target_stat_scsi_lu_show_attr_lun(
  241. struct se_dev_stat_grps *sgrps, char *page)
  242. {
  243. /* FIXME: scsiLuDefaultLun */
  244. return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
  245. }
  246. DEV_STAT_SCSI_LU_ATTR_RO(lun);
  247. static ssize_t target_stat_scsi_lu_show_attr_lu_name(
  248. struct se_dev_stat_grps *sgrps, char *page)
  249. {
  250. struct se_device *dev =
  251. container_of(sgrps, struct se_device, dev_stat_grps);
  252. /* scsiLuWwnName */
  253. return snprintf(page, PAGE_SIZE, "%s\n",
  254. (strlen(dev->t10_wwn.unit_serial)) ?
  255. dev->t10_wwn.unit_serial : "None");
  256. }
  257. DEV_STAT_SCSI_LU_ATTR_RO(lu_name);
  258. static ssize_t target_stat_scsi_lu_show_attr_vend(
  259. struct se_dev_stat_grps *sgrps, char *page)
  260. {
  261. struct se_device *dev =
  262. container_of(sgrps, struct se_device, dev_stat_grps);
  263. int i;
  264. char str[sizeof(dev->t10_wwn.vendor)+1];
  265. /* scsiLuVendorId */
  266. for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
  267. str[i] = ISPRINT(dev->t10_wwn.vendor[i]) ?
  268. dev->t10_wwn.vendor[i] : ' ';
  269. str[i] = '\0';
  270. return snprintf(page, PAGE_SIZE, "%s\n", str);
  271. }
  272. DEV_STAT_SCSI_LU_ATTR_RO(vend);
  273. static ssize_t target_stat_scsi_lu_show_attr_prod(
  274. struct se_dev_stat_grps *sgrps, char *page)
  275. {
  276. struct se_device *dev =
  277. container_of(sgrps, struct se_device, dev_stat_grps);
  278. int i;
  279. char str[sizeof(dev->t10_wwn.model)+1];
  280. /* scsiLuProductId */
  281. for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
  282. str[i] = ISPRINT(dev->t10_wwn.model[i]) ?
  283. dev->t10_wwn.model[i] : ' ';
  284. str[i] = '\0';
  285. return snprintf(page, PAGE_SIZE, "%s\n", str);
  286. }
  287. DEV_STAT_SCSI_LU_ATTR_RO(prod);
  288. static ssize_t target_stat_scsi_lu_show_attr_rev(
  289. struct se_dev_stat_grps *sgrps, char *page)
  290. {
  291. struct se_device *dev =
  292. container_of(sgrps, struct se_device, dev_stat_grps);
  293. int i;
  294. char str[sizeof(dev->t10_wwn.revision)+1];
  295. /* scsiLuRevisionId */
  296. for (i = 0; i < sizeof(dev->t10_wwn.revision); i++)
  297. str[i] = ISPRINT(dev->t10_wwn.revision[i]) ?
  298. dev->t10_wwn.revision[i] : ' ';
  299. str[i] = '\0';
  300. return snprintf(page, PAGE_SIZE, "%s\n", str);
  301. }
  302. DEV_STAT_SCSI_LU_ATTR_RO(rev);
  303. static ssize_t target_stat_scsi_lu_show_attr_dev_type(
  304. struct se_dev_stat_grps *sgrps, char *page)
  305. {
  306. struct se_device *dev =
  307. container_of(sgrps, struct se_device, dev_stat_grps);
  308. /* scsiLuPeripheralType */
  309. return snprintf(page, PAGE_SIZE, "%u\n",
  310. dev->transport->get_device_type(dev));
  311. }
  312. DEV_STAT_SCSI_LU_ATTR_RO(dev_type);
  313. static ssize_t target_stat_scsi_lu_show_attr_status(
  314. struct se_dev_stat_grps *sgrps, char *page)
  315. {
  316. struct se_device *dev =
  317. container_of(sgrps, struct se_device, dev_stat_grps);
  318. /* scsiLuStatus */
  319. return snprintf(page, PAGE_SIZE, "%s\n",
  320. (dev->export_count) ? "available" : "notavailable");
  321. }
  322. DEV_STAT_SCSI_LU_ATTR_RO(status);
  323. static ssize_t target_stat_scsi_lu_show_attr_state_bit(
  324. struct se_dev_stat_grps *sgrps, char *page)
  325. {
  326. /* scsiLuState */
  327. return snprintf(page, PAGE_SIZE, "exposed\n");
  328. }
  329. DEV_STAT_SCSI_LU_ATTR_RO(state_bit);
  330. static ssize_t target_stat_scsi_lu_show_attr_num_cmds(
  331. struct se_dev_stat_grps *sgrps, char *page)
  332. {
  333. struct se_device *dev =
  334. container_of(sgrps, struct se_device, dev_stat_grps);
  335. /* scsiLuNumCommands */
  336. return snprintf(page, PAGE_SIZE, "%lu\n",
  337. atomic_long_read(&dev->num_cmds));
  338. }
  339. DEV_STAT_SCSI_LU_ATTR_RO(num_cmds);
  340. static ssize_t target_stat_scsi_lu_show_attr_read_mbytes(
  341. struct se_dev_stat_grps *sgrps, char *page)
  342. {
  343. struct se_device *dev =
  344. container_of(sgrps, struct se_device, dev_stat_grps);
  345. /* scsiLuReadMegaBytes */
  346. return snprintf(page, PAGE_SIZE, "%lu\n",
  347. atomic_long_read(&dev->read_bytes) >> 20);
  348. }
  349. DEV_STAT_SCSI_LU_ATTR_RO(read_mbytes);
  350. static ssize_t target_stat_scsi_lu_show_attr_write_mbytes(
  351. struct se_dev_stat_grps *sgrps, char *page)
  352. {
  353. struct se_device *dev =
  354. container_of(sgrps, struct se_device, dev_stat_grps);
  355. /* scsiLuWrittenMegaBytes */
  356. return snprintf(page, PAGE_SIZE, "%lu\n",
  357. atomic_long_read(&dev->write_bytes) >> 20);
  358. }
  359. DEV_STAT_SCSI_LU_ATTR_RO(write_mbytes);
  360. static ssize_t target_stat_scsi_lu_show_attr_resets(
  361. struct se_dev_stat_grps *sgrps, char *page)
  362. {
  363. struct se_device *dev =
  364. container_of(sgrps, struct se_device, dev_stat_grps);
  365. /* scsiLuInResets */
  366. return snprintf(page, PAGE_SIZE, "%lu\n", atomic_long_read(&dev->num_resets));
  367. }
  368. DEV_STAT_SCSI_LU_ATTR_RO(resets);
  369. static ssize_t target_stat_scsi_lu_show_attr_full_stat(
  370. struct se_dev_stat_grps *sgrps, char *page)
  371. {
  372. /* FIXME: scsiLuOutTaskSetFullStatus */
  373. return snprintf(page, PAGE_SIZE, "%u\n", 0);
  374. }
  375. DEV_STAT_SCSI_LU_ATTR_RO(full_stat);
  376. static ssize_t target_stat_scsi_lu_show_attr_hs_num_cmds(
  377. struct se_dev_stat_grps *sgrps, char *page)
  378. {
  379. /* FIXME: scsiLuHSInCommands */
  380. return snprintf(page, PAGE_SIZE, "%u\n", 0);
  381. }
  382. DEV_STAT_SCSI_LU_ATTR_RO(hs_num_cmds);
  383. static ssize_t target_stat_scsi_lu_show_attr_creation_time(
  384. struct se_dev_stat_grps *sgrps, char *page)
  385. {
  386. struct se_device *dev =
  387. container_of(sgrps, struct se_device, dev_stat_grps);
  388. /* scsiLuCreationTime */
  389. return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
  390. INITIAL_JIFFIES) * 100 / HZ));
  391. }
  392. DEV_STAT_SCSI_LU_ATTR_RO(creation_time);
  393. CONFIGFS_EATTR_OPS(target_stat_scsi_lu, se_dev_stat_grps, scsi_lu_group);
  394. static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
  395. &target_stat_scsi_lu_inst.attr,
  396. &target_stat_scsi_lu_dev.attr,
  397. &target_stat_scsi_lu_indx.attr,
  398. &target_stat_scsi_lu_lun.attr,
  399. &target_stat_scsi_lu_lu_name.attr,
  400. &target_stat_scsi_lu_vend.attr,
  401. &target_stat_scsi_lu_prod.attr,
  402. &target_stat_scsi_lu_rev.attr,
  403. &target_stat_scsi_lu_dev_type.attr,
  404. &target_stat_scsi_lu_status.attr,
  405. &target_stat_scsi_lu_state_bit.attr,
  406. &target_stat_scsi_lu_num_cmds.attr,
  407. &target_stat_scsi_lu_read_mbytes.attr,
  408. &target_stat_scsi_lu_write_mbytes.attr,
  409. &target_stat_scsi_lu_resets.attr,
  410. &target_stat_scsi_lu_full_stat.attr,
  411. &target_stat_scsi_lu_hs_num_cmds.attr,
  412. &target_stat_scsi_lu_creation_time.attr,
  413. NULL,
  414. };
  415. static struct configfs_item_operations target_stat_scsi_lu_attrib_ops = {
  416. .show_attribute = target_stat_scsi_lu_attr_show,
  417. .store_attribute = target_stat_scsi_lu_attr_store,
  418. };
  419. static struct config_item_type target_stat_scsi_lu_cit = {
  420. .ct_item_ops = &target_stat_scsi_lu_attrib_ops,
  421. .ct_attrs = target_stat_scsi_lu_attrs,
  422. .ct_owner = THIS_MODULE,
  423. };
  424. /*
  425. * Called from target_core_configfs.c:target_core_make_subdev() to setup
  426. * the target statistics groups + configfs CITs located in target_core_stat.c
  427. */
  428. void target_stat_setup_dev_default_groups(struct se_device *dev)
  429. {
  430. struct config_group *dev_stat_grp = &dev->dev_stat_grps.stat_group;
  431. config_group_init_type_name(&dev->dev_stat_grps.scsi_dev_group,
  432. "scsi_dev", &target_stat_scsi_dev_cit);
  433. config_group_init_type_name(&dev->dev_stat_grps.scsi_tgt_dev_group,
  434. "scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit);
  435. config_group_init_type_name(&dev->dev_stat_grps.scsi_lu_group,
  436. "scsi_lu", &target_stat_scsi_lu_cit);
  437. dev_stat_grp->default_groups[0] = &dev->dev_stat_grps.scsi_dev_group;
  438. dev_stat_grp->default_groups[1] = &dev->dev_stat_grps.scsi_tgt_dev_group;
  439. dev_stat_grp->default_groups[2] = &dev->dev_stat_grps.scsi_lu_group;
  440. dev_stat_grp->default_groups[3] = NULL;
  441. }
  442. /*
  443. * SCSI Port Table
  444. */
  445. CONFIGFS_EATTR_STRUCT(target_stat_scsi_port, se_port_stat_grps);
  446. #define DEV_STAT_SCSI_PORT_ATTR(_name, _mode) \
  447. static struct target_stat_scsi_port_attribute \
  448. target_stat_scsi_port_##_name = \
  449. __CONFIGFS_EATTR(_name, _mode, \
  450. target_stat_scsi_port_show_attr_##_name, \
  451. target_stat_scsi_port_store_attr_##_name);
  452. #define DEV_STAT_SCSI_PORT_ATTR_RO(_name) \
  453. static struct target_stat_scsi_port_attribute \
  454. target_stat_scsi_port_##_name = \
  455. __CONFIGFS_EATTR_RO(_name, \
  456. target_stat_scsi_port_show_attr_##_name);
  457. static ssize_t target_stat_scsi_port_show_attr_inst(
  458. struct se_port_stat_grps *pgrps, char *page)
  459. {
  460. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  461. struct se_port *sep;
  462. struct se_device *dev = lun->lun_se_dev;
  463. struct se_hba *hba;
  464. ssize_t ret;
  465. spin_lock(&lun->lun_sep_lock);
  466. sep = lun->lun_sep;
  467. if (!sep) {
  468. spin_unlock(&lun->lun_sep_lock);
  469. return -ENODEV;
  470. }
  471. hba = dev->se_hba;
  472. ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  473. spin_unlock(&lun->lun_sep_lock);
  474. return ret;
  475. }
  476. DEV_STAT_SCSI_PORT_ATTR_RO(inst);
  477. static ssize_t target_stat_scsi_port_show_attr_dev(
  478. struct se_port_stat_grps *pgrps, char *page)
  479. {
  480. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  481. struct se_port *sep;
  482. struct se_device *dev = lun->lun_se_dev;
  483. ssize_t ret;
  484. spin_lock(&lun->lun_sep_lock);
  485. sep = lun->lun_sep;
  486. if (!sep) {
  487. spin_unlock(&lun->lun_sep_lock);
  488. return -ENODEV;
  489. }
  490. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  491. spin_unlock(&lun->lun_sep_lock);
  492. return ret;
  493. }
  494. DEV_STAT_SCSI_PORT_ATTR_RO(dev);
  495. static ssize_t target_stat_scsi_port_show_attr_indx(
  496. struct se_port_stat_grps *pgrps, char *page)
  497. {
  498. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  499. struct se_port *sep;
  500. ssize_t ret;
  501. spin_lock(&lun->lun_sep_lock);
  502. sep = lun->lun_sep;
  503. if (!sep) {
  504. spin_unlock(&lun->lun_sep_lock);
  505. return -ENODEV;
  506. }
  507. ret = snprintf(page, PAGE_SIZE, "%u\n", sep->sep_index);
  508. spin_unlock(&lun->lun_sep_lock);
  509. return ret;
  510. }
  511. DEV_STAT_SCSI_PORT_ATTR_RO(indx);
  512. static ssize_t target_stat_scsi_port_show_attr_role(
  513. struct se_port_stat_grps *pgrps, char *page)
  514. {
  515. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  516. struct se_device *dev = lun->lun_se_dev;
  517. struct se_port *sep;
  518. ssize_t ret;
  519. if (!dev)
  520. return -ENODEV;
  521. spin_lock(&lun->lun_sep_lock);
  522. sep = lun->lun_sep;
  523. if (!sep) {
  524. spin_unlock(&lun->lun_sep_lock);
  525. return -ENODEV;
  526. }
  527. ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
  528. spin_unlock(&lun->lun_sep_lock);
  529. return ret;
  530. }
  531. DEV_STAT_SCSI_PORT_ATTR_RO(role);
  532. static ssize_t target_stat_scsi_port_show_attr_busy_count(
  533. struct se_port_stat_grps *pgrps, char *page)
  534. {
  535. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  536. struct se_port *sep;
  537. ssize_t ret;
  538. spin_lock(&lun->lun_sep_lock);
  539. sep = lun->lun_sep;
  540. if (!sep) {
  541. spin_unlock(&lun->lun_sep_lock);
  542. return -ENODEV;
  543. }
  544. /* FIXME: scsiPortBusyStatuses */
  545. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  546. spin_unlock(&lun->lun_sep_lock);
  547. return ret;
  548. }
  549. DEV_STAT_SCSI_PORT_ATTR_RO(busy_count);
  550. CONFIGFS_EATTR_OPS(target_stat_scsi_port, se_port_stat_grps, scsi_port_group);
  551. static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
  552. &target_stat_scsi_port_inst.attr,
  553. &target_stat_scsi_port_dev.attr,
  554. &target_stat_scsi_port_indx.attr,
  555. &target_stat_scsi_port_role.attr,
  556. &target_stat_scsi_port_busy_count.attr,
  557. NULL,
  558. };
  559. static struct configfs_item_operations target_stat_scsi_port_attrib_ops = {
  560. .show_attribute = target_stat_scsi_port_attr_show,
  561. .store_attribute = target_stat_scsi_port_attr_store,
  562. };
  563. static struct config_item_type target_stat_scsi_port_cit = {
  564. .ct_item_ops = &target_stat_scsi_port_attrib_ops,
  565. .ct_attrs = target_stat_scsi_port_attrs,
  566. .ct_owner = THIS_MODULE,
  567. };
  568. /*
  569. * SCSI Target Port Table
  570. */
  571. CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_port, se_port_stat_grps);
  572. #define DEV_STAT_SCSI_TGT_PORT_ATTR(_name, _mode) \
  573. static struct target_stat_scsi_tgt_port_attribute \
  574. target_stat_scsi_tgt_port_##_name = \
  575. __CONFIGFS_EATTR(_name, _mode, \
  576. target_stat_scsi_tgt_port_show_attr_##_name, \
  577. target_stat_scsi_tgt_port_store_attr_##_name);
  578. #define DEV_STAT_SCSI_TGT_PORT_ATTR_RO(_name) \
  579. static struct target_stat_scsi_tgt_port_attribute \
  580. target_stat_scsi_tgt_port_##_name = \
  581. __CONFIGFS_EATTR_RO(_name, \
  582. target_stat_scsi_tgt_port_show_attr_##_name);
  583. static ssize_t target_stat_scsi_tgt_port_show_attr_inst(
  584. struct se_port_stat_grps *pgrps, char *page)
  585. {
  586. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  587. struct se_device *dev = lun->lun_se_dev;
  588. struct se_port *sep;
  589. struct se_hba *hba;
  590. ssize_t ret;
  591. spin_lock(&lun->lun_sep_lock);
  592. sep = lun->lun_sep;
  593. if (!sep) {
  594. spin_unlock(&lun->lun_sep_lock);
  595. return -ENODEV;
  596. }
  597. hba = dev->se_hba;
  598. ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  599. spin_unlock(&lun->lun_sep_lock);
  600. return ret;
  601. }
  602. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(inst);
  603. static ssize_t target_stat_scsi_tgt_port_show_attr_dev(
  604. struct se_port_stat_grps *pgrps, char *page)
  605. {
  606. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  607. struct se_device *dev = lun->lun_se_dev;
  608. struct se_port *sep;
  609. ssize_t ret;
  610. spin_lock(&lun->lun_sep_lock);
  611. sep = lun->lun_sep;
  612. if (!sep) {
  613. spin_unlock(&lun->lun_sep_lock);
  614. return -ENODEV;
  615. }
  616. ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
  617. spin_unlock(&lun->lun_sep_lock);
  618. return ret;
  619. }
  620. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(dev);
  621. static ssize_t target_stat_scsi_tgt_port_show_attr_indx(
  622. struct se_port_stat_grps *pgrps, char *page)
  623. {
  624. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  625. struct se_port *sep;
  626. ssize_t ret;
  627. spin_lock(&lun->lun_sep_lock);
  628. sep = lun->lun_sep;
  629. if (!sep) {
  630. spin_unlock(&lun->lun_sep_lock);
  631. return -ENODEV;
  632. }
  633. ret = snprintf(page, PAGE_SIZE, "%u\n", sep->sep_index);
  634. spin_unlock(&lun->lun_sep_lock);
  635. return ret;
  636. }
  637. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(indx);
  638. static ssize_t target_stat_scsi_tgt_port_show_attr_name(
  639. struct se_port_stat_grps *pgrps, char *page)
  640. {
  641. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  642. struct se_port *sep;
  643. struct se_portal_group *tpg;
  644. ssize_t ret;
  645. spin_lock(&lun->lun_sep_lock);
  646. sep = lun->lun_sep;
  647. if (!sep) {
  648. spin_unlock(&lun->lun_sep_lock);
  649. return -ENODEV;
  650. }
  651. tpg = sep->sep_tpg;
  652. ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
  653. tpg->se_tpg_tfo->get_fabric_name(), sep->sep_index);
  654. spin_unlock(&lun->lun_sep_lock);
  655. return ret;
  656. }
  657. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(name);
  658. static ssize_t target_stat_scsi_tgt_port_show_attr_port_index(
  659. struct se_port_stat_grps *pgrps, char *page)
  660. {
  661. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  662. struct se_port *sep;
  663. struct se_portal_group *tpg;
  664. ssize_t ret;
  665. spin_lock(&lun->lun_sep_lock);
  666. sep = lun->lun_sep;
  667. if (!sep) {
  668. spin_unlock(&lun->lun_sep_lock);
  669. return -ENODEV;
  670. }
  671. tpg = sep->sep_tpg;
  672. ret = snprintf(page, PAGE_SIZE, "%s%s%d\n",
  673. tpg->se_tpg_tfo->tpg_get_wwn(tpg), "+t+",
  674. tpg->se_tpg_tfo->tpg_get_tag(tpg));
  675. spin_unlock(&lun->lun_sep_lock);
  676. return ret;
  677. }
  678. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(port_index);
  679. static ssize_t target_stat_scsi_tgt_port_show_attr_in_cmds(
  680. struct se_port_stat_grps *pgrps, char *page)
  681. {
  682. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  683. struct se_port *sep;
  684. ssize_t ret;
  685. spin_lock(&lun->lun_sep_lock);
  686. sep = lun->lun_sep;
  687. if (!sep) {
  688. spin_unlock(&lun->lun_sep_lock);
  689. return -ENODEV;
  690. }
  691. ret = snprintf(page, PAGE_SIZE, "%llu\n", sep->sep_stats.cmd_pdus);
  692. spin_unlock(&lun->lun_sep_lock);
  693. return ret;
  694. }
  695. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(in_cmds);
  696. static ssize_t target_stat_scsi_tgt_port_show_attr_write_mbytes(
  697. struct se_port_stat_grps *pgrps, char *page)
  698. {
  699. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  700. struct se_port *sep;
  701. ssize_t ret;
  702. spin_lock(&lun->lun_sep_lock);
  703. sep = lun->lun_sep;
  704. if (!sep) {
  705. spin_unlock(&lun->lun_sep_lock);
  706. return -ENODEV;
  707. }
  708. ret = snprintf(page, PAGE_SIZE, "%u\n",
  709. (u32)(sep->sep_stats.rx_data_octets >> 20));
  710. spin_unlock(&lun->lun_sep_lock);
  711. return ret;
  712. }
  713. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(write_mbytes);
  714. static ssize_t target_stat_scsi_tgt_port_show_attr_read_mbytes(
  715. struct se_port_stat_grps *pgrps, char *page)
  716. {
  717. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  718. struct se_port *sep;
  719. ssize_t ret;
  720. spin_lock(&lun->lun_sep_lock);
  721. sep = lun->lun_sep;
  722. if (!sep) {
  723. spin_unlock(&lun->lun_sep_lock);
  724. return -ENODEV;
  725. }
  726. ret = snprintf(page, PAGE_SIZE, "%u\n",
  727. (u32)(sep->sep_stats.tx_data_octets >> 20));
  728. spin_unlock(&lun->lun_sep_lock);
  729. return ret;
  730. }
  731. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(read_mbytes);
  732. static ssize_t target_stat_scsi_tgt_port_show_attr_hs_in_cmds(
  733. struct se_port_stat_grps *pgrps, char *page)
  734. {
  735. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  736. struct se_port *sep;
  737. ssize_t ret;
  738. spin_lock(&lun->lun_sep_lock);
  739. sep = lun->lun_sep;
  740. if (!sep) {
  741. spin_unlock(&lun->lun_sep_lock);
  742. return -ENODEV;
  743. }
  744. /* FIXME: scsiTgtPortHsInCommands */
  745. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  746. spin_unlock(&lun->lun_sep_lock);
  747. return ret;
  748. }
  749. DEV_STAT_SCSI_TGT_PORT_ATTR_RO(hs_in_cmds);
  750. CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_port, se_port_stat_grps,
  751. scsi_tgt_port_group);
  752. static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
  753. &target_stat_scsi_tgt_port_inst.attr,
  754. &target_stat_scsi_tgt_port_dev.attr,
  755. &target_stat_scsi_tgt_port_indx.attr,
  756. &target_stat_scsi_tgt_port_name.attr,
  757. &target_stat_scsi_tgt_port_port_index.attr,
  758. &target_stat_scsi_tgt_port_in_cmds.attr,
  759. &target_stat_scsi_tgt_port_write_mbytes.attr,
  760. &target_stat_scsi_tgt_port_read_mbytes.attr,
  761. &target_stat_scsi_tgt_port_hs_in_cmds.attr,
  762. NULL,
  763. };
  764. static struct configfs_item_operations target_stat_scsi_tgt_port_attrib_ops = {
  765. .show_attribute = target_stat_scsi_tgt_port_attr_show,
  766. .store_attribute = target_stat_scsi_tgt_port_attr_store,
  767. };
  768. static struct config_item_type target_stat_scsi_tgt_port_cit = {
  769. .ct_item_ops = &target_stat_scsi_tgt_port_attrib_ops,
  770. .ct_attrs = target_stat_scsi_tgt_port_attrs,
  771. .ct_owner = THIS_MODULE,
  772. };
  773. /*
  774. * SCSI Transport Table
  775. o */
  776. CONFIGFS_EATTR_STRUCT(target_stat_scsi_transport, se_port_stat_grps);
  777. #define DEV_STAT_SCSI_TRANSPORT_ATTR(_name, _mode) \
  778. static struct target_stat_scsi_transport_attribute \
  779. target_stat_scsi_transport_##_name = \
  780. __CONFIGFS_EATTR(_name, _mode, \
  781. target_stat_scsi_transport_show_attr_##_name, \
  782. target_stat_scsi_transport_store_attr_##_name);
  783. #define DEV_STAT_SCSI_TRANSPORT_ATTR_RO(_name) \
  784. static struct target_stat_scsi_transport_attribute \
  785. target_stat_scsi_transport_##_name = \
  786. __CONFIGFS_EATTR_RO(_name, \
  787. target_stat_scsi_transport_show_attr_##_name);
  788. static ssize_t target_stat_scsi_transport_show_attr_inst(
  789. struct se_port_stat_grps *pgrps, char *page)
  790. {
  791. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  792. struct se_device *dev = lun->lun_se_dev;
  793. struct se_port *sep;
  794. struct se_hba *hba;
  795. ssize_t ret;
  796. spin_lock(&lun->lun_sep_lock);
  797. sep = lun->lun_sep;
  798. if (!sep) {
  799. spin_unlock(&lun->lun_sep_lock);
  800. return -ENODEV;
  801. }
  802. hba = dev->se_hba;
  803. ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
  804. spin_unlock(&lun->lun_sep_lock);
  805. return ret;
  806. }
  807. DEV_STAT_SCSI_TRANSPORT_ATTR_RO(inst);
  808. static ssize_t target_stat_scsi_transport_show_attr_device(
  809. struct se_port_stat_grps *pgrps, char *page)
  810. {
  811. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  812. struct se_port *sep;
  813. struct se_portal_group *tpg;
  814. ssize_t ret;
  815. spin_lock(&lun->lun_sep_lock);
  816. sep = lun->lun_sep;
  817. if (!sep) {
  818. spin_unlock(&lun->lun_sep_lock);
  819. return -ENODEV;
  820. }
  821. tpg = sep->sep_tpg;
  822. /* scsiTransportType */
  823. ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
  824. tpg->se_tpg_tfo->get_fabric_name());
  825. spin_unlock(&lun->lun_sep_lock);
  826. return ret;
  827. }
  828. DEV_STAT_SCSI_TRANSPORT_ATTR_RO(device);
  829. static ssize_t target_stat_scsi_transport_show_attr_indx(
  830. struct se_port_stat_grps *pgrps, char *page)
  831. {
  832. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  833. struct se_port *sep;
  834. struct se_portal_group *tpg;
  835. ssize_t ret;
  836. spin_lock(&lun->lun_sep_lock);
  837. sep = lun->lun_sep;
  838. if (!sep) {
  839. spin_unlock(&lun->lun_sep_lock);
  840. return -ENODEV;
  841. }
  842. tpg = sep->sep_tpg;
  843. ret = snprintf(page, PAGE_SIZE, "%u\n",
  844. tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
  845. spin_unlock(&lun->lun_sep_lock);
  846. return ret;
  847. }
  848. DEV_STAT_SCSI_TRANSPORT_ATTR_RO(indx);
  849. static ssize_t target_stat_scsi_transport_show_attr_dev_name(
  850. struct se_port_stat_grps *pgrps, char *page)
  851. {
  852. struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
  853. struct se_device *dev = lun->lun_se_dev;
  854. struct se_port *sep;
  855. struct se_portal_group *tpg;
  856. struct t10_wwn *wwn;
  857. ssize_t ret;
  858. spin_lock(&lun->lun_sep_lock);
  859. sep = lun->lun_sep;
  860. if (!sep) {
  861. spin_unlock(&lun->lun_sep_lock);
  862. return -ENODEV;
  863. }
  864. tpg = sep->sep_tpg;
  865. wwn = &dev->t10_wwn;
  866. /* scsiTransportDevName */
  867. ret = snprintf(page, PAGE_SIZE, "%s+%s\n",
  868. tpg->se_tpg_tfo->tpg_get_wwn(tpg),
  869. (strlen(wwn->unit_serial)) ? wwn->unit_serial :
  870. wwn->vendor);
  871. spin_unlock(&lun->lun_sep_lock);
  872. return ret;
  873. }
  874. DEV_STAT_SCSI_TRANSPORT_ATTR_RO(dev_name);
  875. CONFIGFS_EATTR_OPS(target_stat_scsi_transport, se_port_stat_grps,
  876. scsi_transport_group);
  877. static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
  878. &target_stat_scsi_transport_inst.attr,
  879. &target_stat_scsi_transport_device.attr,
  880. &target_stat_scsi_transport_indx.attr,
  881. &target_stat_scsi_transport_dev_name.attr,
  882. NULL,
  883. };
  884. static struct configfs_item_operations target_stat_scsi_transport_attrib_ops = {
  885. .show_attribute = target_stat_scsi_transport_attr_show,
  886. .store_attribute = target_stat_scsi_transport_attr_store,
  887. };
  888. static struct config_item_type target_stat_scsi_transport_cit = {
  889. .ct_item_ops = &target_stat_scsi_transport_attrib_ops,
  890. .ct_attrs = target_stat_scsi_transport_attrs,
  891. .ct_owner = THIS_MODULE,
  892. };
  893. /*
  894. * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
  895. * the target port statistics groups + configfs CITs located in target_core_stat.c
  896. */
  897. void target_stat_setup_port_default_groups(struct se_lun *lun)
  898. {
  899. struct config_group *port_stat_grp = &lun->port_stat_grps.stat_group;
  900. config_group_init_type_name(&lun->port_stat_grps.scsi_port_group,
  901. "scsi_port", &target_stat_scsi_port_cit);
  902. config_group_init_type_name(&lun->port_stat_grps.scsi_tgt_port_group,
  903. "scsi_tgt_port", &target_stat_scsi_tgt_port_cit);
  904. config_group_init_type_name(&lun->port_stat_grps.scsi_transport_group,
  905. "scsi_transport", &target_stat_scsi_transport_cit);
  906. port_stat_grp->default_groups[0] = &lun->port_stat_grps.scsi_port_group;
  907. port_stat_grp->default_groups[1] = &lun->port_stat_grps.scsi_tgt_port_group;
  908. port_stat_grp->default_groups[2] = &lun->port_stat_grps.scsi_transport_group;
  909. port_stat_grp->default_groups[3] = NULL;
  910. }
  911. /*
  912. * SCSI Authorized Initiator Table
  913. */
  914. CONFIGFS_EATTR_STRUCT(target_stat_scsi_auth_intr, se_ml_stat_grps);
  915. #define DEV_STAT_SCSI_AUTH_INTR_ATTR(_name, _mode) \
  916. static struct target_stat_scsi_auth_intr_attribute \
  917. target_stat_scsi_auth_intr_##_name = \
  918. __CONFIGFS_EATTR(_name, _mode, \
  919. target_stat_scsi_auth_intr_show_attr_##_name, \
  920. target_stat_scsi_auth_intr_store_attr_##_name);
  921. #define DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(_name) \
  922. static struct target_stat_scsi_auth_intr_attribute \
  923. target_stat_scsi_auth_intr_##_name = \
  924. __CONFIGFS_EATTR_RO(_name, \
  925. target_stat_scsi_auth_intr_show_attr_##_name);
  926. static ssize_t target_stat_scsi_auth_intr_show_attr_inst(
  927. struct se_ml_stat_grps *lgrps, char *page)
  928. {
  929. struct se_lun_acl *lacl = container_of(lgrps,
  930. struct se_lun_acl, ml_stat_grps);
  931. struct se_node_acl *nacl = lacl->se_lun_nacl;
  932. struct se_dev_entry *deve;
  933. struct se_portal_group *tpg;
  934. ssize_t ret;
  935. spin_lock_irq(&nacl->device_list_lock);
  936. deve = nacl->device_list[lacl->mapped_lun];
  937. if (!deve->se_lun || !deve->se_lun_acl) {
  938. spin_unlock_irq(&nacl->device_list_lock);
  939. return -ENODEV;
  940. }
  941. tpg = nacl->se_tpg;
  942. /* scsiInstIndex */
  943. ret = snprintf(page, PAGE_SIZE, "%u\n",
  944. tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
  945. spin_unlock_irq(&nacl->device_list_lock);
  946. return ret;
  947. }
  948. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(inst);
  949. static ssize_t target_stat_scsi_auth_intr_show_attr_dev(
  950. struct se_ml_stat_grps *lgrps, char *page)
  951. {
  952. struct se_lun_acl *lacl = container_of(lgrps,
  953. struct se_lun_acl, ml_stat_grps);
  954. struct se_node_acl *nacl = lacl->se_lun_nacl;
  955. struct se_dev_entry *deve;
  956. struct se_lun *lun;
  957. ssize_t ret;
  958. spin_lock_irq(&nacl->device_list_lock);
  959. deve = nacl->device_list[lacl->mapped_lun];
  960. if (!deve->se_lun || !deve->se_lun_acl) {
  961. spin_unlock_irq(&nacl->device_list_lock);
  962. return -ENODEV;
  963. }
  964. lun = deve->se_lun;
  965. /* scsiDeviceIndex */
  966. ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_se_dev->dev_index);
  967. spin_unlock_irq(&nacl->device_list_lock);
  968. return ret;
  969. }
  970. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev);
  971. static ssize_t target_stat_scsi_auth_intr_show_attr_port(
  972. struct se_ml_stat_grps *lgrps, char *page)
  973. {
  974. struct se_lun_acl *lacl = container_of(lgrps,
  975. struct se_lun_acl, ml_stat_grps);
  976. struct se_node_acl *nacl = lacl->se_lun_nacl;
  977. struct se_dev_entry *deve;
  978. struct se_portal_group *tpg;
  979. ssize_t ret;
  980. spin_lock_irq(&nacl->device_list_lock);
  981. deve = nacl->device_list[lacl->mapped_lun];
  982. if (!deve->se_lun || !deve->se_lun_acl) {
  983. spin_unlock_irq(&nacl->device_list_lock);
  984. return -ENODEV;
  985. }
  986. tpg = nacl->se_tpg;
  987. /* scsiAuthIntrTgtPortIndex */
  988. ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
  989. spin_unlock_irq(&nacl->device_list_lock);
  990. return ret;
  991. }
  992. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(port);
  993. static ssize_t target_stat_scsi_auth_intr_show_attr_indx(
  994. struct se_ml_stat_grps *lgrps, char *page)
  995. {
  996. struct se_lun_acl *lacl = container_of(lgrps,
  997. struct se_lun_acl, ml_stat_grps);
  998. struct se_node_acl *nacl = lacl->se_lun_nacl;
  999. struct se_dev_entry *deve;
  1000. ssize_t ret;
  1001. spin_lock_irq(&nacl->device_list_lock);
  1002. deve = nacl->device_list[lacl->mapped_lun];
  1003. if (!deve->se_lun || !deve->se_lun_acl) {
  1004. spin_unlock_irq(&nacl->device_list_lock);
  1005. return -ENODEV;
  1006. }
  1007. /* scsiAuthIntrIndex */
  1008. ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
  1009. spin_unlock_irq(&nacl->device_list_lock);
  1010. return ret;
  1011. }
  1012. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(indx);
  1013. static ssize_t target_stat_scsi_auth_intr_show_attr_dev_or_port(
  1014. struct se_ml_stat_grps *lgrps, char *page)
  1015. {
  1016. struct se_lun_acl *lacl = container_of(lgrps,
  1017. struct se_lun_acl, ml_stat_grps);
  1018. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1019. struct se_dev_entry *deve;
  1020. ssize_t ret;
  1021. spin_lock_irq(&nacl->device_list_lock);
  1022. deve = nacl->device_list[lacl->mapped_lun];
  1023. if (!deve->se_lun || !deve->se_lun_acl) {
  1024. spin_unlock_irq(&nacl->device_list_lock);
  1025. return -ENODEV;
  1026. }
  1027. /* scsiAuthIntrDevOrPort */
  1028. ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
  1029. spin_unlock_irq(&nacl->device_list_lock);
  1030. return ret;
  1031. }
  1032. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev_or_port);
  1033. static ssize_t target_stat_scsi_auth_intr_show_attr_intr_name(
  1034. struct se_ml_stat_grps *lgrps, char *page)
  1035. {
  1036. struct se_lun_acl *lacl = container_of(lgrps,
  1037. struct se_lun_acl, ml_stat_grps);
  1038. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1039. struct se_dev_entry *deve;
  1040. ssize_t ret;
  1041. spin_lock_irq(&nacl->device_list_lock);
  1042. deve = nacl->device_list[lacl->mapped_lun];
  1043. if (!deve->se_lun || !deve->se_lun_acl) {
  1044. spin_unlock_irq(&nacl->device_list_lock);
  1045. return -ENODEV;
  1046. }
  1047. /* scsiAuthIntrName */
  1048. ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
  1049. spin_unlock_irq(&nacl->device_list_lock);
  1050. return ret;
  1051. }
  1052. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(intr_name);
  1053. static ssize_t target_stat_scsi_auth_intr_show_attr_map_indx(
  1054. struct se_ml_stat_grps *lgrps, char *page)
  1055. {
  1056. struct se_lun_acl *lacl = container_of(lgrps,
  1057. struct se_lun_acl, ml_stat_grps);
  1058. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1059. struct se_dev_entry *deve;
  1060. ssize_t ret;
  1061. spin_lock_irq(&nacl->device_list_lock);
  1062. deve = nacl->device_list[lacl->mapped_lun];
  1063. if (!deve->se_lun || !deve->se_lun_acl) {
  1064. spin_unlock_irq(&nacl->device_list_lock);
  1065. return -ENODEV;
  1066. }
  1067. /* FIXME: scsiAuthIntrLunMapIndex */
  1068. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  1069. spin_unlock_irq(&nacl->device_list_lock);
  1070. return ret;
  1071. }
  1072. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(map_indx);
  1073. static ssize_t target_stat_scsi_auth_intr_show_attr_att_count(
  1074. struct se_ml_stat_grps *lgrps, char *page)
  1075. {
  1076. struct se_lun_acl *lacl = container_of(lgrps,
  1077. struct se_lun_acl, ml_stat_grps);
  1078. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1079. struct se_dev_entry *deve;
  1080. ssize_t ret;
  1081. spin_lock_irq(&nacl->device_list_lock);
  1082. deve = nacl->device_list[lacl->mapped_lun];
  1083. if (!deve->se_lun || !deve->se_lun_acl) {
  1084. spin_unlock_irq(&nacl->device_list_lock);
  1085. return -ENODEV;
  1086. }
  1087. /* scsiAuthIntrAttachedTimes */
  1088. ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
  1089. spin_unlock_irq(&nacl->device_list_lock);
  1090. return ret;
  1091. }
  1092. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(att_count);
  1093. static ssize_t target_stat_scsi_auth_intr_show_attr_num_cmds(
  1094. struct se_ml_stat_grps *lgrps, char *page)
  1095. {
  1096. struct se_lun_acl *lacl = container_of(lgrps,
  1097. struct se_lun_acl, ml_stat_grps);
  1098. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1099. struct se_dev_entry *deve;
  1100. ssize_t ret;
  1101. spin_lock_irq(&nacl->device_list_lock);
  1102. deve = nacl->device_list[lacl->mapped_lun];
  1103. if (!deve->se_lun || !deve->se_lun_acl) {
  1104. spin_unlock_irq(&nacl->device_list_lock);
  1105. return -ENODEV;
  1106. }
  1107. /* scsiAuthIntrOutCommands */
  1108. ret = snprintf(page, PAGE_SIZE, "%u\n", deve->total_cmds);
  1109. spin_unlock_irq(&nacl->device_list_lock);
  1110. return ret;
  1111. }
  1112. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(num_cmds);
  1113. static ssize_t target_stat_scsi_auth_intr_show_attr_read_mbytes(
  1114. struct se_ml_stat_grps *lgrps, char *page)
  1115. {
  1116. struct se_lun_acl *lacl = container_of(lgrps,
  1117. struct se_lun_acl, ml_stat_grps);
  1118. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1119. struct se_dev_entry *deve;
  1120. ssize_t ret;
  1121. spin_lock_irq(&nacl->device_list_lock);
  1122. deve = nacl->device_list[lacl->mapped_lun];
  1123. if (!deve->se_lun || !deve->se_lun_acl) {
  1124. spin_unlock_irq(&nacl->device_list_lock);
  1125. return -ENODEV;
  1126. }
  1127. /* scsiAuthIntrReadMegaBytes */
  1128. ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(deve->read_bytes >> 20));
  1129. spin_unlock_irq(&nacl->device_list_lock);
  1130. return ret;
  1131. }
  1132. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(read_mbytes);
  1133. static ssize_t target_stat_scsi_auth_intr_show_attr_write_mbytes(
  1134. struct se_ml_stat_grps *lgrps, char *page)
  1135. {
  1136. struct se_lun_acl *lacl = container_of(lgrps,
  1137. struct se_lun_acl, ml_stat_grps);
  1138. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1139. struct se_dev_entry *deve;
  1140. ssize_t ret;
  1141. spin_lock_irq(&nacl->device_list_lock);
  1142. deve = nacl->device_list[lacl->mapped_lun];
  1143. if (!deve->se_lun || !deve->se_lun_acl) {
  1144. spin_unlock_irq(&nacl->device_list_lock);
  1145. return -ENODEV;
  1146. }
  1147. /* scsiAuthIntrWrittenMegaBytes */
  1148. ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(deve->write_bytes >> 20));
  1149. spin_unlock_irq(&nacl->device_list_lock);
  1150. return ret;
  1151. }
  1152. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(write_mbytes);
  1153. static ssize_t target_stat_scsi_auth_intr_show_attr_hs_num_cmds(
  1154. struct se_ml_stat_grps *lgrps, char *page)
  1155. {
  1156. struct se_lun_acl *lacl = container_of(lgrps,
  1157. struct se_lun_acl, ml_stat_grps);
  1158. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1159. struct se_dev_entry *deve;
  1160. ssize_t ret;
  1161. spin_lock_irq(&nacl->device_list_lock);
  1162. deve = nacl->device_list[lacl->mapped_lun];
  1163. if (!deve->se_lun || !deve->se_lun_acl) {
  1164. spin_unlock_irq(&nacl->device_list_lock);
  1165. return -ENODEV;
  1166. }
  1167. /* FIXME: scsiAuthIntrHSOutCommands */
  1168. ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
  1169. spin_unlock_irq(&nacl->device_list_lock);
  1170. return ret;
  1171. }
  1172. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(hs_num_cmds);
  1173. static ssize_t target_stat_scsi_auth_intr_show_attr_creation_time(
  1174. struct se_ml_stat_grps *lgrps, char *page)
  1175. {
  1176. struct se_lun_acl *lacl = container_of(lgrps,
  1177. struct se_lun_acl, ml_stat_grps);
  1178. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1179. struct se_dev_entry *deve;
  1180. ssize_t ret;
  1181. spin_lock_irq(&nacl->device_list_lock);
  1182. deve = nacl->device_list[lacl->mapped_lun];
  1183. if (!deve->se_lun || !deve->se_lun_acl) {
  1184. spin_unlock_irq(&nacl->device_list_lock);
  1185. return -ENODEV;
  1186. }
  1187. /* scsiAuthIntrLastCreation */
  1188. ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
  1189. INITIAL_JIFFIES) * 100 / HZ));
  1190. spin_unlock_irq(&nacl->device_list_lock);
  1191. return ret;
  1192. }
  1193. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(creation_time);
  1194. static ssize_t target_stat_scsi_auth_intr_show_attr_row_status(
  1195. struct se_ml_stat_grps *lgrps, char *page)
  1196. {
  1197. struct se_lun_acl *lacl = container_of(lgrps,
  1198. struct se_lun_acl, ml_stat_grps);
  1199. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1200. struct se_dev_entry *deve;
  1201. ssize_t ret;
  1202. spin_lock_irq(&nacl->device_list_lock);
  1203. deve = nacl->device_list[lacl->mapped_lun];
  1204. if (!deve->se_lun || !deve->se_lun_acl) {
  1205. spin_unlock_irq(&nacl->device_list_lock);
  1206. return -ENODEV;
  1207. }
  1208. /* FIXME: scsiAuthIntrRowStatus */
  1209. ret = snprintf(page, PAGE_SIZE, "Ready\n");
  1210. spin_unlock_irq(&nacl->device_list_lock);
  1211. return ret;
  1212. }
  1213. DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(row_status);
  1214. CONFIGFS_EATTR_OPS(target_stat_scsi_auth_intr, se_ml_stat_grps,
  1215. scsi_auth_intr_group);
  1216. static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
  1217. &target_stat_scsi_auth_intr_inst.attr,
  1218. &target_stat_scsi_auth_intr_dev.attr,
  1219. &target_stat_scsi_auth_intr_port.attr,
  1220. &target_stat_scsi_auth_intr_indx.attr,
  1221. &target_stat_scsi_auth_intr_dev_or_port.attr,
  1222. &target_stat_scsi_auth_intr_intr_name.attr,
  1223. &target_stat_scsi_auth_intr_map_indx.attr,
  1224. &target_stat_scsi_auth_intr_att_count.attr,
  1225. &target_stat_scsi_auth_intr_num_cmds.attr,
  1226. &target_stat_scsi_auth_intr_read_mbytes.attr,
  1227. &target_stat_scsi_auth_intr_write_mbytes.attr,
  1228. &target_stat_scsi_auth_intr_hs_num_cmds.attr,
  1229. &target_stat_scsi_auth_intr_creation_time.attr,
  1230. &target_stat_scsi_auth_intr_row_status.attr,
  1231. NULL,
  1232. };
  1233. static struct configfs_item_operations target_stat_scsi_auth_intr_attrib_ops = {
  1234. .show_attribute = target_stat_scsi_auth_intr_attr_show,
  1235. .store_attribute = target_stat_scsi_auth_intr_attr_store,
  1236. };
  1237. static struct config_item_type target_stat_scsi_auth_intr_cit = {
  1238. .ct_item_ops = &target_stat_scsi_auth_intr_attrib_ops,
  1239. .ct_attrs = target_stat_scsi_auth_intr_attrs,
  1240. .ct_owner = THIS_MODULE,
  1241. };
  1242. /*
  1243. * SCSI Attached Initiator Port Table
  1244. */
  1245. CONFIGFS_EATTR_STRUCT(target_stat_scsi_att_intr_port, se_ml_stat_grps);
  1246. #define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR(_name, _mode) \
  1247. static struct target_stat_scsi_att_intr_port_attribute \
  1248. target_stat_scsi_att_intr_port_##_name = \
  1249. __CONFIGFS_EATTR(_name, _mode, \
  1250. target_stat_scsi_att_intr_port_show_attr_##_name, \
  1251. target_stat_scsi_att_intr_port_store_attr_##_name);
  1252. #define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(_name) \
  1253. static struct target_stat_scsi_att_intr_port_attribute \
  1254. target_stat_scsi_att_intr_port_##_name = \
  1255. __CONFIGFS_EATTR_RO(_name, \
  1256. target_stat_scsi_att_intr_port_show_attr_##_name);
  1257. static ssize_t target_stat_scsi_att_intr_port_show_attr_inst(
  1258. struct se_ml_stat_grps *lgrps, char *page)
  1259. {
  1260. struct se_lun_acl *lacl = container_of(lgrps,
  1261. struct se_lun_acl, ml_stat_grps);
  1262. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1263. struct se_dev_entry *deve;
  1264. struct se_portal_group *tpg;
  1265. ssize_t ret;
  1266. spin_lock_irq(&nacl->device_list_lock);
  1267. deve = nacl->device_list[lacl->mapped_lun];
  1268. if (!deve->se_lun || !deve->se_lun_acl) {
  1269. spin_unlock_irq(&nacl->device_list_lock);
  1270. return -ENODEV;
  1271. }
  1272. tpg = nacl->se_tpg;
  1273. /* scsiInstIndex */
  1274. ret = snprintf(page, PAGE_SIZE, "%u\n",
  1275. tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
  1276. spin_unlock_irq(&nacl->device_list_lock);
  1277. return ret;
  1278. }
  1279. DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(inst);
  1280. static ssize_t target_stat_scsi_att_intr_port_show_attr_dev(
  1281. struct se_ml_stat_grps *lgrps, char *page)
  1282. {
  1283. struct se_lun_acl *lacl = container_of(lgrps,
  1284. struct se_lun_acl, ml_stat_grps);
  1285. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1286. struct se_dev_entry *deve;
  1287. struct se_lun *lun;
  1288. ssize_t ret;
  1289. spin_lock_irq(&nacl->device_list_lock);
  1290. deve = nacl->device_list[lacl->mapped_lun];
  1291. if (!deve->se_lun || !deve->se_lun_acl) {
  1292. spin_unlock_irq(&nacl->device_list_lock);
  1293. return -ENODEV;
  1294. }
  1295. lun = deve->se_lun;
  1296. /* scsiDeviceIndex */
  1297. ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_se_dev->dev_index);
  1298. spin_unlock_irq(&nacl->device_list_lock);
  1299. return ret;
  1300. }
  1301. DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(dev);
  1302. static ssize_t target_stat_scsi_att_intr_port_show_attr_port(
  1303. struct se_ml_stat_grps *lgrps, char *page)
  1304. {
  1305. struct se_lun_acl *lacl = container_of(lgrps,
  1306. struct se_lun_acl, ml_stat_grps);
  1307. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1308. struct se_dev_entry *deve;
  1309. struct se_portal_group *tpg;
  1310. ssize_t ret;
  1311. spin_lock_irq(&nacl->device_list_lock);
  1312. deve = nacl->device_list[lacl->mapped_lun];
  1313. if (!deve->se_lun || !deve->se_lun_acl) {
  1314. spin_unlock_irq(&nacl->device_list_lock);
  1315. return -ENODEV;
  1316. }
  1317. tpg = nacl->se_tpg;
  1318. /* scsiPortIndex */
  1319. ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
  1320. spin_unlock_irq(&nacl->device_list_lock);
  1321. return ret;
  1322. }
  1323. DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port);
  1324. static ssize_t target_stat_scsi_att_intr_port_show_attr_indx(
  1325. struct se_ml_stat_grps *lgrps, char *page)
  1326. {
  1327. struct se_lun_acl *lacl = container_of(lgrps,
  1328. struct se_lun_acl, ml_stat_grps);
  1329. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1330. struct se_session *se_sess;
  1331. struct se_portal_group *tpg;
  1332. ssize_t ret;
  1333. spin_lock_irq(&nacl->nacl_sess_lock);
  1334. se_sess = nacl->nacl_sess;
  1335. if (!se_sess) {
  1336. spin_unlock_irq(&nacl->nacl_sess_lock);
  1337. return -ENODEV;
  1338. }
  1339. tpg = nacl->se_tpg;
  1340. /* scsiAttIntrPortIndex */
  1341. ret = snprintf(page, PAGE_SIZE, "%u\n",
  1342. tpg->se_tpg_tfo->sess_get_index(se_sess));
  1343. spin_unlock_irq(&nacl->nacl_sess_lock);
  1344. return ret;
  1345. }
  1346. DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(indx);
  1347. static ssize_t target_stat_scsi_att_intr_port_show_attr_port_auth_indx(
  1348. struct se_ml_stat_grps *lgrps, char *page)
  1349. {
  1350. struct se_lun_acl *lacl = container_of(lgrps,
  1351. struct se_lun_acl, ml_stat_grps);
  1352. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1353. struct se_dev_entry *deve;
  1354. ssize_t ret;
  1355. spin_lock_irq(&nacl->device_list_lock);
  1356. deve = nacl->device_list[lacl->mapped_lun];
  1357. if (!deve->se_lun || !deve->se_lun_acl) {
  1358. spin_unlock_irq(&nacl->device_list_lock);
  1359. return -ENODEV;
  1360. }
  1361. /* scsiAttIntrPortAuthIntrIdx */
  1362. ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
  1363. spin_unlock_irq(&nacl->device_list_lock);
  1364. return ret;
  1365. }
  1366. DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_auth_indx);
  1367. static ssize_t target_stat_scsi_att_intr_port_show_attr_port_ident(
  1368. struct se_ml_stat_grps *lgrps, char *page)
  1369. {
  1370. struct se_lun_acl *lacl = container_of(lgrps,
  1371. struct se_lun_acl, ml_stat_grps);
  1372. struct se_node_acl *nacl = lacl->se_lun_nacl;
  1373. struct se_session *se_sess;
  1374. struct se_portal_group *tpg;
  1375. ssize_t ret;
  1376. unsigned char buf[64];
  1377. spin_lock_irq(&nacl->nacl_sess_lock);
  1378. se_sess = nacl->nacl_sess;
  1379. if (!se_sess) {
  1380. spin_unlock_irq(&nacl->nacl_sess_lock);
  1381. return -ENODEV;
  1382. }
  1383. tpg = nacl->se_tpg;
  1384. /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
  1385. memset(buf, 0, 64);
  1386. if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
  1387. tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
  1388. ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
  1389. spin_unlock_irq(&nacl->nacl_sess_lock);
  1390. return ret;
  1391. }
  1392. DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_ident);
  1393. CONFIGFS_EATTR_OPS(target_stat_scsi_att_intr_port, se_ml_stat_grps,
  1394. scsi_att_intr_port_group);
  1395. static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
  1396. &target_stat_scsi_att_intr_port_inst.attr,
  1397. &target_stat_scsi_att_intr_port_dev.attr,
  1398. &target_stat_scsi_att_intr_port_port.attr,
  1399. &target_stat_scsi_att_intr_port_indx.attr,
  1400. &target_stat_scsi_att_intr_port_port_auth_indx.attr,
  1401. &target_stat_scsi_att_intr_port_port_ident.attr,
  1402. NULL,
  1403. };
  1404. static struct configfs_item_operations target_stat_scsi_att_intr_port_attrib_ops = {
  1405. .show_attribute = target_stat_scsi_att_intr_port_attr_show,
  1406. .store_attribute = target_stat_scsi_att_intr_port_attr_store,
  1407. };
  1408. static struct config_item_type target_stat_scsi_att_intr_port_cit = {
  1409. .ct_item_ops = &target_stat_scsi_att_intr_port_attrib_ops,
  1410. .ct_attrs = target_stat_scsi_ath_intr_port_attrs,
  1411. .ct_owner = THIS_MODULE,
  1412. };
  1413. /*
  1414. * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
  1415. * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
  1416. */
  1417. void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
  1418. {
  1419. struct config_group *ml_stat_grp = &lacl->ml_stat_grps.stat_group;
  1420. config_group_init_type_name(&lacl->ml_stat_grps.scsi_auth_intr_group,
  1421. "scsi_auth_intr", &target_stat_scsi_auth_intr_cit);
  1422. config_group_init_type_name(&lacl->ml_stat_grps.scsi_att_intr_port_group,
  1423. "scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit);
  1424. ml_stat_grp->default_groups[0] = &lacl->ml_stat_grps.scsi_auth_intr_group;
  1425. ml_stat_grp->default_groups[1] = &lacl->ml_stat_grps.scsi_att_intr_port_group;
  1426. ml_stat_grp->default_groups[2] = NULL;
  1427. }