aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/scsi_sysfs.c')
-rw-r--r--drivers/scsi/scsi_sysfs.c39
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
282static DEVICE_ATTR(host_reset, S_IWUSR, NULL, store_host_reset); 282static DEVICE_ATTR(host_reset, S_IWUSR, NULL, store_host_reset);
283 283
284static ssize_t
285show_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
293static ssize_t
294store_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
318static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline);
319
284shost_rd_attr(unique_id, "%u\n"); 320shost_rd_attr(unique_id, "%u\n");
285shost_rd_attr(host_busy, "%hu\n"); 321shost_rd_attr(host_busy, "%hu\n");
286shost_rd_attr(cmd_per_lun, "%hd\n"); 322shost_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 */
530sdev_rd_attr (device_blocked, "%d\n"); 567sdev_rd_attr (device_blocked, "%d\n");
531sdev_rd_attr (queue_depth, "%d\n"); 568sdev_rd_attr (queue_depth, "%d\n");
569sdev_rd_attr (device_busy, "%d\n");
532sdev_rd_attr (type, "%d\n"); 570sdev_rd_attr (type, "%d\n");
533sdev_rd_attr (scsi_level, "%d\n"); 571sdev_rd_attr (scsi_level, "%d\n");
534sdev_rd_attr (vendor, "%.8s\n"); 572sdev_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,