]> Pileus Git - ~andy/linux/blobdiff - drivers/scsi/scsi_sysfs.c
Merge tag 'omap-for-v3.13/more-fixes-for-merge-window-take2' of git://git.kernel...
[~andy/linux] / drivers / scsi / scsi_sysfs.c
index 40c639491b27ce5857a7b28f4237d8b33800f6df..8ff62c26a41ce694a9df6d3c279370f8096e0728 100644 (file)
@@ -281,6 +281,42 @@ exit_store_host_reset:
 
 static DEVICE_ATTR(host_reset, S_IWUSR, NULL, store_host_reset);
 
+static ssize_t
+show_shost_eh_deadline(struct device *dev,
+                     struct device_attribute *attr, char *buf)
+{
+       struct Scsi_Host *shost = class_to_shost(dev);
+
+       return sprintf(buf, "%d\n", shost->eh_deadline / HZ);
+}
+
+static ssize_t
+store_shost_eh_deadline(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
+{
+       struct Scsi_Host *shost = class_to_shost(dev);
+       int ret = -EINVAL;
+       int deadline;
+       unsigned long flags;
+
+       if (shost->transportt && shost->transportt->eh_strategy_handler)
+               return ret;
+
+       if (sscanf(buf, "%d\n", &deadline) == 1) {
+               spin_lock_irqsave(shost->host_lock, flags);
+               if (scsi_host_in_recovery(shost))
+                       ret = -EBUSY;
+               else {
+                       shost->eh_deadline = deadline * HZ;
+                       ret = count;
+               }
+               spin_unlock_irqrestore(shost->host_lock, flags);
+       }
+       return ret;
+}
+
+static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline);
+
 shost_rd_attr(unique_id, "%u\n");
 shost_rd_attr(host_busy, "%hu\n");
 shost_rd_attr(cmd_per_lun, "%hd\n");
@@ -308,6 +344,7 @@ static struct attribute *scsi_sysfs_shost_attrs[] = {
        &dev_attr_prot_capabilities.attr,
        &dev_attr_prot_guard_type.attr,
        &dev_attr_host_reset.attr,
+       &dev_attr_eh_deadline.attr,
        NULL
 };
 
@@ -529,6 +566,7 @@ static int scsi_sdev_check_buf_bit(const char *buf)
  */
 sdev_rd_attr (device_blocked, "%d\n");
 sdev_rd_attr (queue_depth, "%d\n");
+sdev_rd_attr (device_busy, "%d\n");
 sdev_rd_attr (type, "%d\n");
 sdev_rd_attr (scsi_level, "%d\n");
 sdev_rd_attr (vendor, "%.8s\n");
@@ -750,6 +788,7 @@ static struct attribute *scsi_sdev_attrs[] = {
        &dev_attr_device_blocked.attr,
        &dev_attr_type.attr,
        &dev_attr_scsi_level.attr,
+       &dev_attr_device_busy.attr,
        &dev_attr_vendor.attr,
        &dev_attr_model.attr,
        &dev_attr_rev.attr,