mirror of
https://github.com/ipxe/ipxe
synced 2025-12-26 17:42:47 +03:00
[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>
This commit is contained in:
@@ -1333,8 +1333,7 @@ static void iscsi_tx_resume ( struct iscsi_session *iscsi ) {
|
|||||||
static void iscsi_start_tx ( struct iscsi_session *iscsi ) {
|
static void iscsi_start_tx ( struct iscsi_session *iscsi ) {
|
||||||
|
|
||||||
assert ( iscsi->tx_state == ISCSI_TX_IDLE );
|
assert ( iscsi->tx_state == ISCSI_TX_IDLE );
|
||||||
assert ( ! process_running ( &iscsi->process ) );
|
|
||||||
|
|
||||||
/* Initialise TX BHS */
|
/* Initialise TX BHS */
|
||||||
memset ( &iscsi->tx_bhs, 0, sizeof ( iscsi->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;
|
next_state = ISCSI_TX_IDLE;
|
||||||
break;
|
break;
|
||||||
case ISCSI_TX_IDLE:
|
case ISCSI_TX_IDLE:
|
||||||
/* Stop processing */
|
/* Nothing to do; pause processing */
|
||||||
iscsi_tx_done ( iscsi );
|
iscsi_tx_pause ( iscsi );
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
assert ( 0 );
|
assert ( 0 );
|
||||||
@@ -1504,6 +1503,12 @@ static void iscsi_tx_step ( struct iscsi_session *iscsi ) {
|
|||||||
|
|
||||||
/* Move to next state */
|
/* Move to next state */
|
||||||
iscsi->tx_state = 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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user