aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi/zfcp_sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/scsi/zfcp_sysfs.c')
-rw-r--r--drivers/s390/scsi/zfcp_sysfs.c224
1 files changed, 112 insertions, 112 deletions
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c
index b4561c86e230..cdc4ff78a7ba 100644
--- a/drivers/s390/scsi/zfcp_sysfs.c
+++ b/drivers/s390/scsi/zfcp_sysfs.c
@@ -68,63 +68,95 @@ ZFCP_DEFINE_ATTR(zfcp_port, port, access_denied, "%d\n",
68 ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0); 68 ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0);
69 69
70ZFCP_DEFINE_ATTR(zfcp_unit, unit, status, "0x%08x\n", 70ZFCP_DEFINE_ATTR(zfcp_unit, unit, status, "0x%08x\n",
71 atomic_read(&unit->status)); 71 zfcp_unit_sdev_status(unit));
72ZFCP_DEFINE_ATTR(zfcp_unit, unit, in_recovery, "%d\n", 72ZFCP_DEFINE_ATTR(zfcp_unit, unit, in_recovery, "%d\n",
73 (atomic_read(&unit->status) & 73 (zfcp_unit_sdev_status(unit) &
74 ZFCP_STATUS_COMMON_ERP_INUSE) != 0); 74 ZFCP_STATUS_COMMON_ERP_INUSE) != 0);
75ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_denied, "%d\n", 75ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_denied, "%d\n",
76 (atomic_read(&unit->status) & 76 (zfcp_unit_sdev_status(unit) &
77 ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0); 77 ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0);
78ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_shared, "%d\n", 78ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_shared, "%d\n",
79 (atomic_read(&unit->status) & 79 (zfcp_unit_sdev_status(unit) &
80 ZFCP_STATUS_UNIT_SHARED) != 0); 80 ZFCP_STATUS_LUN_SHARED) != 0);
81ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_readonly, "%d\n", 81ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_readonly, "%d\n",
82 (atomic_read(&unit->status) & 82 (zfcp_unit_sdev_status(unit) &
83 ZFCP_STATUS_UNIT_READONLY) != 0); 83 ZFCP_STATUS_LUN_READONLY) != 0);
84 84
85#define ZFCP_SYSFS_FAILED(_feat_def, _feat, _adapter, _mod_id, _reopen_id) \ 85static ssize_t zfcp_sysfs_port_failed_show(struct device *dev,
86static ssize_t zfcp_sysfs_##_feat##_failed_show(struct device *dev, \ 86 struct device_attribute *attr,
87 struct device_attribute *attr, \ 87 char *buf)
88 char *buf) \ 88{
89{ \ 89 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
90 struct _feat_def *_feat = container_of(dev, struct _feat_def, dev); \ 90
91 \ 91 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
92 if (atomic_read(&_feat->status) & ZFCP_STATUS_COMMON_ERP_FAILED) \ 92 return sprintf(buf, "1\n");
93 return sprintf(buf, "1\n"); \ 93
94 else \ 94 return sprintf(buf, "0\n");
95 return sprintf(buf, "0\n"); \ 95}
96} \ 96
97static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \ 97static ssize_t zfcp_sysfs_port_failed_store(struct device *dev,
98 struct device_attribute *attr,\ 98 struct device_attribute *attr,
99 const char *buf, size_t count)\ 99 const char *buf, size_t count)
100{ \ 100{
101 struct _feat_def *_feat = container_of(dev, struct _feat_def, dev); \ 101 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
102 unsigned long val; \ 102 unsigned long val;
103 int retval = 0; \ 103
104 \ 104 if (strict_strtoul(buf, 0, &val) || val != 0)
105 if (!(_feat && get_device(&_feat->dev))) \ 105 return -EINVAL;
106 return -EBUSY; \ 106
107 \ 107 zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_RUNNING);
108 if (strict_strtoul(buf, 0, &val) || val != 0) { \ 108 zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, "sypfai2");
109 retval = -EINVAL; \ 109 zfcp_erp_wait(port->adapter);
110 goto out; \
111 } \
112 \
113 zfcp_erp_modify_##_feat##_status(_feat, _mod_id, NULL, \
114 ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);\
115 zfcp_erp_##_feat##_reopen(_feat, ZFCP_STATUS_COMMON_ERP_FAILED, \
116 _reopen_id, NULL); \
117 zfcp_erp_wait(_adapter); \
118out: \
119 put_device(&_feat->dev); \
120 return retval ? retval : (ssize_t) count; \
121} \
122static ZFCP_DEV_ATTR(_feat, failed, S_IWUSR | S_IRUGO, \
123 zfcp_sysfs_##_feat##_failed_show, \
124 zfcp_sysfs_##_feat##_failed_store);
125 110
126ZFCP_SYSFS_FAILED(zfcp_port, port, port->adapter, "sypfai1", "sypfai2"); 111 return count;
127ZFCP_SYSFS_FAILED(zfcp_unit, unit, unit->port->adapter, "syufai1", "syufai2"); 112}
113static ZFCP_DEV_ATTR(port, failed, S_IWUSR | S_IRUGO,
114 zfcp_sysfs_port_failed_show,
115 zfcp_sysfs_port_failed_store);
116
117static ssize_t zfcp_sysfs_unit_failed_show(struct device *dev,
118 struct device_attribute *attr,
119 char *buf)
120{
121 struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev);
122 struct scsi_device *sdev;
123 unsigned int status, failed = 1;
124
125 sdev = zfcp_unit_sdev(unit);
126 if (sdev) {
127 status = atomic_read(&sdev_to_zfcp(sdev)->status);
128 failed = status & ZFCP_STATUS_COMMON_ERP_FAILED ? 1 : 0;
129 scsi_device_put(sdev);
130 }
131
132 return sprintf(buf, "%d\n", failed);
133}
134
135static ssize_t zfcp_sysfs_unit_failed_store(struct device *dev,
136 struct device_attribute *attr,
137 const char *buf, size_t count)
138{
139 struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev);
140 unsigned long val;
141 struct scsi_device *sdev;
142
143 if (strict_strtoul(buf, 0, &val) || val != 0)
144 return -EINVAL;
145
146 sdev = zfcp_unit_sdev(unit);
147 if (sdev) {
148 zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING);
149 zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED,
150 "syufai2");
151 zfcp_erp_wait(unit->port->adapter);
152 } else
153 zfcp_unit_scsi_scan(unit);
154
155 return count;
156}
157static ZFCP_DEV_ATTR(unit, failed, S_IWUSR | S_IRUGO,
158 zfcp_sysfs_unit_failed_show,
159 zfcp_sysfs_unit_failed_store);
128 160
129static ssize_t zfcp_sysfs_adapter_failed_show(struct device *dev, 161static ssize_t zfcp_sysfs_adapter_failed_show(struct device *dev,
130 struct device_attribute *attr, 162 struct device_attribute *attr,
@@ -163,10 +195,9 @@ static ssize_t zfcp_sysfs_adapter_failed_store(struct device *dev,
163 goto out; 195 goto out;
164 } 196 }
165 197
166 zfcp_erp_modify_adapter_status(adapter, "syafai1", NULL, 198 zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING);
167 ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
168 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 199 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
169 "syafai2", NULL); 200 "syafai2");
170 zfcp_erp_wait(adapter); 201 zfcp_erp_wait(adapter);
171out: 202out:
172 zfcp_ccw_adapter_put(adapter); 203 zfcp_ccw_adapter_put(adapter);
@@ -224,7 +255,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
224 255
225 put_device(&port->dev); 256 put_device(&port->dev);
226 257
227 zfcp_erp_port_shutdown(port, 0, "syprs_1", NULL); 258 zfcp_erp_port_shutdown(port, 0, "syprs_1");
228 zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); 259 zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs);
229 out: 260 out:
230 zfcp_ccw_adapter_put(adapter); 261 zfcp_ccw_adapter_put(adapter);
@@ -257,28 +288,15 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev,
257 const char *buf, size_t count) 288 const char *buf, size_t count)
258{ 289{
259 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev); 290 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
260 struct zfcp_unit *unit;
261 u64 fcp_lun; 291 u64 fcp_lun;
262 int retval = -EINVAL;
263
264 if (!(port && get_device(&port->dev)))
265 return -EBUSY;
266 292
267 if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) 293 if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun))
268 goto out; 294 return -EINVAL;
269 295
270 unit = zfcp_unit_enqueue(port, fcp_lun); 296 if (zfcp_unit_add(port, fcp_lun))
271 if (IS_ERR(unit)) 297 return -EINVAL;
272 goto out;
273 else
274 retval = 0;
275 298
276 zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); 299 return count;
277 zfcp_erp_wait(unit->port->adapter);
278 zfcp_scsi_scan(unit);
279out:
280 put_device(&port->dev);
281 return retval ? retval : (ssize_t) count;
282} 300}
283static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store); 301static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store);
284 302
@@ -287,42 +305,15 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
287 const char *buf, size_t count) 305 const char *buf, size_t count)
288{ 306{
289 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev); 307 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
290 struct zfcp_unit *unit;
291 u64 fcp_lun; 308 u64 fcp_lun;
292 int retval = -EINVAL;
293 struct scsi_device *sdev;
294
295 if (!(port && get_device(&port->dev)))
296 return -EBUSY;
297 309
298 if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) 310 if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun))
299 goto out; 311 return -EINVAL;
300 312
301 unit = zfcp_get_unit_by_lun(port, fcp_lun); 313 if (zfcp_unit_remove(port, fcp_lun))
302 if (!unit) 314 return -EINVAL;
303 goto out;
304 else
305 retval = 0;
306
307 sdev = scsi_device_lookup(port->adapter->scsi_host, 0,
308 port->starget_id,
309 scsilun_to_int((struct scsi_lun *)&fcp_lun));
310 if (sdev) {
311 scsi_remove_device(sdev);
312 scsi_device_put(sdev);
313 }
314
315 write_lock_irq(&port->unit_list_lock);
316 list_del(&unit->list);
317 write_unlock_irq(&port->unit_list_lock);
318
319 put_device(&unit->dev);
320 315
321 zfcp_erp_unit_shutdown(unit, 0, "syurs_1", NULL); 316 return count;
322 zfcp_device_unregister(&unit->dev, &zfcp_sysfs_unit_attrs);
323out:
324 put_device(&port->dev);
325 return retval ? retval : (ssize_t) count;
326} 317}
327static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store); 318static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store);
328 319
@@ -363,9 +354,9 @@ zfcp_sysfs_unit_##_name##_latency_show(struct device *dev, \
363 struct device_attribute *attr, \ 354 struct device_attribute *attr, \
364 char *buf) { \ 355 char *buf) { \
365 struct scsi_device *sdev = to_scsi_device(dev); \ 356 struct scsi_device *sdev = to_scsi_device(dev); \
366 struct zfcp_unit *unit = sdev->hostdata; \ 357 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); \
367 struct zfcp_latencies *lat = &unit->latencies; \ 358 struct zfcp_latencies *lat = &zfcp_sdev->latencies; \
368 struct zfcp_adapter *adapter = unit->port->adapter; \ 359 struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; \
369 unsigned long long fsum, fmin, fmax, csum, cmin, cmax, cc; \ 360 unsigned long long fsum, fmin, fmax, csum, cmin, cmax, cc; \
370 \ 361 \
371 spin_lock_bh(&lat->lock); \ 362 spin_lock_bh(&lat->lock); \
@@ -394,8 +385,8 @@ zfcp_sysfs_unit_##_name##_latency_store(struct device *dev, \
394 const char *buf, size_t count) \ 385 const char *buf, size_t count) \
395{ \ 386{ \
396 struct scsi_device *sdev = to_scsi_device(dev); \ 387 struct scsi_device *sdev = to_scsi_device(dev); \
397 struct zfcp_unit *unit = sdev->hostdata; \ 388 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); \
398 struct zfcp_latencies *lat = &unit->latencies; \ 389 struct zfcp_latencies *lat = &zfcp_sdev->latencies; \
399 unsigned long flags; \ 390 unsigned long flags; \
400 \ 391 \
401 spin_lock_irqsave(&lat->lock, flags); \ 392 spin_lock_irqsave(&lat->lock, flags); \
@@ -423,19 +414,28 @@ static ssize_t zfcp_sysfs_scsi_##_name##_show(struct device *dev, \
423 struct device_attribute *attr,\ 414 struct device_attribute *attr,\
424 char *buf) \ 415 char *buf) \
425{ \ 416{ \
426 struct scsi_device *sdev = to_scsi_device(dev); \ 417 struct scsi_device *sdev = to_scsi_device(dev); \
427 struct zfcp_unit *unit = sdev->hostdata; \ 418 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); \
419 struct zfcp_port *port = zfcp_sdev->port; \
428 \ 420 \
429 return sprintf(buf, _format, _value); \ 421 return sprintf(buf, _format, _value); \
430} \ 422} \
431static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_scsi_##_name##_show, NULL); 423static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_scsi_##_name##_show, NULL);
432 424
433ZFCP_DEFINE_SCSI_ATTR(hba_id, "%s\n", 425ZFCP_DEFINE_SCSI_ATTR(hba_id, "%s\n",
434 dev_name(&unit->port->adapter->ccw_device->dev)); 426 dev_name(&port->adapter->ccw_device->dev));
435ZFCP_DEFINE_SCSI_ATTR(wwpn, "0x%016llx\n", 427ZFCP_DEFINE_SCSI_ATTR(wwpn, "0x%016llx\n",
436 (unsigned long long) unit->port->wwpn); 428 (unsigned long long) port->wwpn);
437ZFCP_DEFINE_SCSI_ATTR(fcp_lun, "0x%016llx\n", 429
438 (unsigned long long) unit->fcp_lun); 430static ssize_t zfcp_sysfs_scsi_fcp_lun_show(struct device *dev,
431 struct device_attribute *attr,
432 char *buf)
433{
434 struct scsi_device *sdev = to_scsi_device(dev);
435
436 return sprintf(buf, "0x%016llx\n", zfcp_scsi_dev_lun(sdev));
437}
438static DEVICE_ATTR(fcp_lun, S_IRUGO, zfcp_sysfs_scsi_fcp_lun_show, NULL);
439 439
440struct device_attribute *zfcp_sysfs_sdev_attrs[] = { 440struct device_attribute *zfcp_sysfs_sdev_attrs[] = {
441 &dev_attr_fcp_lun, 441 &dev_attr_fcp_lun,