diff options
Diffstat (limited to 'drivers/scsi/scsi_sysfs.c')
-rw-r--r-- | drivers/scsi/scsi_sysfs.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 40c639491b27..8ff62c26a41c 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -281,6 +281,42 @@ exit_store_host_reset: | |||
281 | 281 | ||
282 | static DEVICE_ATTR(host_reset, S_IWUSR, NULL, store_host_reset); | 282 | static DEVICE_ATTR(host_reset, S_IWUSR, NULL, store_host_reset); |
283 | 283 | ||
284 | static ssize_t | ||
285 | show_shost_eh_deadline(struct device *dev, | ||
286 | struct device_attribute *attr, char *buf) | ||
287 | { | ||
288 | struct Scsi_Host *shost = class_to_shost(dev); | ||
289 | |||
290 | return sprintf(buf, "%d\n", shost->eh_deadline / HZ); | ||
291 | } | ||
292 | |||
293 | static ssize_t | ||
294 | store_shost_eh_deadline(struct device *dev, struct device_attribute *attr, | ||
295 | const char *buf, size_t count) | ||
296 | { | ||
297 | struct Scsi_Host *shost = class_to_shost(dev); | ||
298 | int ret = -EINVAL; | ||
299 | int deadline; | ||
300 | unsigned long flags; | ||
301 | |||
302 | if (shost->transportt && shost->transportt->eh_strategy_handler) | ||
303 | return ret; | ||
304 | |||
305 | if (sscanf(buf, "%d\n", &deadline) == 1) { | ||
306 | spin_lock_irqsave(shost->host_lock, flags); | ||
307 | if (scsi_host_in_recovery(shost)) | ||
308 | ret = -EBUSY; | ||
309 | else { | ||
310 | shost->eh_deadline = deadline * HZ; | ||
311 | ret = count; | ||
312 | } | ||
313 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
314 | } | ||
315 | return ret; | ||
316 | } | ||
317 | |||
318 | static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline); | ||
319 | |||
284 | shost_rd_attr(unique_id, "%u\n"); | 320 | shost_rd_attr(unique_id, "%u\n"); |
285 | shost_rd_attr(host_busy, "%hu\n"); | 321 | shost_rd_attr(host_busy, "%hu\n"); |
286 | shost_rd_attr(cmd_per_lun, "%hd\n"); | 322 | shost_rd_attr(cmd_per_lun, "%hd\n"); |
@@ -308,6 +344,7 @@ static struct attribute *scsi_sysfs_shost_attrs[] = { | |||
308 | &dev_attr_prot_capabilities.attr, | 344 | &dev_attr_prot_capabilities.attr, |
309 | &dev_attr_prot_guard_type.attr, | 345 | &dev_attr_prot_guard_type.attr, |
310 | &dev_attr_host_reset.attr, | 346 | &dev_attr_host_reset.attr, |
347 | &dev_attr_eh_deadline.attr, | ||
311 | NULL | 348 | NULL |
312 | }; | 349 | }; |
313 | 350 | ||
@@ -529,6 +566,7 @@ static int scsi_sdev_check_buf_bit(const char *buf) | |||
529 | */ | 566 | */ |
530 | sdev_rd_attr (device_blocked, "%d\n"); | 567 | sdev_rd_attr (device_blocked, "%d\n"); |
531 | sdev_rd_attr (queue_depth, "%d\n"); | 568 | sdev_rd_attr (queue_depth, "%d\n"); |
569 | sdev_rd_attr (device_busy, "%d\n"); | ||
532 | sdev_rd_attr (type, "%d\n"); | 570 | sdev_rd_attr (type, "%d\n"); |
533 | sdev_rd_attr (scsi_level, "%d\n"); | 571 | sdev_rd_attr (scsi_level, "%d\n"); |
534 | sdev_rd_attr (vendor, "%.8s\n"); | 572 | sdev_rd_attr (vendor, "%.8s\n"); |
@@ -750,6 +788,7 @@ static struct attribute *scsi_sdev_attrs[] = { | |||
750 | &dev_attr_device_blocked.attr, | 788 | &dev_attr_device_blocked.attr, |
751 | &dev_attr_type.attr, | 789 | &dev_attr_type.attr, |
752 | &dev_attr_scsi_level.attr, | 790 | &dev_attr_scsi_level.attr, |
791 | &dev_attr_device_busy.attr, | ||
753 | &dev_attr_vendor.attr, | 792 | &dev_attr_vendor.attr, |
754 | &dev_attr_model.attr, | 793 | &dev_attr_model.attr, |
755 | &dev_attr_rev.attr, | 794 | &dev_attr_rev.attr, |