|
@@ -1909,6 +1909,16 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
|
|
|
ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc);
|
|
|
|
|
|
spin_lock(&session->lock);
|
|
|
+ task = (struct iscsi_task *)sc->SCp.ptr;
|
|
|
+ if (!task) {
|
|
|
+ /*
|
|
|
+ * Raced with completion. Blk layer has taken ownership
|
|
|
+ * so let timeout code complete it now.
|
|
|
+ */
|
|
|
+ rc = BLK_EH_HANDLED;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
if (session->state != ISCSI_STATE_LOGGED_IN) {
|
|
|
/*
|
|
|
* We are probably in the middle of iscsi recovery so let
|
|
@@ -1925,16 +1935,6 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
- task = (struct iscsi_task *)sc->SCp.ptr;
|
|
|
- if (!task) {
|
|
|
- /*
|
|
|
- * Raced with completion. Just reset timer, and let it
|
|
|
- * complete normally
|
|
|
- */
|
|
|
- rc = BLK_EH_RESET_TIMER;
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* If we have sent (at least queued to the network layer) a pdu or
|
|
|
* recvd one for the task since the last timeout ask for
|