diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2008-05-05 21:45:13 -0500 |
---|---|---|
committer | Mike Christie <michaelc@cs.wisc.edu> | 2008-05-05 21:48:26 -0500 |
commit | 611c947adce93727c6864413f5159b964326837f (patch) | |
tree | c3619da37ea68a7fb015409c475d90b5a86bc713 /kernel | |
parent | ad5a2741457b41ee2005401ffc4aae49d0fb9cbb (diff) | |
download | open-iscsi-611c947adce93727c6864413f5159b964326837f.tar.gz |
libiscsi: Fix nop timeout handling
If the transport timer wakes at the exact same time we were supposed
to check the transport we drop the connection instead of checking
it.
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/libiscsi.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/kernel/libiscsi.c b/kernel/libiscsi.c index 30ea61a..ed37f1b 100644 --- a/kernel/libiscsi.c +++ b/kernel/libiscsi.c @@ -1353,19 +1353,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, " @@ -1376,15 +1377,15 @@ static void iscsi_check_transport_timeouts(unsigned long data) return; } - if (time_before_eq(last_recv + timeout, jiffies)) { + if (time_before_eq(last_recv + 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); + 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); |