target_core_stat.c 46 KB

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