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 [email protected]
To unsubscribe from this group, send email to
[email protected]
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;
}