Browse Source

[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>
tags/v1.20.1
Michael Brown 14 years ago
parent
commit
1b8984eb5d
1 changed files with 9 additions and 4 deletions
  1. 9
    4
      src/net/tcp/iscsi.c

+ 9
- 4
src/net/tcp/iscsi.c View File

1333
 static void iscsi_start_tx ( struct iscsi_session *iscsi ) {
1333
 static void iscsi_start_tx ( struct iscsi_session *iscsi ) {
1334
 
1334
 
1335
 	assert ( iscsi->tx_state == ISCSI_TX_IDLE );
1335
 	assert ( iscsi->tx_state == ISCSI_TX_IDLE );
1336
-	assert ( ! process_running ( &iscsi->process ) );
1336
+
1337
-	
1338
 	/* Initialise TX BHS */
1337
 	/* Initialise TX BHS */
1339
 	memset ( &iscsi->tx_bhs, 0, sizeof ( iscsi->tx_bhs ) );
1338
 	memset ( &iscsi->tx_bhs, 0, sizeof ( iscsi->tx_bhs ) );
1340
 
1339
 
1476
 			next_state = ISCSI_TX_IDLE;
1475
 			next_state = ISCSI_TX_IDLE;
1477
 			break;
1476
 			break;
1478
 		case ISCSI_TX_IDLE:
1477
 		case ISCSI_TX_IDLE:
1479
-			/* Stop processing */
1478
+			/* Nothing to do; pause processing */
1480
-			iscsi_tx_done ( iscsi );
1479
+			iscsi_tx_pause ( iscsi );
1481
 			return;
1480
 			return;
1482
 		default:
1481
 		default:
1483
 			assert ( 0 );
1482
 			assert ( 0 );
1504
 
1503
 
1505
 		/* Move to next state */
1504
 		/* Move to next state */
1506
 		iscsi->tx_state = next_state;
1505
 		iscsi->tx_state = next_state;
1506
+
1507
+		/* If we have moved to the idle state, mark
1508
+		 * transmission as complete
1509
+		 */
1510
+		if ( iscsi->tx_state == ISCSI_TX_IDLE )
1511
+			iscsi_tx_done ( iscsi );
1507
 	}
1512
 	}
1508
 }
1513
 }
1509
 
1514
 

Loading…
Cancel
Save