| From stable-bounces@linux.kernel.org Tue May 13 12:10:47 2008 |
| From: Mike Christie <michaelc@cs.wisc.edu> |
| Date: Tue, 13 May 2008 19:10:25 GMT |
| Subject: SCSI: libiscsi regression in 2.6.25: fix setting of recv timer |
| To: jejb@kernel.org, stable@kernel.org |
| Message-ID: <200805131910.m4DJAP1R007667@hera.kernel.org> |
| |
| From: Mike Christie <michaelc@cs.wisc.edu> |
| |
| commit c8611f975403dd20e6503aff8aded5dcb718f75b upstream |
| |
| If the ping tmo is longer than the recv tmo then we could miss a window |
| where we were supposed to check the recv tmo. This happens because |
| the ping code will set the next timeout for the ping timeout, and if the |
| ping executes quickly there will be a long chunk of time before the |
| timer wakes up again. |
| |
| This patch has the ping processing code kick off a recv |
| tmo check when getting a nop in response to our ping. |
| |
| Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/libiscsi.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/scsi/libiscsi.c |
| +++ b/drivers/scsi/libiscsi.c |
| @@ -635,7 +635,9 @@ static int __iscsi_complete_pdu(struct i |
| 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: |
| @@ -1378,11 +1380,9 @@ static void iscsi_check_transport_timeou |
| } |
| |
| 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); |
| - } |
| + /* 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 + recv_timeout; |