Mike Christie wrote:
> Mike Christie wrote:
>> On 07/31/2009 07:43 AM, Erez Zilber wrote:
>>> I thought that this patch just reduces the timeout from 15 to 3. Does
>>> it also fix the 3 sndtmo periods or is it another patch? What was the
>> Another patch. You should have it.
>>
>>> bug that caused the 3 sndtmo periods waiting?
>>>
>> I think I meant two.
>>
>> If iscsi_tcp_xmit_segment sent some data, then got EAGIN, it would drop 
>> the EAGIN. iscsi_xmit would then retry the operation so we would wait again.
>>
> 
> There is one more bug.
> 
> Could you try the 15->3 sec snd tmp patch plus the attached patch?
> 
> Another problem is that if we had multiple tasks on the cmd or requeue 
> lists, and iscsi_tcp returns a error, the write_space function can still 
> run and queue iscsi_data_xmit. If it was a legetimate problem and 
> iscsi_conn_failure was run but we raced and iscsi_data_xmit was run 
> first it could miss the suspend bit checks, and start trying to send 
> data again and hit another timeout.
> 

Here is a updated patch that also fixes the problem for cxgb3i and 
iscsi_tcp.

--~--~---------~--~----~------------~-------~--~----~
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/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index d00257e..955c4d4 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -245,6 +245,10 @@ static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
 		unsigned int offset, copy;
 		int flags = 0;
 
+		if (test_bit(ISCSI_SUSPEND_BIT,
+			     &tcp_conn->iscsi_conn->suspend_tx))
+			return -ENODATA;
+
 		r = 0;
 		offset = segment->copied;
 		copy = segment->size - offset;
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 1d7a8b7..a7ee4bb 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1280,6 +1280,9 @@ static int iscsi_xmit_task(struct iscsi_conn *conn)
 	struct iscsi_task *task = conn->task;
 	int rc;
 
+	if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx))
+		return -ENODATA;
+
 	__iscsi_get_task(task);
 	spin_unlock_bh(&conn->session->lock);
 	rc = conn->session->tt->xmit_task(task);
@@ -1329,7 +1332,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
 	int rc = 0;
 
 	spin_lock_bh(&conn->session->lock);
-	if (unlikely(conn->suspend_tx)) {
+	if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) {
 		ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n");
 		spin_unlock_bh(&conn->session->lock);
 		return -ENODATA;
@@ -1338,7 +1341,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
 	if (conn->task) {
 		rc = iscsi_xmit_task(conn);
 	        if (rc)
-		        goto again;
+		        goto done;
 	}
 
 	/*
@@ -1358,7 +1361,7 @@ check_mgmt:
 		}
 		rc = iscsi_xmit_task(conn);
 		if (rc)
-			goto again;
+			goto done;
 	}
 
 	/* process pending command queue */
@@ -1379,14 +1382,14 @@ check_mgmt:
 				list_add_tail(&conn->task->running,
 					      &conn->cmdqueue);
 				conn->task = NULL;
-				goto again;
+				goto done;
 			} else
 				fail_scsi_task(conn->task, DID_ABORT);
 			continue;
 		}
 		rc = iscsi_xmit_task(conn);
 		if (rc)
-			goto again;
+			goto done;
 		/*
 		 * we could continuously get new task requests so
 		 * we need to check the mgmt queue for nops that need to
@@ -1412,16 +1415,14 @@ check_mgmt:
 		conn->task->state = ISCSI_TASK_RUNNING;
 		rc = iscsi_xmit_task(conn);
 		if (rc)
-			goto again;
+			goto done;
 		if (!list_empty(&conn->mgmtqueue))
 			goto check_mgmt;
 	}
 	spin_unlock_bh(&conn->session->lock);
 	return -ENODATA;
 
-again:
-	if (unlikely(conn->suspend_tx))
-		rc = -ENODATA;
+done:
 	spin_unlock_bh(&conn->session->lock);
 	return rc;
 }

Reply via email to