|  | @@ -270,7 +270,7 @@ static int iscsi_rx_scsi_response ( struct iscsi_session *iscsi,
 | 
		
	
		
			
			| 270 | 270 |   */
 | 
		
	
		
			
			| 271 | 271 |  static int iscsi_rx_data_in ( struct iscsi_session *iscsi,
 | 
		
	
		
			
			| 272 | 272 |  			      const void *data, size_t len,
 | 
		
	
		
			
			| 273 |  | -			      size_t remaining __unused ) {
 | 
		
	
		
			
			|  | 273 | +			      size_t remaining ) {
 | 
		
	
		
			
			| 274 | 274 |  	struct iscsi_bhs_data_in *data_in = &iscsi->rx_bhs.data_in;
 | 
		
	
		
			
			| 275 | 275 |  	unsigned long offset;
 | 
		
	
		
			
			| 276 | 276 |  
 | 
		
	
	
		
			
			|  | @@ -281,14 +281,16 @@ static int iscsi_rx_data_in ( struct iscsi_session *iscsi,
 | 
		
	
		
			
			| 281 | 281 |  	assert ( ( offset + len ) <= iscsi->command->data_in_len );
 | 
		
	
		
			
			| 282 | 282 |  	copy_to_user ( iscsi->command->data_in, offset, data, len );
 | 
		
	
		
			
			| 283 | 283 |  
 | 
		
	
		
			
			| 284 |  | -	/* Record SCSI status, if present */
 | 
		
	
		
			
			| 285 |  | -	if ( data_in->flags & ISCSI_DATA_FLAG_STATUS )
 | 
		
	
		
			
			| 286 |  | -		iscsi->command->status = data_in->status;
 | 
		
	
		
			
			|  | 284 | +	/* Wait for whole SCSI response to arrive */
 | 
		
	
		
			
			|  | 285 | +	if ( remaining )
 | 
		
	
		
			
			|  | 286 | +		return 0;
 | 
		
	
		
			
			| 287 | 287 |  
 | 
		
	
		
			
			| 288 |  | -	/* If this is the end, flag as complete */
 | 
		
	
		
			
			| 289 |  | -	if ( ( offset + len ) == iscsi->command->data_in_len ) {
 | 
		
	
		
			
			|  | 288 | +	/* Mark as completed if status is present */
 | 
		
	
		
			
			|  | 289 | +	if ( data_in->flags & ISCSI_DATA_FLAG_STATUS ) {
 | 
		
	
		
			
			|  | 290 | +		assert ( ( offset + len ) == iscsi->command->data_in_len );
 | 
		
	
		
			
			| 290 | 291 |  		assert ( data_in->flags & ISCSI_FLAG_FINAL );
 | 
		
	
		
			
			| 291 |  | -		assert ( remaining == 0 );
 | 
		
	
		
			
			|  | 292 | +		iscsi->command->status = data_in->status;
 | 
		
	
		
			
			|  | 293 | +		/* iSCSI cannot return an error status via a data-in */
 | 
		
	
		
			
			| 292 | 294 |  		iscsi_scsi_done ( iscsi, 0 );
 | 
		
	
		
			
			| 293 | 295 |  	}
 | 
		
	
		
			
			| 294 | 296 |  
 | 
		
	
	
		
			
			|  | @@ -568,6 +570,7 @@ static int iscsi_tx_login_request ( struct iscsi_session *iscsi ) {
 | 
		
	
		
			
			| 568 | 570 |   */
 | 
		
	
		
			
			| 569 | 571 |  static int iscsi_handle_targetaddress_value ( struct iscsi_session *iscsi,
 | 
		
	
		
			
			| 570 | 572 |  					      const char *value ) {
 | 
		
	
		
			
			|  | 573 | +	char *separator;
 | 
		
	
		
			
			| 571 | 574 |  
 | 
		
	
		
			
			| 572 | 575 |  	DBGC ( iscsi, "iSCSI %p will redirect to %s\n", iscsi, value );
 | 
		
	
		
			
			| 573 | 576 |  
 | 
		
	
	
		
			
			|  | @@ -576,6 +579,15 @@ static int iscsi_handle_targetaddress_value ( struct iscsi_session *iscsi,
 | 
		
	
		
			
			| 576 | 579 |  	iscsi->target_address = strdup ( value );
 | 
		
	
		
			
			| 577 | 580 |  	if ( ! iscsi->target_address )
 | 
		
	
		
			
			| 578 | 581 |  		return -ENOMEM;
 | 
		
	
		
			
			|  | 582 | +
 | 
		
	
		
			
			|  | 583 | +	/* Replace target port */
 | 
		
	
		
			
			|  | 584 | +	iscsi->target_port = htons ( ISCSI_PORT );
 | 
		
	
		
			
			|  | 585 | +	separator = strchr ( iscsi->target_address, ':' );
 | 
		
	
		
			
			|  | 586 | +	if ( separator ) {
 | 
		
	
		
			
			|  | 587 | +		*separator = '\0';
 | 
		
	
		
			
			|  | 588 | +		iscsi->target_port = strtoul ( ( separator + 1 ), NULL, 0 );
 | 
		
	
		
			
			|  | 589 | +	}
 | 
		
	
		
			
			|  | 590 | +
 | 
		
	
		
			
			| 579 | 591 |  	return 0;
 | 
		
	
		
			
			| 580 | 592 |  }
 | 
		
	
		
			
			| 581 | 593 |  
 |