diff options
Diffstat (limited to 'drivers/scsi/libiscsi.c')
| -rw-r--r-- | drivers/scsi/libiscsi.c | 17 | 
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 33c74d3436c9..6bffd91b973a 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -976,13 +976,13 @@ static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr)  	wake_up(&conn->ehwait);  } -static void iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr) +static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)  {          struct iscsi_nopout hdr;  	struct iscsi_task *task;  	if (!rhdr && conn->ping_task) -		return; +		return -EINVAL;  	memset(&hdr, 0, sizeof(struct iscsi_nopout));  	hdr.opcode = ISCSI_OP_NOOP_OUT | ISCSI_OP_IMMEDIATE; @@ -996,13 +996,16 @@ static void iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)  		hdr.ttt = RESERVED_ITT;  	task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0); -	if (!task) +	if (!task) {  		iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n"); -	else if (!rhdr) { +		return -EIO; +	} else if (!rhdr) {  		/* only track our nops */  		conn->ping_task = task;  		conn->last_ping = jiffies;  	} + +	return 0;  }  static int iscsi_nop_out_rsp(struct iscsi_task *task, @@ -2092,8 +2095,10 @@ static void iscsi_check_transport_timeouts(unsigned long data)  	if (time_before_eq(last_recv + recv_timeout, jiffies)) {  		/* send a ping to try to provoke some traffic */  		ISCSI_DBG_CONN(conn, "Sending nopout as ping\n"); -		iscsi_send_nopout(conn, NULL); -		next_timeout = conn->last_ping + (conn->ping_timeout * HZ); +		if (iscsi_send_nopout(conn, NULL)) +			next_timeout = jiffies + (1 * HZ); +		else +			next_timeout = conn->last_ping + (conn->ping_timeout * HZ);  	} else  		next_timeout = last_recv + recv_timeout;  | 
