diff options
Diffstat (limited to 'drivers/scsi/libiscsi.c')
| -rw-r--r-- | drivers/scsi/libiscsi.c | 29 | 
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 010c1b9b178..b43bf1d60da 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -730,7 +730,9 @@ static int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,  				if (iscsi_recv_pdu(conn->cls_conn, hdr, data,  						   datalen))  					rc = ISCSI_ERR_CONN_FAILED; -			} +			} else +				mod_timer(&conn->transport_timer, +					  jiffies + conn->recv_timeout);  			iscsi_free_mgmt_task(conn, mtask);  			break;  		default: @@ -1453,19 +1455,20 @@ static void iscsi_check_transport_timeouts(unsigned long data)  {  	struct iscsi_conn *conn = (struct iscsi_conn *)data;  	struct iscsi_session *session = conn->session; -	unsigned long timeout, next_timeout = 0, last_recv; +	unsigned long recv_timeout, next_timeout = 0, last_recv;  	spin_lock(&session->lock);  	if (session->state != ISCSI_STATE_LOGGED_IN)  		goto done; -	timeout = conn->recv_timeout; -	if (!timeout) +	recv_timeout = conn->recv_timeout; +	if (!recv_timeout)  		goto done; -	timeout *= HZ; +	recv_timeout *= HZ;  	last_recv = conn->last_recv; -	if (time_before_eq(last_recv + timeout + (conn->ping_timeout * HZ), +	if (conn->ping_mtask && +	    time_before_eq(conn->last_ping + (conn->ping_timeout * HZ),  			   jiffies)) {  		iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs "  				  "expired, last rx %lu, last ping %lu, " @@ -1476,15 +1479,13 @@ static void iscsi_check_transport_timeouts(unsigned long data)  		return;  	} -	if (time_before_eq(last_recv + timeout, jiffies)) { -		if (time_before_eq(conn->last_ping, last_recv)) { -			/* send a ping to try to provoke some traffic */ -			debug_scsi("Sending nopout as ping on conn %p\n", conn); -			iscsi_send_nopout(conn, NULL); -		} -		next_timeout = last_recv + timeout + (conn->ping_timeout * HZ); +	if (time_before_eq(last_recv + recv_timeout, jiffies)) { +		/* send a ping to try to provoke some traffic */ +		debug_scsi("Sending nopout as ping on conn %p\n", conn); +		iscsi_send_nopout(conn, NULL); +		next_timeout = conn->last_ping + (conn->ping_timeout * HZ);  	} else -		next_timeout = last_recv + timeout; +		next_timeout = last_recv + recv_timeout;  	debug_scsi("Setting next tmo %lu\n", next_timeout);  	mod_timer(&conn->transport_timer, next_timeout);  |