Skip to content

Commit

Permalink
[iscsi] Avoid duplicate calls to iscsi_tx_done()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Jun 29, 2011
1 parent 95d82bb commit 1b8984e
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/net/tcp/iscsi.c
Expand Up @@ -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 ) );

Expand Down Expand Up @@ -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 );
Expand All @@ -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 );
}
}

Expand Down

0 comments on commit 1b8984e

Please sign in to comment.