[SCSI] Add 'eh_deadline' to limit SCSI EH runtime
This patchs adds an 'eh_deadline' sysfs attribute to the scsi host which limits the overall runtime of the SCSI EH. The 'eh_deadline' value is stored in the now obsolete field 'resetting'. When a command is failed the start time of the EH is stored in 'last_reset'. If the overall runtime of the SCSI EH is longer than last_reset + eh_deadline, the EH is short-circuited and falls through to issue a host reset only. [jejb: add comments in Scsi_Host about new fields] Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:

committed by
James Bottomley

parent
6b1e5a45d4
commit
b45620229d
@@ -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
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user