Mike Christie wrote:
> 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.
>
Sorry. This one fixes a possible leak.
--~--~---------~--~----~------------~-------~--~----~
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 2b1b834..a8e5089 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -245,6 +245,12 @@ 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)) {
+ r = -ENODATA;
+ goto unmap;
+ }
+
r = 0;
offset = segment->copied;
copy = segment->size - offset;
@@ -268,13 +274,16 @@ static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
r = kernel_sendmsg(sk, &msg, &iov, 1, copy);
}
- if (r < 0) {
- iscsi_tcp_segment_unmap(segment);
- return r;
- }
+ if (r < 0)
+ goto unmap;
+
copied += r;
}
return copied;
+
+unmap:
+ iscsi_tcp_segment_unmap(segment);
+ return r;
}
/**
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;
}