|
@@ -66,6 +66,7 @@ static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
|
|
|
static int qla4xxx_host_get_param(struct Scsi_Host *shost,
|
|
|
enum iscsi_host_param param, char *buf);
|
|
|
static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session);
|
|
|
+static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc);
|
|
|
|
|
|
/*
|
|
|
* SCSI host template entry points
|
|
@@ -89,6 +90,7 @@ static struct scsi_host_template qla4xxx_driver_template = {
|
|
|
.eh_device_reset_handler = qla4xxx_eh_device_reset,
|
|
|
.eh_target_reset_handler = qla4xxx_eh_target_reset,
|
|
|
.eh_host_reset_handler = qla4xxx_eh_host_reset,
|
|
|
+ .eh_timed_out = qla4xxx_eh_cmd_timed_out,
|
|
|
|
|
|
.slave_configure = qla4xxx_slave_configure,
|
|
|
.slave_alloc = qla4xxx_slave_alloc,
|
|
@@ -124,6 +126,21 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
|
|
|
|
|
|
static struct scsi_transport_template *qla4xxx_scsi_transport;
|
|
|
|
|
|
+static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc)
|
|
|
+{
|
|
|
+ struct iscsi_cls_session *session;
|
|
|
+ struct ddb_entry *ddb_entry;
|
|
|
+
|
|
|
+ session = starget_to_session(scsi_target(sc->device));
|
|
|
+ ddb_entry = session->dd_data;
|
|
|
+
|
|
|
+ /* if we are not logged in then the LLD is going to clean up the cmd */
|
|
|
+ if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)
|
|
|
+ return BLK_EH_RESET_TIMER;
|
|
|
+ else
|
|
|
+ return BLK_EH_NOT_HANDLED;
|
|
|
+}
|
|
|
+
|
|
|
static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
|
|
|
{
|
|
|
struct ddb_entry *ddb_entry = session->dd_data;
|