diff options
Diffstat (limited to 'drivers/scsi/libiscsi.c')
| -rw-r--r-- | drivers/scsi/libiscsi.c | 20 | 
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 8582d7c2573..82c3fd4bc93 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -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  |