blob: d154ce7971801c54a86bcf6f510246826aa67371 [file] [log] [blame]
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001/*******************************************************************************
2 * Filename: target_core_stat.c
3 *
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07004 * Modern ConfigFS group context specific statistics based on original
5 * target_core_mib.c code
6 *
Nicholas Bellingerfd9a11d2012-11-09 14:51:48 -08007 * (c) Copyright 2006-2012 RisingTide Systems LLC.
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07008 *
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
27#include <linux/kernel.h>
28#include <linux/module.h>
29#include <linux/delay.h>
30#include <linux/timer.h>
31#include <linux/string.h>
Nicholas Bellinger12d2338422011-03-14 04:06:11 -070032#include <linux/utsname.h>
33#include <linux/proc_fs.h>
34#include <linux/seq_file.h>
35#include <linux/blkdev.h>
36#include <linux/configfs.h>
37#include <scsi/scsi.h>
38#include <scsi/scsi_device.h>
39#include <scsi/scsi_host.h>
40
41#include <target/target_core_base.h>
Christoph Hellwigc4795fb2011-11-16 09:46:48 -050042#include <target/target_core_backend.h>
43#include <target/target_core_fabric.h>
Nicholas Bellinger12d2338422011-03-14 04:06:11 -070044#include <target/target_core_configfs.h>
45#include <target/configfs_macros.h>
46
Christoph Hellwige26d99a2011-11-14 12:30:30 -050047#include "target_core_internal.h"
Nicholas Bellinger12d2338422011-03-14 04:06:11 -070048
49#ifndef INITIAL_JIFFIES
50#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
51#endif
52
53#define NONE "None"
54#define ISPRINT(a) ((a >= ' ') && (a <= '~'))
55
56#define SCSI_LU_INDEX 1
57#define LU_COUNT 1
58
59/*
60 * SCSI Device Table
61 */
62
63CONFIGFS_EATTR_STRUCT(target_stat_scsi_dev, se_dev_stat_grps);
64#define DEV_STAT_SCSI_DEV_ATTR(_name, _mode) \
65static struct target_stat_scsi_dev_attribute \
66 target_stat_scsi_dev_##_name = \
67 __CONFIGFS_EATTR(_name, _mode, \
68 target_stat_scsi_dev_show_attr_##_name, \
69 target_stat_scsi_dev_store_attr_##_name);
70
71#define DEV_STAT_SCSI_DEV_ATTR_RO(_name) \
72static struct target_stat_scsi_dev_attribute \
73 target_stat_scsi_dev_##_name = \
74 __CONFIGFS_EATTR_RO(_name, \
75 target_stat_scsi_dev_show_attr_##_name);
76
77static ssize_t target_stat_scsi_dev_show_attr_inst(
78 struct se_dev_stat_grps *sgrps, char *page)
79{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -040080 struct se_device *dev =
81 container_of(sgrps, struct se_device, dev_stat_grps);
82 struct se_hba *hba = dev->se_hba;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -070083
84 return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
85}
86DEV_STAT_SCSI_DEV_ATTR_RO(inst);
87
88static ssize_t target_stat_scsi_dev_show_attr_indx(
89 struct se_dev_stat_grps *sgrps, char *page)
90{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -040091 struct se_device *dev =
92 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -070093
94 return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
95}
96DEV_STAT_SCSI_DEV_ATTR_RO(indx);
97
98static ssize_t target_stat_scsi_dev_show_attr_role(
99 struct se_dev_stat_grps *sgrps, char *page)
100{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700101 return snprintf(page, PAGE_SIZE, "Target\n");
102}
103DEV_STAT_SCSI_DEV_ATTR_RO(role);
104
105static ssize_t target_stat_scsi_dev_show_attr_ports(
106 struct se_dev_stat_grps *sgrps, char *page)
107{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400108 struct se_device *dev =
109 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700110
111 return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_port_count);
112}
113DEV_STAT_SCSI_DEV_ATTR_RO(ports);
114
115CONFIGFS_EATTR_OPS(target_stat_scsi_dev, se_dev_stat_grps, scsi_dev_group);
116
117static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
118 &target_stat_scsi_dev_inst.attr,
119 &target_stat_scsi_dev_indx.attr,
120 &target_stat_scsi_dev_role.attr,
121 &target_stat_scsi_dev_ports.attr,
122 NULL,
123};
124
125static struct configfs_item_operations target_stat_scsi_dev_attrib_ops = {
126 .show_attribute = target_stat_scsi_dev_attr_show,
127 .store_attribute = target_stat_scsi_dev_attr_store,
128};
129
130static struct config_item_type target_stat_scsi_dev_cit = {
131 .ct_item_ops = &target_stat_scsi_dev_attrib_ops,
132 .ct_attrs = target_stat_scsi_dev_attrs,
133 .ct_owner = THIS_MODULE,
134};
135
136/*
137 * SCSI Target Device Table
138 */
139
140CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_dev, se_dev_stat_grps);
141#define DEV_STAT_SCSI_TGT_DEV_ATTR(_name, _mode) \
142static struct target_stat_scsi_tgt_dev_attribute \
143 target_stat_scsi_tgt_dev_##_name = \
144 __CONFIGFS_EATTR(_name, _mode, \
145 target_stat_scsi_tgt_dev_show_attr_##_name, \
146 target_stat_scsi_tgt_dev_store_attr_##_name);
147
148#define DEV_STAT_SCSI_TGT_DEV_ATTR_RO(_name) \
149static struct target_stat_scsi_tgt_dev_attribute \
150 target_stat_scsi_tgt_dev_##_name = \
151 __CONFIGFS_EATTR_RO(_name, \
152 target_stat_scsi_tgt_dev_show_attr_##_name);
153
154static ssize_t target_stat_scsi_tgt_dev_show_attr_inst(
155 struct se_dev_stat_grps *sgrps, char *page)
156{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400157 struct se_device *dev =
158 container_of(sgrps, struct se_device, dev_stat_grps);
159 struct se_hba *hba = dev->se_hba;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700160
161 return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
162}
163DEV_STAT_SCSI_TGT_DEV_ATTR_RO(inst);
164
165static ssize_t target_stat_scsi_tgt_dev_show_attr_indx(
166 struct se_dev_stat_grps *sgrps, char *page)
167{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400168 struct se_device *dev =
169 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700170
171 return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
172}
173DEV_STAT_SCSI_TGT_DEV_ATTR_RO(indx);
174
175static ssize_t target_stat_scsi_tgt_dev_show_attr_num_lus(
176 struct se_dev_stat_grps *sgrps, char *page)
177{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700178 return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
179}
180DEV_STAT_SCSI_TGT_DEV_ATTR_RO(num_lus);
181
182static ssize_t target_stat_scsi_tgt_dev_show_attr_status(
183 struct se_dev_stat_grps *sgrps, char *page)
184{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400185 struct se_device *dev =
186 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700187
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400188 if (dev->export_count)
189 return snprintf(page, PAGE_SIZE, "activated");
190 else
191 return snprintf(page, PAGE_SIZE, "deactivated");
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700192}
193DEV_STAT_SCSI_TGT_DEV_ATTR_RO(status);
194
195static ssize_t target_stat_scsi_tgt_dev_show_attr_non_access_lus(
196 struct se_dev_stat_grps *sgrps, char *page)
197{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400198 struct se_device *dev =
199 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700200 int non_accessible_lus;
201
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400202 if (dev->export_count)
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700203 non_accessible_lus = 0;
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400204 else
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700205 non_accessible_lus = 1;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700206
207 return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
208}
209DEV_STAT_SCSI_TGT_DEV_ATTR_RO(non_access_lus);
210
211static ssize_t target_stat_scsi_tgt_dev_show_attr_resets(
212 struct se_dev_stat_grps *sgrps, char *page)
213{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400214 struct se_device *dev =
215 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700216
217 return snprintf(page, PAGE_SIZE, "%u\n", dev->num_resets);
218}
219DEV_STAT_SCSI_TGT_DEV_ATTR_RO(resets);
220
221
222CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_dev, se_dev_stat_grps, scsi_tgt_dev_group);
223
224static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
225 &target_stat_scsi_tgt_dev_inst.attr,
226 &target_stat_scsi_tgt_dev_indx.attr,
227 &target_stat_scsi_tgt_dev_num_lus.attr,
228 &target_stat_scsi_tgt_dev_status.attr,
229 &target_stat_scsi_tgt_dev_non_access_lus.attr,
230 &target_stat_scsi_tgt_dev_resets.attr,
231 NULL,
232};
233
234static struct configfs_item_operations target_stat_scsi_tgt_dev_attrib_ops = {
235 .show_attribute = target_stat_scsi_tgt_dev_attr_show,
236 .store_attribute = target_stat_scsi_tgt_dev_attr_store,
237};
238
239static struct config_item_type target_stat_scsi_tgt_dev_cit = {
240 .ct_item_ops = &target_stat_scsi_tgt_dev_attrib_ops,
241 .ct_attrs = target_stat_scsi_tgt_dev_attrs,
242 .ct_owner = THIS_MODULE,
243};
244
245/*
246 * SCSI Logical Unit Table
247 */
248
249CONFIGFS_EATTR_STRUCT(target_stat_scsi_lu, se_dev_stat_grps);
250#define DEV_STAT_SCSI_LU_ATTR(_name, _mode) \
251static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
252 __CONFIGFS_EATTR(_name, _mode, \
253 target_stat_scsi_lu_show_attr_##_name, \
254 target_stat_scsi_lu_store_attr_##_name);
255
256#define DEV_STAT_SCSI_LU_ATTR_RO(_name) \
257static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
258 __CONFIGFS_EATTR_RO(_name, \
259 target_stat_scsi_lu_show_attr_##_name);
260
261static ssize_t target_stat_scsi_lu_show_attr_inst(
262 struct se_dev_stat_grps *sgrps, char *page)
263{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400264 struct se_device *dev =
265 container_of(sgrps, struct se_device, dev_stat_grps);
266 struct se_hba *hba = dev->se_hba;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700267
268 return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
269}
270DEV_STAT_SCSI_LU_ATTR_RO(inst);
271
272static ssize_t target_stat_scsi_lu_show_attr_dev(
273 struct se_dev_stat_grps *sgrps, char *page)
274{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400275 struct se_device *dev =
276 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700277
278 return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
279}
280DEV_STAT_SCSI_LU_ATTR_RO(dev);
281
282static ssize_t target_stat_scsi_lu_show_attr_indx(
283 struct se_dev_stat_grps *sgrps, char *page)
284{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700285 return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
286}
287DEV_STAT_SCSI_LU_ATTR_RO(indx);
288
289static ssize_t target_stat_scsi_lu_show_attr_lun(
290 struct se_dev_stat_grps *sgrps, char *page)
291{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700292 /* FIXME: scsiLuDefaultLun */
293 return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
294}
295DEV_STAT_SCSI_LU_ATTR_RO(lun);
296
297static ssize_t target_stat_scsi_lu_show_attr_lu_name(
298 struct se_dev_stat_grps *sgrps, char *page)
299{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400300 struct se_device *dev =
301 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700302
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700303 /* scsiLuWwnName */
304 return snprintf(page, PAGE_SIZE, "%s\n",
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400305 (strlen(dev->t10_wwn.unit_serial)) ?
306 dev->t10_wwn.unit_serial : "None");
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700307}
308DEV_STAT_SCSI_LU_ATTR_RO(lu_name);
309
310static ssize_t target_stat_scsi_lu_show_attr_vend(
311 struct se_dev_stat_grps *sgrps, char *page)
312{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400313 struct se_device *dev =
314 container_of(sgrps, struct se_device, dev_stat_grps);
Andy Grovere3d6f902011-07-19 08:55:10 +0000315 int i;
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400316 char str[sizeof(dev->t10_wwn.vendor)+1];
Andy Grovere3d6f902011-07-19 08:55:10 +0000317
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700318 /* scsiLuVendorId */
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400319 for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
320 str[i] = ISPRINT(dev->t10_wwn.vendor[i]) ?
321 dev->t10_wwn.vendor[i] : ' ';
Andy Grovere3d6f902011-07-19 08:55:10 +0000322 str[i] = '\0';
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700323 return snprintf(page, PAGE_SIZE, "%s\n", str);
324}
325DEV_STAT_SCSI_LU_ATTR_RO(vend);
326
327static ssize_t target_stat_scsi_lu_show_attr_prod(
328 struct se_dev_stat_grps *sgrps, char *page)
329{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400330 struct se_device *dev =
331 container_of(sgrps, struct se_device, dev_stat_grps);
Andy Grovere3d6f902011-07-19 08:55:10 +0000332 int i;
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400333 char str[sizeof(dev->t10_wwn.model)+1];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700334
335 /* scsiLuProductId */
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400336 for (i = 0; i < sizeof(dev->t10_wwn.vendor); i++)
337 str[i] = ISPRINT(dev->t10_wwn.model[i]) ?
338 dev->t10_wwn.model[i] : ' ';
Andy Grovere3d6f902011-07-19 08:55:10 +0000339 str[i] = '\0';
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700340 return snprintf(page, PAGE_SIZE, "%s\n", str);
341}
342DEV_STAT_SCSI_LU_ATTR_RO(prod);
343
344static ssize_t target_stat_scsi_lu_show_attr_rev(
345 struct se_dev_stat_grps *sgrps, char *page)
346{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400347 struct se_device *dev =
348 container_of(sgrps, struct se_device, dev_stat_grps);
Andy Grovere3d6f902011-07-19 08:55:10 +0000349 int i;
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400350 char str[sizeof(dev->t10_wwn.revision)+1];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700351
352 /* scsiLuRevisionId */
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400353 for (i = 0; i < sizeof(dev->t10_wwn.revision); i++)
354 str[i] = ISPRINT(dev->t10_wwn.revision[i]) ?
355 dev->t10_wwn.revision[i] : ' ';
Andy Grovere3d6f902011-07-19 08:55:10 +0000356 str[i] = '\0';
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700357 return snprintf(page, PAGE_SIZE, "%s\n", str);
358}
359DEV_STAT_SCSI_LU_ATTR_RO(rev);
360
361static ssize_t target_stat_scsi_lu_show_attr_dev_type(
362 struct se_dev_stat_grps *sgrps, char *page)
363{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400364 struct se_device *dev =
365 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700366
367 /* scsiLuPeripheralType */
368 return snprintf(page, PAGE_SIZE, "%u\n",
Andy Grovere3d6f902011-07-19 08:55:10 +0000369 dev->transport->get_device_type(dev));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700370}
371DEV_STAT_SCSI_LU_ATTR_RO(dev_type);
372
373static ssize_t target_stat_scsi_lu_show_attr_status(
374 struct se_dev_stat_grps *sgrps, char *page)
375{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400376 struct se_device *dev =
377 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700378
379 /* scsiLuStatus */
380 return snprintf(page, PAGE_SIZE, "%s\n",
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400381 (dev->export_count) ? "available" : "notavailable");
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700382}
383DEV_STAT_SCSI_LU_ATTR_RO(status);
384
385static ssize_t target_stat_scsi_lu_show_attr_state_bit(
386 struct se_dev_stat_grps *sgrps, char *page)
387{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700388 /* scsiLuState */
389 return snprintf(page, PAGE_SIZE, "exposed\n");
390}
391DEV_STAT_SCSI_LU_ATTR_RO(state_bit);
392
393static ssize_t target_stat_scsi_lu_show_attr_num_cmds(
394 struct se_dev_stat_grps *sgrps, char *page)
395{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400396 struct se_device *dev =
397 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700398
399 /* scsiLuNumCommands */
400 return snprintf(page, PAGE_SIZE, "%llu\n",
401 (unsigned long long)dev->num_cmds);
402}
403DEV_STAT_SCSI_LU_ATTR_RO(num_cmds);
404
405static ssize_t target_stat_scsi_lu_show_attr_read_mbytes(
406 struct se_dev_stat_grps *sgrps, char *page)
407{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400408 struct se_device *dev =
409 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700410
411 /* scsiLuReadMegaBytes */
412 return snprintf(page, PAGE_SIZE, "%u\n", (u32)(dev->read_bytes >> 20));
413}
414DEV_STAT_SCSI_LU_ATTR_RO(read_mbytes);
415
416static ssize_t target_stat_scsi_lu_show_attr_write_mbytes(
417 struct se_dev_stat_grps *sgrps, char *page)
418{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400419 struct se_device *dev =
420 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700421
422 /* scsiLuWrittenMegaBytes */
423 return snprintf(page, PAGE_SIZE, "%u\n", (u32)(dev->write_bytes >> 20));
424}
425DEV_STAT_SCSI_LU_ATTR_RO(write_mbytes);
426
427static ssize_t target_stat_scsi_lu_show_attr_resets(
428 struct se_dev_stat_grps *sgrps, char *page)
429{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400430 struct se_device *dev =
431 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700432
433 /* scsiLuInResets */
434 return snprintf(page, PAGE_SIZE, "%u\n", dev->num_resets);
435}
436DEV_STAT_SCSI_LU_ATTR_RO(resets);
437
438static ssize_t target_stat_scsi_lu_show_attr_full_stat(
439 struct se_dev_stat_grps *sgrps, char *page)
440{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700441 /* FIXME: scsiLuOutTaskSetFullStatus */
442 return snprintf(page, PAGE_SIZE, "%u\n", 0);
443}
444DEV_STAT_SCSI_LU_ATTR_RO(full_stat);
445
446static ssize_t target_stat_scsi_lu_show_attr_hs_num_cmds(
447 struct se_dev_stat_grps *sgrps, char *page)
448{
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700449 /* FIXME: scsiLuHSInCommands */
450 return snprintf(page, PAGE_SIZE, "%u\n", 0);
451}
452DEV_STAT_SCSI_LU_ATTR_RO(hs_num_cmds);
453
454static ssize_t target_stat_scsi_lu_show_attr_creation_time(
455 struct se_dev_stat_grps *sgrps, char *page)
456{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400457 struct se_device *dev =
458 container_of(sgrps, struct se_device, dev_stat_grps);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700459
460 /* scsiLuCreationTime */
461 return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
462 INITIAL_JIFFIES) * 100 / HZ));
463}
464DEV_STAT_SCSI_LU_ATTR_RO(creation_time);
465
466CONFIGFS_EATTR_OPS(target_stat_scsi_lu, se_dev_stat_grps, scsi_lu_group);
467
468static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
469 &target_stat_scsi_lu_inst.attr,
470 &target_stat_scsi_lu_dev.attr,
471 &target_stat_scsi_lu_indx.attr,
472 &target_stat_scsi_lu_lun.attr,
473 &target_stat_scsi_lu_lu_name.attr,
474 &target_stat_scsi_lu_vend.attr,
475 &target_stat_scsi_lu_prod.attr,
476 &target_stat_scsi_lu_rev.attr,
477 &target_stat_scsi_lu_dev_type.attr,
478 &target_stat_scsi_lu_status.attr,
479 &target_stat_scsi_lu_state_bit.attr,
480 &target_stat_scsi_lu_num_cmds.attr,
481 &target_stat_scsi_lu_read_mbytes.attr,
482 &target_stat_scsi_lu_write_mbytes.attr,
483 &target_stat_scsi_lu_resets.attr,
484 &target_stat_scsi_lu_full_stat.attr,
485 &target_stat_scsi_lu_hs_num_cmds.attr,
486 &target_stat_scsi_lu_creation_time.attr,
487 NULL,
488};
489
490static struct configfs_item_operations target_stat_scsi_lu_attrib_ops = {
491 .show_attribute = target_stat_scsi_lu_attr_show,
492 .store_attribute = target_stat_scsi_lu_attr_store,
493};
494
495static struct config_item_type target_stat_scsi_lu_cit = {
496 .ct_item_ops = &target_stat_scsi_lu_attrib_ops,
497 .ct_attrs = target_stat_scsi_lu_attrs,
498 .ct_owner = THIS_MODULE,
499};
500
501/*
502 * Called from target_core_configfs.c:target_core_make_subdev() to setup
503 * the target statistics groups + configfs CITs located in target_core_stat.c
504 */
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400505void target_stat_setup_dev_default_groups(struct se_device *dev)
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700506{
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400507 struct config_group *dev_stat_grp = &dev->dev_stat_grps.stat_group;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700508
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400509 config_group_init_type_name(&dev->dev_stat_grps.scsi_dev_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700510 "scsi_dev", &target_stat_scsi_dev_cit);
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400511 config_group_init_type_name(&dev->dev_stat_grps.scsi_tgt_dev_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700512 "scsi_tgt_dev", &target_stat_scsi_tgt_dev_cit);
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400513 config_group_init_type_name(&dev->dev_stat_grps.scsi_lu_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700514 "scsi_lu", &target_stat_scsi_lu_cit);
515
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -0400516 dev_stat_grp->default_groups[0] = &dev->dev_stat_grps.scsi_dev_group;
517 dev_stat_grp->default_groups[1] = &dev->dev_stat_grps.scsi_tgt_dev_group;
518 dev_stat_grp->default_groups[2] = &dev->dev_stat_grps.scsi_lu_group;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700519 dev_stat_grp->default_groups[3] = NULL;
520}
521
522/*
523 * SCSI Port Table
524 */
525
526CONFIGFS_EATTR_STRUCT(target_stat_scsi_port, se_port_stat_grps);
527#define DEV_STAT_SCSI_PORT_ATTR(_name, _mode) \
528static struct target_stat_scsi_port_attribute \
529 target_stat_scsi_port_##_name = \
530 __CONFIGFS_EATTR(_name, _mode, \
531 target_stat_scsi_port_show_attr_##_name, \
532 target_stat_scsi_port_store_attr_##_name);
533
534#define DEV_STAT_SCSI_PORT_ATTR_RO(_name) \
535static struct target_stat_scsi_port_attribute \
536 target_stat_scsi_port_##_name = \
537 __CONFIGFS_EATTR_RO(_name, \
538 target_stat_scsi_port_show_attr_##_name);
539
540static ssize_t target_stat_scsi_port_show_attr_inst(
541 struct se_port_stat_grps *pgrps, char *page)
542{
543 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
544 struct se_port *sep;
545 struct se_device *dev = lun->lun_se_dev;
546 struct se_hba *hba;
547 ssize_t ret;
548
549 spin_lock(&lun->lun_sep_lock);
550 sep = lun->lun_sep;
551 if (!sep) {
552 spin_unlock(&lun->lun_sep_lock);
553 return -ENODEV;
554 }
555 hba = dev->se_hba;
556 ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
557 spin_unlock(&lun->lun_sep_lock);
558 return ret;
559}
560DEV_STAT_SCSI_PORT_ATTR_RO(inst);
561
562static ssize_t target_stat_scsi_port_show_attr_dev(
563 struct se_port_stat_grps *pgrps, char *page)
564{
565 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
566 struct se_port *sep;
567 struct se_device *dev = lun->lun_se_dev;
568 ssize_t ret;
569
570 spin_lock(&lun->lun_sep_lock);
571 sep = lun->lun_sep;
572 if (!sep) {
573 spin_unlock(&lun->lun_sep_lock);
574 return -ENODEV;
575 }
576 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
577 spin_unlock(&lun->lun_sep_lock);
578 return ret;
579}
580DEV_STAT_SCSI_PORT_ATTR_RO(dev);
581
582static ssize_t target_stat_scsi_port_show_attr_indx(
583 struct se_port_stat_grps *pgrps, char *page)
584{
585 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
586 struct se_port *sep;
587 ssize_t ret;
588
589 spin_lock(&lun->lun_sep_lock);
590 sep = lun->lun_sep;
591 if (!sep) {
592 spin_unlock(&lun->lun_sep_lock);
593 return -ENODEV;
594 }
595 ret = snprintf(page, PAGE_SIZE, "%u\n", sep->sep_index);
596 spin_unlock(&lun->lun_sep_lock);
597 return ret;
598}
599DEV_STAT_SCSI_PORT_ATTR_RO(indx);
600
601static ssize_t target_stat_scsi_port_show_attr_role(
602 struct se_port_stat_grps *pgrps, char *page)
603{
604 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
605 struct se_device *dev = lun->lun_se_dev;
606 struct se_port *sep;
607 ssize_t ret;
608
609 if (!dev)
610 return -ENODEV;
611
612 spin_lock(&lun->lun_sep_lock);
613 sep = lun->lun_sep;
614 if (!sep) {
615 spin_unlock(&lun->lun_sep_lock);
616 return -ENODEV;
617 }
618 ret = snprintf(page, PAGE_SIZE, "%s%u\n", "Device", dev->dev_index);
619 spin_unlock(&lun->lun_sep_lock);
620 return ret;
621}
622DEV_STAT_SCSI_PORT_ATTR_RO(role);
623
624static ssize_t target_stat_scsi_port_show_attr_busy_count(
625 struct se_port_stat_grps *pgrps, char *page)
626{
627 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
628 struct se_port *sep;
629 ssize_t ret;
630
631 spin_lock(&lun->lun_sep_lock);
632 sep = lun->lun_sep;
633 if (!sep) {
634 spin_unlock(&lun->lun_sep_lock);
635 return -ENODEV;
636 }
637 /* FIXME: scsiPortBusyStatuses */
638 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
639 spin_unlock(&lun->lun_sep_lock);
640 return ret;
641}
642DEV_STAT_SCSI_PORT_ATTR_RO(busy_count);
643
644CONFIGFS_EATTR_OPS(target_stat_scsi_port, se_port_stat_grps, scsi_port_group);
645
646static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
647 &target_stat_scsi_port_inst.attr,
648 &target_stat_scsi_port_dev.attr,
649 &target_stat_scsi_port_indx.attr,
650 &target_stat_scsi_port_role.attr,
651 &target_stat_scsi_port_busy_count.attr,
652 NULL,
653};
654
655static struct configfs_item_operations target_stat_scsi_port_attrib_ops = {
656 .show_attribute = target_stat_scsi_port_attr_show,
657 .store_attribute = target_stat_scsi_port_attr_store,
658};
659
660static struct config_item_type target_stat_scsi_port_cit = {
661 .ct_item_ops = &target_stat_scsi_port_attrib_ops,
662 .ct_attrs = target_stat_scsi_port_attrs,
663 .ct_owner = THIS_MODULE,
664};
665
666/*
667 * SCSI Target Port Table
668 */
669CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_port, se_port_stat_grps);
670#define DEV_STAT_SCSI_TGT_PORT_ATTR(_name, _mode) \
671static struct target_stat_scsi_tgt_port_attribute \
672 target_stat_scsi_tgt_port_##_name = \
673 __CONFIGFS_EATTR(_name, _mode, \
674 target_stat_scsi_tgt_port_show_attr_##_name, \
675 target_stat_scsi_tgt_port_store_attr_##_name);
676
677#define DEV_STAT_SCSI_TGT_PORT_ATTR_RO(_name) \
678static struct target_stat_scsi_tgt_port_attribute \
679 target_stat_scsi_tgt_port_##_name = \
680 __CONFIGFS_EATTR_RO(_name, \
681 target_stat_scsi_tgt_port_show_attr_##_name);
682
683static ssize_t target_stat_scsi_tgt_port_show_attr_inst(
684 struct se_port_stat_grps *pgrps, char *page)
685{
686 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
687 struct se_device *dev = lun->lun_se_dev;
688 struct se_port *sep;
689 struct se_hba *hba;
690 ssize_t ret;
691
692 spin_lock(&lun->lun_sep_lock);
693 sep = lun->lun_sep;
694 if (!sep) {
695 spin_unlock(&lun->lun_sep_lock);
696 return -ENODEV;
697 }
698 hba = dev->se_hba;
699 ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
700 spin_unlock(&lun->lun_sep_lock);
701 return ret;
702}
703DEV_STAT_SCSI_TGT_PORT_ATTR_RO(inst);
704
705static ssize_t target_stat_scsi_tgt_port_show_attr_dev(
706 struct se_port_stat_grps *pgrps, char *page)
707{
708 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
709 struct se_device *dev = lun->lun_se_dev;
710 struct se_port *sep;
711 ssize_t ret;
712
713 spin_lock(&lun->lun_sep_lock);
714 sep = lun->lun_sep;
715 if (!sep) {
716 spin_unlock(&lun->lun_sep_lock);
717 return -ENODEV;
718 }
719 ret = snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
720 spin_unlock(&lun->lun_sep_lock);
721 return ret;
722}
723DEV_STAT_SCSI_TGT_PORT_ATTR_RO(dev);
724
725static ssize_t target_stat_scsi_tgt_port_show_attr_indx(
726 struct se_port_stat_grps *pgrps, char *page)
727{
728 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
729 struct se_port *sep;
730 ssize_t ret;
731
732 spin_lock(&lun->lun_sep_lock);
733 sep = lun->lun_sep;
734 if (!sep) {
735 spin_unlock(&lun->lun_sep_lock);
736 return -ENODEV;
737 }
738 ret = snprintf(page, PAGE_SIZE, "%u\n", sep->sep_index);
739 spin_unlock(&lun->lun_sep_lock);
740 return ret;
741}
742DEV_STAT_SCSI_TGT_PORT_ATTR_RO(indx);
743
744static ssize_t target_stat_scsi_tgt_port_show_attr_name(
745 struct se_port_stat_grps *pgrps, char *page)
746{
747 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
748 struct se_port *sep;
749 struct se_portal_group *tpg;
750 ssize_t ret;
751
752 spin_lock(&lun->lun_sep_lock);
753 sep = lun->lun_sep;
754 if (!sep) {
755 spin_unlock(&lun->lun_sep_lock);
756 return -ENODEV;
757 }
758 tpg = sep->sep_tpg;
759
760 ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
Andy Grovere3d6f902011-07-19 08:55:10 +0000761 tpg->se_tpg_tfo->get_fabric_name(), sep->sep_index);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700762 spin_unlock(&lun->lun_sep_lock);
763 return ret;
764}
765DEV_STAT_SCSI_TGT_PORT_ATTR_RO(name);
766
767static ssize_t target_stat_scsi_tgt_port_show_attr_port_index(
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_port *sep;
772 struct se_portal_group *tpg;
773 ssize_t ret;
774
775 spin_lock(&lun->lun_sep_lock);
776 sep = lun->lun_sep;
777 if (!sep) {
778 spin_unlock(&lun->lun_sep_lock);
779 return -ENODEV;
780 }
781 tpg = sep->sep_tpg;
782
783 ret = snprintf(page, PAGE_SIZE, "%s%s%d\n",
Andy Grovere3d6f902011-07-19 08:55:10 +0000784 tpg->se_tpg_tfo->tpg_get_wwn(tpg), "+t+",
785 tpg->se_tpg_tfo->tpg_get_tag(tpg));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700786 spin_unlock(&lun->lun_sep_lock);
787 return ret;
788}
789DEV_STAT_SCSI_TGT_PORT_ATTR_RO(port_index);
790
791static ssize_t target_stat_scsi_tgt_port_show_attr_in_cmds(
792 struct se_port_stat_grps *pgrps, char *page)
793{
794 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
795 struct se_port *sep;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700796 ssize_t ret;
797
798 spin_lock(&lun->lun_sep_lock);
799 sep = lun->lun_sep;
800 if (!sep) {
801 spin_unlock(&lun->lun_sep_lock);
802 return -ENODEV;
803 }
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700804
805 ret = snprintf(page, PAGE_SIZE, "%llu\n", sep->sep_stats.cmd_pdus);
806 spin_unlock(&lun->lun_sep_lock);
807 return ret;
808}
809DEV_STAT_SCSI_TGT_PORT_ATTR_RO(in_cmds);
810
811static ssize_t target_stat_scsi_tgt_port_show_attr_write_mbytes(
812 struct se_port_stat_grps *pgrps, char *page)
813{
814 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
815 struct se_port *sep;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700816 ssize_t ret;
817
818 spin_lock(&lun->lun_sep_lock);
819 sep = lun->lun_sep;
820 if (!sep) {
821 spin_unlock(&lun->lun_sep_lock);
822 return -ENODEV;
823 }
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700824
825 ret = snprintf(page, PAGE_SIZE, "%u\n",
826 (u32)(sep->sep_stats.rx_data_octets >> 20));
827 spin_unlock(&lun->lun_sep_lock);
828 return ret;
829}
830DEV_STAT_SCSI_TGT_PORT_ATTR_RO(write_mbytes);
831
832static ssize_t target_stat_scsi_tgt_port_show_attr_read_mbytes(
833 struct se_port_stat_grps *pgrps, char *page)
834{
835 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
836 struct se_port *sep;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700837 ssize_t ret;
838
839 spin_lock(&lun->lun_sep_lock);
840 sep = lun->lun_sep;
841 if (!sep) {
842 spin_unlock(&lun->lun_sep_lock);
843 return -ENODEV;
844 }
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700845
846 ret = snprintf(page, PAGE_SIZE, "%u\n",
847 (u32)(sep->sep_stats.tx_data_octets >> 20));
848 spin_unlock(&lun->lun_sep_lock);
849 return ret;
850}
851DEV_STAT_SCSI_TGT_PORT_ATTR_RO(read_mbytes);
852
853static ssize_t target_stat_scsi_tgt_port_show_attr_hs_in_cmds(
854 struct se_port_stat_grps *pgrps, char *page)
855{
856 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
857 struct se_port *sep;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700858 ssize_t ret;
859
860 spin_lock(&lun->lun_sep_lock);
861 sep = lun->lun_sep;
862 if (!sep) {
863 spin_unlock(&lun->lun_sep_lock);
864 return -ENODEV;
865 }
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700866
867 /* FIXME: scsiTgtPortHsInCommands */
868 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
869 spin_unlock(&lun->lun_sep_lock);
870 return ret;
871}
872DEV_STAT_SCSI_TGT_PORT_ATTR_RO(hs_in_cmds);
873
874CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_port, se_port_stat_grps,
875 scsi_tgt_port_group);
876
877static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
878 &target_stat_scsi_tgt_port_inst.attr,
879 &target_stat_scsi_tgt_port_dev.attr,
880 &target_stat_scsi_tgt_port_indx.attr,
881 &target_stat_scsi_tgt_port_name.attr,
882 &target_stat_scsi_tgt_port_port_index.attr,
883 &target_stat_scsi_tgt_port_in_cmds.attr,
884 &target_stat_scsi_tgt_port_write_mbytes.attr,
885 &target_stat_scsi_tgt_port_read_mbytes.attr,
886 &target_stat_scsi_tgt_port_hs_in_cmds.attr,
887 NULL,
888};
889
890static struct configfs_item_operations target_stat_scsi_tgt_port_attrib_ops = {
891 .show_attribute = target_stat_scsi_tgt_port_attr_show,
892 .store_attribute = target_stat_scsi_tgt_port_attr_store,
893};
894
895static struct config_item_type target_stat_scsi_tgt_port_cit = {
896 .ct_item_ops = &target_stat_scsi_tgt_port_attrib_ops,
897 .ct_attrs = target_stat_scsi_tgt_port_attrs,
898 .ct_owner = THIS_MODULE,
899};
900
901/*
902 * SCSI Transport Table
903o */
904
905CONFIGFS_EATTR_STRUCT(target_stat_scsi_transport, se_port_stat_grps);
906#define DEV_STAT_SCSI_TRANSPORT_ATTR(_name, _mode) \
907static struct target_stat_scsi_transport_attribute \
908 target_stat_scsi_transport_##_name = \
909 __CONFIGFS_EATTR(_name, _mode, \
910 target_stat_scsi_transport_show_attr_##_name, \
911 target_stat_scsi_transport_store_attr_##_name);
912
913#define DEV_STAT_SCSI_TRANSPORT_ATTR_RO(_name) \
914static struct target_stat_scsi_transport_attribute \
915 target_stat_scsi_transport_##_name = \
916 __CONFIGFS_EATTR_RO(_name, \
917 target_stat_scsi_transport_show_attr_##_name);
918
919static ssize_t target_stat_scsi_transport_show_attr_inst(
920 struct se_port_stat_grps *pgrps, char *page)
921{
922 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
923 struct se_device *dev = lun->lun_se_dev;
924 struct se_port *sep;
925 struct se_hba *hba;
926 ssize_t ret;
927
928 spin_lock(&lun->lun_sep_lock);
929 sep = lun->lun_sep;
930 if (!sep) {
931 spin_unlock(&lun->lun_sep_lock);
932 return -ENODEV;
933 }
934
935 hba = dev->se_hba;
936 ret = snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
937 spin_unlock(&lun->lun_sep_lock);
938 return ret;
939}
940DEV_STAT_SCSI_TRANSPORT_ATTR_RO(inst);
941
942static ssize_t target_stat_scsi_transport_show_attr_device(
943 struct se_port_stat_grps *pgrps, char *page)
944{
945 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
946 struct se_port *sep;
947 struct se_portal_group *tpg;
948 ssize_t ret;
949
950 spin_lock(&lun->lun_sep_lock);
951 sep = lun->lun_sep;
952 if (!sep) {
953 spin_unlock(&lun->lun_sep_lock);
954 return -ENODEV;
955 }
956 tpg = sep->sep_tpg;
957 /* scsiTransportType */
958 ret = snprintf(page, PAGE_SIZE, "scsiTransport%s\n",
Andy Grovere3d6f902011-07-19 08:55:10 +0000959 tpg->se_tpg_tfo->get_fabric_name());
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700960 spin_unlock(&lun->lun_sep_lock);
961 return ret;
962}
963DEV_STAT_SCSI_TRANSPORT_ATTR_RO(device);
964
965static ssize_t target_stat_scsi_transport_show_attr_indx(
966 struct se_port_stat_grps *pgrps, char *page)
967{
968 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
969 struct se_port *sep;
970 struct se_portal_group *tpg;
971 ssize_t ret;
972
973 spin_lock(&lun->lun_sep_lock);
974 sep = lun->lun_sep;
975 if (!sep) {
976 spin_unlock(&lun->lun_sep_lock);
977 return -ENODEV;
978 }
979 tpg = sep->sep_tpg;
980 ret = snprintf(page, PAGE_SIZE, "%u\n",
Andy Grovere3d6f902011-07-19 08:55:10 +0000981 tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -0700982 spin_unlock(&lun->lun_sep_lock);
983 return ret;
984}
985DEV_STAT_SCSI_TRANSPORT_ATTR_RO(indx);
986
987static ssize_t target_stat_scsi_transport_show_attr_dev_name(
988 struct se_port_stat_grps *pgrps, char *page)
989{
990 struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
991 struct se_device *dev = lun->lun_se_dev;
992 struct se_port *sep;
993 struct se_portal_group *tpg;
994 struct t10_wwn *wwn;
995 ssize_t ret;
996
997 spin_lock(&lun->lun_sep_lock);
998 sep = lun->lun_sep;
999 if (!sep) {
1000 spin_unlock(&lun->lun_sep_lock);
1001 return -ENODEV;
1002 }
1003 tpg = sep->sep_tpg;
Christoph Hellwig0fd97cc2012-10-08 00:03:19 -04001004 wwn = &dev->t10_wwn;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001005 /* scsiTransportDevName */
1006 ret = snprintf(page, PAGE_SIZE, "%s+%s\n",
Andy Grovere3d6f902011-07-19 08:55:10 +00001007 tpg->se_tpg_tfo->tpg_get_wwn(tpg),
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001008 (strlen(wwn->unit_serial)) ? wwn->unit_serial :
1009 wwn->vendor);
1010 spin_unlock(&lun->lun_sep_lock);
1011 return ret;
1012}
1013DEV_STAT_SCSI_TRANSPORT_ATTR_RO(dev_name);
1014
1015CONFIGFS_EATTR_OPS(target_stat_scsi_transport, se_port_stat_grps,
1016 scsi_transport_group);
1017
1018static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
1019 &target_stat_scsi_transport_inst.attr,
1020 &target_stat_scsi_transport_device.attr,
1021 &target_stat_scsi_transport_indx.attr,
1022 &target_stat_scsi_transport_dev_name.attr,
1023 NULL,
1024};
1025
1026static struct configfs_item_operations target_stat_scsi_transport_attrib_ops = {
1027 .show_attribute = target_stat_scsi_transport_attr_show,
1028 .store_attribute = target_stat_scsi_transport_attr_store,
1029};
1030
1031static struct config_item_type target_stat_scsi_transport_cit = {
1032 .ct_item_ops = &target_stat_scsi_transport_attrib_ops,
1033 .ct_attrs = target_stat_scsi_transport_attrs,
1034 .ct_owner = THIS_MODULE,
1035};
1036
1037/*
1038 * Called from target_core_fabric_configfs.c:target_fabric_make_lun() to setup
1039 * the target port statistics groups + configfs CITs located in target_core_stat.c
1040 */
1041void target_stat_setup_port_default_groups(struct se_lun *lun)
1042{
Andy Grovere3d6f902011-07-19 08:55:10 +00001043 struct config_group *port_stat_grp = &lun->port_stat_grps.stat_group;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001044
Andy Grovere3d6f902011-07-19 08:55:10 +00001045 config_group_init_type_name(&lun->port_stat_grps.scsi_port_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001046 "scsi_port", &target_stat_scsi_port_cit);
Andy Grovere3d6f902011-07-19 08:55:10 +00001047 config_group_init_type_name(&lun->port_stat_grps.scsi_tgt_port_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001048 "scsi_tgt_port", &target_stat_scsi_tgt_port_cit);
Andy Grovere3d6f902011-07-19 08:55:10 +00001049 config_group_init_type_name(&lun->port_stat_grps.scsi_transport_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001050 "scsi_transport", &target_stat_scsi_transport_cit);
1051
Andy Grovere3d6f902011-07-19 08:55:10 +00001052 port_stat_grp->default_groups[0] = &lun->port_stat_grps.scsi_port_group;
1053 port_stat_grp->default_groups[1] = &lun->port_stat_grps.scsi_tgt_port_group;
1054 port_stat_grp->default_groups[2] = &lun->port_stat_grps.scsi_transport_group;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001055 port_stat_grp->default_groups[3] = NULL;
1056}
1057
1058/*
1059 * SCSI Authorized Initiator Table
1060 */
1061
1062CONFIGFS_EATTR_STRUCT(target_stat_scsi_auth_intr, se_ml_stat_grps);
1063#define DEV_STAT_SCSI_AUTH_INTR_ATTR(_name, _mode) \
1064static struct target_stat_scsi_auth_intr_attribute \
1065 target_stat_scsi_auth_intr_##_name = \
1066 __CONFIGFS_EATTR(_name, _mode, \
1067 target_stat_scsi_auth_intr_show_attr_##_name, \
1068 target_stat_scsi_auth_intr_store_attr_##_name);
1069
1070#define DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(_name) \
1071static struct target_stat_scsi_auth_intr_attribute \
1072 target_stat_scsi_auth_intr_##_name = \
1073 __CONFIGFS_EATTR_RO(_name, \
1074 target_stat_scsi_auth_intr_show_attr_##_name);
1075
1076static ssize_t target_stat_scsi_auth_intr_show_attr_inst(
1077 struct se_ml_stat_grps *lgrps, char *page)
1078{
1079 struct se_lun_acl *lacl = container_of(lgrps,
1080 struct se_lun_acl, ml_stat_grps);
1081 struct se_node_acl *nacl = lacl->se_lun_nacl;
1082 struct se_dev_entry *deve;
1083 struct se_portal_group *tpg;
1084 ssize_t ret;
1085
1086 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001087 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001088 if (!deve->se_lun || !deve->se_lun_acl) {
1089 spin_unlock_irq(&nacl->device_list_lock);
1090 return -ENODEV;
1091 }
1092 tpg = nacl->se_tpg;
1093 /* scsiInstIndex */
1094 ret = snprintf(page, PAGE_SIZE, "%u\n",
Andy Grovere3d6f902011-07-19 08:55:10 +00001095 tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001096 spin_unlock_irq(&nacl->device_list_lock);
1097 return ret;
1098}
1099DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(inst);
1100
1101static ssize_t target_stat_scsi_auth_intr_show_attr_dev(
1102 struct se_ml_stat_grps *lgrps, char *page)
1103{
1104 struct se_lun_acl *lacl = container_of(lgrps,
1105 struct se_lun_acl, ml_stat_grps);
1106 struct se_node_acl *nacl = lacl->se_lun_nacl;
1107 struct se_dev_entry *deve;
1108 struct se_lun *lun;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001109 ssize_t ret;
1110
1111 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001112 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001113 if (!deve->se_lun || !deve->se_lun_acl) {
1114 spin_unlock_irq(&nacl->device_list_lock);
1115 return -ENODEV;
1116 }
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001117 lun = deve->se_lun;
1118 /* scsiDeviceIndex */
1119 ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_se_dev->dev_index);
1120 spin_unlock_irq(&nacl->device_list_lock);
1121 return ret;
1122}
1123DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev);
1124
1125static ssize_t target_stat_scsi_auth_intr_show_attr_port(
1126 struct se_ml_stat_grps *lgrps, char *page)
1127{
1128 struct se_lun_acl *lacl = container_of(lgrps,
1129 struct se_lun_acl, ml_stat_grps);
1130 struct se_node_acl *nacl = lacl->se_lun_nacl;
1131 struct se_dev_entry *deve;
1132 struct se_portal_group *tpg;
1133 ssize_t ret;
1134
1135 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001136 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001137 if (!deve->se_lun || !deve->se_lun_acl) {
1138 spin_unlock_irq(&nacl->device_list_lock);
1139 return -ENODEV;
1140 }
1141 tpg = nacl->se_tpg;
1142 /* scsiAuthIntrTgtPortIndex */
Andy Grovere3d6f902011-07-19 08:55:10 +00001143 ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001144 spin_unlock_irq(&nacl->device_list_lock);
1145 return ret;
1146}
1147DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(port);
1148
1149static ssize_t target_stat_scsi_auth_intr_show_attr_indx(
1150 struct se_ml_stat_grps *lgrps, char *page)
1151{
1152 struct se_lun_acl *lacl = container_of(lgrps,
1153 struct se_lun_acl, ml_stat_grps);
1154 struct se_node_acl *nacl = lacl->se_lun_nacl;
1155 struct se_dev_entry *deve;
1156 ssize_t ret;
1157
1158 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001159 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001160 if (!deve->se_lun || !deve->se_lun_acl) {
1161 spin_unlock_irq(&nacl->device_list_lock);
1162 return -ENODEV;
1163 }
1164 /* scsiAuthIntrIndex */
1165 ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1166 spin_unlock_irq(&nacl->device_list_lock);
1167 return ret;
1168}
1169DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(indx);
1170
1171static ssize_t target_stat_scsi_auth_intr_show_attr_dev_or_port(
1172 struct se_ml_stat_grps *lgrps, char *page)
1173{
1174 struct se_lun_acl *lacl = container_of(lgrps,
1175 struct se_lun_acl, ml_stat_grps);
1176 struct se_node_acl *nacl = lacl->se_lun_nacl;
1177 struct se_dev_entry *deve;
1178 ssize_t ret;
1179
1180 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001181 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001182 if (!deve->se_lun || !deve->se_lun_acl) {
1183 spin_unlock_irq(&nacl->device_list_lock);
1184 return -ENODEV;
1185 }
1186 /* scsiAuthIntrDevOrPort */
1187 ret = snprintf(page, PAGE_SIZE, "%u\n", 1);
1188 spin_unlock_irq(&nacl->device_list_lock);
1189 return ret;
1190}
1191DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev_or_port);
1192
1193static ssize_t target_stat_scsi_auth_intr_show_attr_intr_name(
1194 struct se_ml_stat_grps *lgrps, char *page)
1195{
1196 struct se_lun_acl *lacl = container_of(lgrps,
1197 struct se_lun_acl, ml_stat_grps);
1198 struct se_node_acl *nacl = lacl->se_lun_nacl;
1199 struct se_dev_entry *deve;
1200 ssize_t ret;
1201
1202 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001203 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001204 if (!deve->se_lun || !deve->se_lun_acl) {
1205 spin_unlock_irq(&nacl->device_list_lock);
1206 return -ENODEV;
1207 }
1208 /* scsiAuthIntrName */
1209 ret = snprintf(page, PAGE_SIZE, "%s\n", nacl->initiatorname);
1210 spin_unlock_irq(&nacl->device_list_lock);
1211 return ret;
1212}
1213DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(intr_name);
1214
1215static ssize_t target_stat_scsi_auth_intr_show_attr_map_indx(
1216 struct se_ml_stat_grps *lgrps, char *page)
1217{
1218 struct se_lun_acl *lacl = container_of(lgrps,
1219 struct se_lun_acl, ml_stat_grps);
1220 struct se_node_acl *nacl = lacl->se_lun_nacl;
1221 struct se_dev_entry *deve;
1222 ssize_t ret;
1223
1224 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001225 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001226 if (!deve->se_lun || !deve->se_lun_acl) {
1227 spin_unlock_irq(&nacl->device_list_lock);
1228 return -ENODEV;
1229 }
1230 /* FIXME: scsiAuthIntrLunMapIndex */
1231 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1232 spin_unlock_irq(&nacl->device_list_lock);
1233 return ret;
1234}
1235DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(map_indx);
1236
1237static ssize_t target_stat_scsi_auth_intr_show_attr_att_count(
1238 struct se_ml_stat_grps *lgrps, char *page)
1239{
1240 struct se_lun_acl *lacl = container_of(lgrps,
1241 struct se_lun_acl, ml_stat_grps);
1242 struct se_node_acl *nacl = lacl->se_lun_nacl;
1243 struct se_dev_entry *deve;
1244 ssize_t ret;
1245
1246 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001247 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001248 if (!deve->se_lun || !deve->se_lun_acl) {
1249 spin_unlock_irq(&nacl->device_list_lock);
1250 return -ENODEV;
1251 }
1252 /* scsiAuthIntrAttachedTimes */
1253 ret = snprintf(page, PAGE_SIZE, "%u\n", deve->attach_count);
1254 spin_unlock_irq(&nacl->device_list_lock);
1255 return ret;
1256}
1257DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(att_count);
1258
1259static ssize_t target_stat_scsi_auth_intr_show_attr_num_cmds(
1260 struct se_ml_stat_grps *lgrps, char *page)
1261{
1262 struct se_lun_acl *lacl = container_of(lgrps,
1263 struct se_lun_acl, ml_stat_grps);
1264 struct se_node_acl *nacl = lacl->se_lun_nacl;
1265 struct se_dev_entry *deve;
1266 ssize_t ret;
1267
1268 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001269 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001270 if (!deve->se_lun || !deve->se_lun_acl) {
1271 spin_unlock_irq(&nacl->device_list_lock);
1272 return -ENODEV;
1273 }
1274 /* scsiAuthIntrOutCommands */
1275 ret = snprintf(page, PAGE_SIZE, "%u\n", deve->total_cmds);
1276 spin_unlock_irq(&nacl->device_list_lock);
1277 return ret;
1278}
1279DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(num_cmds);
1280
1281static ssize_t target_stat_scsi_auth_intr_show_attr_read_mbytes(
1282 struct se_ml_stat_grps *lgrps, char *page)
1283{
1284 struct se_lun_acl *lacl = container_of(lgrps,
1285 struct se_lun_acl, ml_stat_grps);
1286 struct se_node_acl *nacl = lacl->se_lun_nacl;
1287 struct se_dev_entry *deve;
1288 ssize_t ret;
1289
1290 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001291 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001292 if (!deve->se_lun || !deve->se_lun_acl) {
1293 spin_unlock_irq(&nacl->device_list_lock);
1294 return -ENODEV;
1295 }
1296 /* scsiAuthIntrReadMegaBytes */
1297 ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(deve->read_bytes >> 20));
1298 spin_unlock_irq(&nacl->device_list_lock);
1299 return ret;
1300}
1301DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(read_mbytes);
1302
1303static ssize_t target_stat_scsi_auth_intr_show_attr_write_mbytes(
1304 struct se_ml_stat_grps *lgrps, char *page)
1305{
1306 struct se_lun_acl *lacl = container_of(lgrps,
1307 struct se_lun_acl, ml_stat_grps);
1308 struct se_node_acl *nacl = lacl->se_lun_nacl;
1309 struct se_dev_entry *deve;
1310 ssize_t ret;
1311
1312 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001313 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001314 if (!deve->se_lun || !deve->se_lun_acl) {
1315 spin_unlock_irq(&nacl->device_list_lock);
1316 return -ENODEV;
1317 }
1318 /* scsiAuthIntrWrittenMegaBytes */
1319 ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(deve->write_bytes >> 20));
1320 spin_unlock_irq(&nacl->device_list_lock);
1321 return ret;
1322}
1323DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(write_mbytes);
1324
1325static ssize_t target_stat_scsi_auth_intr_show_attr_hs_num_cmds(
1326 struct se_ml_stat_grps *lgrps, char *page)
1327{
1328 struct se_lun_acl *lacl = container_of(lgrps,
1329 struct se_lun_acl, ml_stat_grps);
1330 struct se_node_acl *nacl = lacl->se_lun_nacl;
1331 struct se_dev_entry *deve;
1332 ssize_t ret;
1333
1334 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001335 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001336 if (!deve->se_lun || !deve->se_lun_acl) {
1337 spin_unlock_irq(&nacl->device_list_lock);
1338 return -ENODEV;
1339 }
1340 /* FIXME: scsiAuthIntrHSOutCommands */
1341 ret = snprintf(page, PAGE_SIZE, "%u\n", 0);
1342 spin_unlock_irq(&nacl->device_list_lock);
1343 return ret;
1344}
1345DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(hs_num_cmds);
1346
1347static ssize_t target_stat_scsi_auth_intr_show_attr_creation_time(
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
1356 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001357 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001358 if (!deve->se_lun || !deve->se_lun_acl) {
1359 spin_unlock_irq(&nacl->device_list_lock);
1360 return -ENODEV;
1361 }
1362 /* scsiAuthIntrLastCreation */
1363 ret = snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)deve->creation_time -
1364 INITIAL_JIFFIES) * 100 / HZ));
1365 spin_unlock_irq(&nacl->device_list_lock);
1366 return ret;
1367}
1368DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(creation_time);
1369
1370static ssize_t target_stat_scsi_auth_intr_show_attr_row_status(
1371 struct se_ml_stat_grps *lgrps, char *page)
1372{
1373 struct se_lun_acl *lacl = container_of(lgrps,
1374 struct se_lun_acl, ml_stat_grps);
1375 struct se_node_acl *nacl = lacl->se_lun_nacl;
1376 struct se_dev_entry *deve;
1377 ssize_t ret;
1378
1379 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001380 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001381 if (!deve->se_lun || !deve->se_lun_acl) {
1382 spin_unlock_irq(&nacl->device_list_lock);
1383 return -ENODEV;
1384 }
1385 /* FIXME: scsiAuthIntrRowStatus */
1386 ret = snprintf(page, PAGE_SIZE, "Ready\n");
1387 spin_unlock_irq(&nacl->device_list_lock);
1388 return ret;
1389}
1390DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(row_status);
1391
1392CONFIGFS_EATTR_OPS(target_stat_scsi_auth_intr, se_ml_stat_grps,
1393 scsi_auth_intr_group);
1394
1395static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
1396 &target_stat_scsi_auth_intr_inst.attr,
1397 &target_stat_scsi_auth_intr_dev.attr,
1398 &target_stat_scsi_auth_intr_port.attr,
1399 &target_stat_scsi_auth_intr_indx.attr,
1400 &target_stat_scsi_auth_intr_dev_or_port.attr,
1401 &target_stat_scsi_auth_intr_intr_name.attr,
1402 &target_stat_scsi_auth_intr_map_indx.attr,
1403 &target_stat_scsi_auth_intr_att_count.attr,
1404 &target_stat_scsi_auth_intr_num_cmds.attr,
1405 &target_stat_scsi_auth_intr_read_mbytes.attr,
1406 &target_stat_scsi_auth_intr_write_mbytes.attr,
1407 &target_stat_scsi_auth_intr_hs_num_cmds.attr,
1408 &target_stat_scsi_auth_intr_creation_time.attr,
1409 &target_stat_scsi_auth_intr_row_status.attr,
1410 NULL,
1411};
1412
1413static struct configfs_item_operations target_stat_scsi_auth_intr_attrib_ops = {
1414 .show_attribute = target_stat_scsi_auth_intr_attr_show,
1415 .store_attribute = target_stat_scsi_auth_intr_attr_store,
1416};
1417
1418static struct config_item_type target_stat_scsi_auth_intr_cit = {
1419 .ct_item_ops = &target_stat_scsi_auth_intr_attrib_ops,
1420 .ct_attrs = target_stat_scsi_auth_intr_attrs,
1421 .ct_owner = THIS_MODULE,
1422};
1423
1424/*
1425 * SCSI Attached Initiator Port Table
1426 */
1427
1428CONFIGFS_EATTR_STRUCT(target_stat_scsi_att_intr_port, se_ml_stat_grps);
1429#define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR(_name, _mode) \
1430static struct target_stat_scsi_att_intr_port_attribute \
1431 target_stat_scsi_att_intr_port_##_name = \
1432 __CONFIGFS_EATTR(_name, _mode, \
1433 target_stat_scsi_att_intr_port_show_attr_##_name, \
1434 target_stat_scsi_att_intr_port_store_attr_##_name);
1435
1436#define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(_name) \
1437static struct target_stat_scsi_att_intr_port_attribute \
1438 target_stat_scsi_att_intr_port_##_name = \
1439 __CONFIGFS_EATTR_RO(_name, \
1440 target_stat_scsi_att_intr_port_show_attr_##_name);
1441
1442static ssize_t target_stat_scsi_att_intr_port_show_attr_inst(
1443 struct se_ml_stat_grps *lgrps, char *page)
1444{
1445 struct se_lun_acl *lacl = container_of(lgrps,
1446 struct se_lun_acl, ml_stat_grps);
1447 struct se_node_acl *nacl = lacl->se_lun_nacl;
1448 struct se_dev_entry *deve;
1449 struct se_portal_group *tpg;
1450 ssize_t ret;
1451
1452 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001453 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001454 if (!deve->se_lun || !deve->se_lun_acl) {
1455 spin_unlock_irq(&nacl->device_list_lock);
1456 return -ENODEV;
1457 }
1458 tpg = nacl->se_tpg;
1459 /* scsiInstIndex */
1460 ret = snprintf(page, PAGE_SIZE, "%u\n",
Andy Grovere3d6f902011-07-19 08:55:10 +00001461 tpg->se_tpg_tfo->tpg_get_inst_index(tpg));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001462 spin_unlock_irq(&nacl->device_list_lock);
1463 return ret;
1464}
1465DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(inst);
1466
1467static ssize_t target_stat_scsi_att_intr_port_show_attr_dev(
1468 struct se_ml_stat_grps *lgrps, char *page)
1469{
1470 struct se_lun_acl *lacl = container_of(lgrps,
1471 struct se_lun_acl, ml_stat_grps);
1472 struct se_node_acl *nacl = lacl->se_lun_nacl;
1473 struct se_dev_entry *deve;
1474 struct se_lun *lun;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001475 ssize_t ret;
1476
1477 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001478 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001479 if (!deve->se_lun || !deve->se_lun_acl) {
1480 spin_unlock_irq(&nacl->device_list_lock);
1481 return -ENODEV;
1482 }
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001483 lun = deve->se_lun;
1484 /* scsiDeviceIndex */
1485 ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_se_dev->dev_index);
1486 spin_unlock_irq(&nacl->device_list_lock);
1487 return ret;
1488}
1489DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(dev);
1490
1491static ssize_t target_stat_scsi_att_intr_port_show_attr_port(
1492 struct se_ml_stat_grps *lgrps, char *page)
1493{
1494 struct se_lun_acl *lacl = container_of(lgrps,
1495 struct se_lun_acl, ml_stat_grps);
1496 struct se_node_acl *nacl = lacl->se_lun_nacl;
1497 struct se_dev_entry *deve;
1498 struct se_portal_group *tpg;
1499 ssize_t ret;
1500
1501 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001502 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001503 if (!deve->se_lun || !deve->se_lun_acl) {
1504 spin_unlock_irq(&nacl->device_list_lock);
1505 return -ENODEV;
1506 }
1507 tpg = nacl->se_tpg;
1508 /* scsiPortIndex */
Andy Grovere3d6f902011-07-19 08:55:10 +00001509 ret = snprintf(page, PAGE_SIZE, "%u\n", tpg->se_tpg_tfo->tpg_get_tag(tpg));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001510 spin_unlock_irq(&nacl->device_list_lock);
1511 return ret;
1512}
1513DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port);
1514
1515static ssize_t target_stat_scsi_att_intr_port_show_attr_indx(
1516 struct se_ml_stat_grps *lgrps, char *page)
1517{
1518 struct se_lun_acl *lacl = container_of(lgrps,
1519 struct se_lun_acl, ml_stat_grps);
1520 struct se_node_acl *nacl = lacl->se_lun_nacl;
1521 struct se_session *se_sess;
1522 struct se_portal_group *tpg;
1523 ssize_t ret;
1524
1525 spin_lock_irq(&nacl->nacl_sess_lock);
1526 se_sess = nacl->nacl_sess;
1527 if (!se_sess) {
1528 spin_unlock_irq(&nacl->nacl_sess_lock);
1529 return -ENODEV;
1530 }
1531
1532 tpg = nacl->se_tpg;
1533 /* scsiAttIntrPortIndex */
1534 ret = snprintf(page, PAGE_SIZE, "%u\n",
Andy Grovere3d6f902011-07-19 08:55:10 +00001535 tpg->se_tpg_tfo->sess_get_index(se_sess));
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001536 spin_unlock_irq(&nacl->nacl_sess_lock);
1537 return ret;
1538}
1539DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(indx);
1540
1541static ssize_t target_stat_scsi_att_intr_port_show_attr_port_auth_indx(
1542 struct se_ml_stat_grps *lgrps, char *page)
1543{
1544 struct se_lun_acl *lacl = container_of(lgrps,
1545 struct se_lun_acl, ml_stat_grps);
1546 struct se_node_acl *nacl = lacl->se_lun_nacl;
1547 struct se_dev_entry *deve;
1548 ssize_t ret;
1549
1550 spin_lock_irq(&nacl->device_list_lock);
Jörn Engelf2083242012-03-15 15:05:40 -04001551 deve = nacl->device_list[lacl->mapped_lun];
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001552 if (!deve->se_lun || !deve->se_lun_acl) {
1553 spin_unlock_irq(&nacl->device_list_lock);
1554 return -ENODEV;
1555 }
1556 /* scsiAttIntrPortAuthIntrIdx */
1557 ret = snprintf(page, PAGE_SIZE, "%u\n", nacl->acl_index);
1558 spin_unlock_irq(&nacl->device_list_lock);
1559 return ret;
1560}
1561DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_auth_indx);
1562
1563static ssize_t target_stat_scsi_att_intr_port_show_attr_port_ident(
1564 struct se_ml_stat_grps *lgrps, char *page)
1565{
1566 struct se_lun_acl *lacl = container_of(lgrps,
1567 struct se_lun_acl, ml_stat_grps);
1568 struct se_node_acl *nacl = lacl->se_lun_nacl;
1569 struct se_session *se_sess;
1570 struct se_portal_group *tpg;
1571 ssize_t ret;
1572 unsigned char buf[64];
1573
1574 spin_lock_irq(&nacl->nacl_sess_lock);
1575 se_sess = nacl->nacl_sess;
1576 if (!se_sess) {
1577 spin_unlock_irq(&nacl->nacl_sess_lock);
1578 return -ENODEV;
1579 }
1580
1581 tpg = nacl->se_tpg;
1582 /* scsiAttIntrPortName+scsiAttIntrPortIdentifier */
1583 memset(buf, 0, 64);
Andy Grovere3d6f902011-07-19 08:55:10 +00001584 if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL)
Jörn Engel8359cf42011-11-24 02:05:51 +01001585 tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, buf, 64);
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001586
1587 ret = snprintf(page, PAGE_SIZE, "%s+i+%s\n", nacl->initiatorname, buf);
1588 spin_unlock_irq(&nacl->nacl_sess_lock);
1589 return ret;
1590}
1591DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_ident);
1592
1593CONFIGFS_EATTR_OPS(target_stat_scsi_att_intr_port, se_ml_stat_grps,
1594 scsi_att_intr_port_group);
1595
1596static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
1597 &target_stat_scsi_att_intr_port_inst.attr,
1598 &target_stat_scsi_att_intr_port_dev.attr,
1599 &target_stat_scsi_att_intr_port_port.attr,
1600 &target_stat_scsi_att_intr_port_indx.attr,
1601 &target_stat_scsi_att_intr_port_port_auth_indx.attr,
1602 &target_stat_scsi_att_intr_port_port_ident.attr,
1603 NULL,
1604};
1605
1606static struct configfs_item_operations target_stat_scsi_att_intr_port_attrib_ops = {
1607 .show_attribute = target_stat_scsi_att_intr_port_attr_show,
1608 .store_attribute = target_stat_scsi_att_intr_port_attr_store,
1609};
1610
1611static struct config_item_type target_stat_scsi_att_intr_port_cit = {
1612 .ct_item_ops = &target_stat_scsi_att_intr_port_attrib_ops,
1613 .ct_attrs = target_stat_scsi_ath_intr_port_attrs,
1614 .ct_owner = THIS_MODULE,
1615};
1616
1617/*
1618 * Called from target_core_fabric_configfs.c:target_fabric_make_mappedlun() to setup
1619 * the target MappedLUN statistics groups + configfs CITs located in target_core_stat.c
1620 */
1621void target_stat_setup_mappedlun_default_groups(struct se_lun_acl *lacl)
1622{
Andy Grovere3d6f902011-07-19 08:55:10 +00001623 struct config_group *ml_stat_grp = &lacl->ml_stat_grps.stat_group;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001624
Andy Grovere3d6f902011-07-19 08:55:10 +00001625 config_group_init_type_name(&lacl->ml_stat_grps.scsi_auth_intr_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001626 "scsi_auth_intr", &target_stat_scsi_auth_intr_cit);
Andy Grovere3d6f902011-07-19 08:55:10 +00001627 config_group_init_type_name(&lacl->ml_stat_grps.scsi_att_intr_port_group,
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001628 "scsi_att_intr_port", &target_stat_scsi_att_intr_port_cit);
1629
Andy Grovere3d6f902011-07-19 08:55:10 +00001630 ml_stat_grp->default_groups[0] = &lacl->ml_stat_grps.scsi_auth_intr_group;
1631 ml_stat_grp->default_groups[1] = &lacl->ml_stat_grps.scsi_att_intr_port_group;
Nicholas Bellinger12d2338422011-03-14 04:06:11 -07001632 ml_stat_grp->default_groups[2] = NULL;
1633}