mirror of
https://github.com/ipxe/ipxe
synced 2025-12-24 15:23:42 +03:00
[scsi] Make SCSI command issuing partially asynchronous
Move the icky call to step() from iscsi.c to scsi.c; this takes it at least one step further away from where it really doesn't belong.
This commit is contained in:
@@ -182,9 +182,10 @@ static void iscsi_close_connection ( struct iscsi_session *iscsi, int rc ) {
|
||||
static void iscsi_scsi_done ( struct iscsi_session *iscsi, int rc ) {
|
||||
|
||||
assert ( iscsi->tx_state == ISCSI_TX_IDLE );
|
||||
assert ( iscsi->command != NULL );
|
||||
|
||||
iscsi->command->rc = rc;
|
||||
iscsi->command = NULL;
|
||||
iscsi->rc = rc;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@@ -1550,32 +1551,24 @@ static int iscsi_command ( struct scsi_device *scsi,
|
||||
container_of ( scsi->backend, struct iscsi_session, refcnt );
|
||||
int rc;
|
||||
|
||||
/* Abort immediately if we have a recorded permanent failure */
|
||||
if ( iscsi->instant_rc )
|
||||
return iscsi->instant_rc;
|
||||
|
||||
/* Record SCSI command */
|
||||
iscsi->command = command;
|
||||
|
||||
/* Abort immediately if we have a recorded permanent failure */
|
||||
if ( iscsi->instant_rc ) {
|
||||
rc = iscsi->instant_rc;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Issue command or open connection as appropriate */
|
||||
if ( iscsi->status ) {
|
||||
iscsi_start_command ( iscsi );
|
||||
} else {
|
||||
if ( ( rc = iscsi_open_connection ( iscsi ) ) != 0 )
|
||||
goto done;
|
||||
if ( ( rc = iscsi_open_connection ( iscsi ) ) != 0 ) {
|
||||
iscsi->command = NULL;
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
/* Wait for command to complete */
|
||||
iscsi->rc = -EINPROGRESS;
|
||||
while ( iscsi->rc == -EINPROGRESS )
|
||||
step();
|
||||
rc = iscsi->rc;
|
||||
|
||||
done:
|
||||
iscsi->command = NULL;
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iscsi_detached_command ( struct scsi_device *scsi __unused,
|
||||
|
||||
Reference in New Issue
Block a user