aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/tcp/iscsi.c
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2011-06-29 14:49:18 +0100
committerMichael Brown <mcb30@ipxe.org>2011-06-29 14:52:30 +0100
commit1b8984eb5da23e58f275478474dd6ab8d7a785ea (patch)
treefb90e94dfb4511a62937793177ee53cc46573548 /src/net/tcp/iscsi.c
parent95d82bb2a23bf645d995aed0d643cc34d5d8a3af (diff)
downloadipxe-1b8984eb5da23e58f275478474dd6ab8d7a785ea.tar.gz
[iscsi] Avoid duplicate calls to iscsi_tx_done()
The iSCSI TX process can now be woken up by the TCP socket via xfer_window_changed(), so it is no longer valid to assume that iscsi_tx_step() can be called in state ISCSI_TX_IDLE only immediately after completing a transmission. Fix by calling iscsi_tx_done() only upon a transition into state ISCSI_TX_IDLE. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/tcp/iscsi.c')
-rw-r--r--src/net/tcp/iscsi.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c
index 878155992..8beeb8777 100644
--- a/src/net/tcp/iscsi.c
+++ b/src/net/tcp/iscsi.c
@@ -1333,8 +1333,7 @@ static void iscsi_tx_resume ( struct iscsi_session *iscsi ) {
static void iscsi_start_tx ( struct iscsi_session *iscsi ) {
assert ( iscsi->tx_state == ISCSI_TX_IDLE );
- assert ( ! process_running ( &iscsi->process ) );
-
+
/* Initialise TX BHS */
memset ( &iscsi->tx_bhs, 0, sizeof ( iscsi->tx_bhs ) );
@@ -1476,8 +1475,8 @@ static void iscsi_tx_step ( struct iscsi_session *iscsi ) {
next_state = ISCSI_TX_IDLE;
break;
case ISCSI_TX_IDLE:
- /* Stop processing */
- iscsi_tx_done ( iscsi );
+ /* Nothing to do; pause processing */
+ iscsi_tx_pause ( iscsi );
return;
default:
assert ( 0 );
@@ -1504,6 +1503,12 @@ static void iscsi_tx_step ( struct iscsi_session *iscsi ) {
/* Move to next state */
iscsi->tx_state = next_state;
+
+ /* If we have moved to the idle state, mark
+ * transmission as complete
+ */
+ if ( iscsi->tx_state == ISCSI_TX_IDLE )
+ iscsi_tx_done ( iscsi );
}
}