|
@@ -475,7 +475,8 @@ MODULE_PARM_DESC(dev_loss_tmo,
|
|
|
"Maximum number of seconds that the FC transport should"
|
|
|
" insulate the loss of a remote port. Once this value is"
|
|
|
" exceeded, the scsi target is removed. Value should be"
|
|
|
- " between 1 and SCSI_DEVICE_BLOCK_MAX_TIMEOUT.");
|
|
|
+ " between 1 and SCSI_DEVICE_BLOCK_MAX_TIMEOUT if"
|
|
|
+ " fast_io_fail_tmo is not set.");
|
|
|
|
|
|
/*
|
|
|
* Netlink Infrastructure
|
|
@@ -842,9 +843,17 @@ store_fc_rport_dev_loss_tmo(struct device *dev, struct device_attribute *attr,
|
|
|
(rport->port_state == FC_PORTSTATE_NOTPRESENT))
|
|
|
return -EBUSY;
|
|
|
val = simple_strtoul(buf, &cp, 0);
|
|
|
- if ((*cp && (*cp != '\n')) ||
|
|
|
- (val < 0) || (val > SCSI_DEVICE_BLOCK_MAX_TIMEOUT))
|
|
|
+ if ((*cp && (*cp != '\n')) || (val < 0))
|
|
|
return -EINVAL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If fast_io_fail is off we have to cap
|
|
|
+ * dev_loss_tmo at SCSI_DEVICE_BLOCK_MAX_TIMEOUT
|
|
|
+ */
|
|
|
+ if (rport->fast_io_fail_tmo == -1 &&
|
|
|
+ val > SCSI_DEVICE_BLOCK_MAX_TIMEOUT)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
i->f->set_rport_dev_loss_tmo(rport, val);
|
|
|
return count;
|
|
|
}
|
|
@@ -925,9 +934,16 @@ store_fc_rport_fast_io_fail_tmo(struct device *dev,
|
|
|
rport->fast_io_fail_tmo = -1;
|
|
|
else {
|
|
|
val = simple_strtoul(buf, &cp, 0);
|
|
|
- if ((*cp && (*cp != '\n')) ||
|
|
|
- (val < 0) || (val >= rport->dev_loss_tmo))
|
|
|
+ if ((*cp && (*cp != '\n')) || (val < 0))
|
|
|
return -EINVAL;
|
|
|
+ /*
|
|
|
+ * Cap fast_io_fail by dev_loss_tmo or
|
|
|
+ * SCSI_DEVICE_BLOCK_MAX_TIMEOUT.
|
|
|
+ */
|
|
|
+ if ((val >= rport->dev_loss_tmo) ||
|
|
|
+ (val > SCSI_DEVICE_BLOCK_MAX_TIMEOUT))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
rport->fast_io_fail_tmo = val;
|
|
|
}
|
|
|
return count;
|