summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2011-06-29 15:49:18 +0200
committerMichael Brown2011-06-29 15:52:30 +0200
commit1b8984eb5da23e58f275478474dd6ab8d7a785ea (patch)
treefb90e94dfb4511a62937793177ee53cc46573548 /src
parent[build] Avoid using -ffunction-sections on some older versions of gcc (diff)
downloadipxe-1b8984eb5da23e58f275478474dd6ab8d7a785ea.tar.gz
ipxe-1b8984eb5da23e58f275478474dd6ab8d7a785ea.tar.xz
ipxe-1b8984eb5da23e58f275478474dd6ab8d7a785ea.zip
[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')
-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 87815599..8beeb877 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 );
}
}