scsi_transport_srp: Reduce failover time
authorBart Van Assche <bart.vanassche@sandisk.com>
Mon, 18 May 2015 11:24:38 +0000 (13:24 +0200)
committerDoug Ledford <dledford@redhat.com>
Mon, 18 May 2015 17:35:55 +0000 (13:35 -0400)
Unlike FC, there is no risk that SCSI devices will be offlined
by the SCSI error handler if the SCSI error handler is started
while a reconnect attempt is ongoing. Hence report timeout errors
as soon as possible if a higher software layer (e.g. multipathd)
needs to be informed about a timeout. It is assumed that if both
fast_io_fail_tmo < 0 and rport->dev_loss_tmo < 0 that this means
that there is no need to report timeouts quickly.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: James Bottomley <JBottomley@Odin.com>
Cc: Sagi Grimberg <sagig@mellanox.com>
Cc: Sebastian Parschauer <sebastian.riemer@profitbricks.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/scsi/scsi_transport_srp.c

index f115f67a6ba58c65d1cf07cbfcb3a0630c9f6da9..a85292b1d09d090261f89f2f6eed018f6277abb9 100644 (file)
@@ -61,6 +61,11 @@ static inline struct Scsi_Host *rport_to_shost(struct srp_rport *r)
        return dev_to_shost(r->dev.parent);
 }
 
+static inline struct srp_rport *shost_to_rport(struct Scsi_Host *shost)
+{
+       return transport_class_to_srp_rport(&shost->shost_gendev);
+}
+
 /**
  * srp_tmo_valid() - check timeout combination validity
  * @reconnect_delay: Reconnect delay in seconds.
@@ -628,9 +633,11 @@ static enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd)
        struct scsi_device *sdev = scmd->device;
        struct Scsi_Host *shost = sdev->host;
        struct srp_internal *i = to_srp_internal(shost->transportt);
+       struct srp_rport *rport = shost_to_rport(shost);
 
        pr_debug("timeout for sdev %s\n", dev_name(&sdev->sdev_gendev));
-       return i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ?
+       return rport->fast_io_fail_tmo < 0 && rport->dev_loss_tmo < 0 &&
+               i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ?
                BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED;
 }