Santi Saez wrote:
> What means "iscsi: detected conn error"? It's really a problem, or only a
> warning?
> 

It is an error in that we tried to send a ping to the target and did not 
get a response.

Are you using the kernel from CentOS 5.2? If so it has a bug in that 
code patch that you might be hitting. The bug is that the code thought 
the ping timedout when it had not, so the driver would fire off the conn 
error and start recovery when we should not have.

The attached patch should fix that. This should also be fixed in Centos 5.3.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-iscsi@googlegroups.com
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/open-iscsi
-~----------~----~----~----~------~----~------~--~---

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 6af7606..603fc50 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -584,7 +584,9 @@ 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:
@@ -1306,19 +1308,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)) {
                printk(KERN_ERR "ping timeout of %d secs expired, "
                       "last rx %lu, last ping %lu, now %lu\n",
@@ -1329,15 +1332,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);

Reply via email to