mirror of
https://github.com/ipxe/ipxe
synced 2026-01-03 02:13:23 +03:00
[scsi] Improve sense code parsing
Parse the sense data to extract the reponse code, the sense key, the additional sense code, and the additional sense code qualifier. Originally-implemented-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -551,7 +551,6 @@ static int fcpcmd_recv_rsp ( struct fcp_command *fcpcmd,
|
||||
struct fcp_device *fcpdev = fcpcmd->fcpdev;
|
||||
struct scsi_cmd *command = &fcpcmd->command;
|
||||
struct fcp_rsp *rsp = iobuf->data;
|
||||
struct scsi_sense *sense;
|
||||
struct scsi_rsp response;
|
||||
int rc;
|
||||
|
||||
@@ -607,8 +606,8 @@ static int fcpcmd_recv_rsp ( struct fcp_command *fcpcmd,
|
||||
if ( rsp->flags & FCP_RSP_RESIDUAL_UNDERRUN )
|
||||
response.overrun = -response.overrun;
|
||||
}
|
||||
if ( ( sense = fcp_rsp_sense_data ( rsp ) ) != NULL )
|
||||
memcpy ( &response.sense, sense, sizeof ( response.sense ) );
|
||||
scsi_parse_sense ( fcp_rsp_sense_data ( rsp ),
|
||||
fcp_rsp_sense_data_len ( rsp ), &response.sense );
|
||||
|
||||
/* Free buffer before sending response, to minimise
|
||||
* out-of-memory errors.
|
||||
|
||||
@@ -412,11 +412,12 @@ static int iscsi_rx_scsi_response ( struct iscsi_session *iscsi,
|
||||
= &iscsi->rx_bhs.scsi_response;
|
||||
struct scsi_rsp rsp;
|
||||
uint32_t residual_count;
|
||||
size_t data_len;
|
||||
int rc;
|
||||
|
||||
/* Buffer up the PDU data */
|
||||
if ( ( rc = iscsi_rx_buffered_data ( iscsi, data, len ) ) != 0 ) {
|
||||
DBGC ( iscsi, "iSCSI %p could not buffer login response: %s\n",
|
||||
DBGC ( iscsi, "iSCSI %p could not buffer SCSI response: %s\n",
|
||||
iscsi, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
@@ -432,9 +433,11 @@ static int iscsi_rx_scsi_response ( struct iscsi_session *iscsi,
|
||||
} else if ( response->flags & ISCSI_DATA_FLAG_UNDERFLOW ) {
|
||||
rsp.overrun = -(residual_count);
|
||||
}
|
||||
if ( ISCSI_DATA_LEN ( response->lengths ) )
|
||||
memcpy ( &rsp.sense, ( iscsi->rx_buffer + 2 ),
|
||||
sizeof ( rsp.sense ) );
|
||||
data_len = ISCSI_DATA_LEN ( response->lengths );
|
||||
if ( data_len ) {
|
||||
scsi_parse_sense ( ( iscsi->rx_buffer + 2 ), ( data_len - 2 ),
|
||||
&rsp.sense );
|
||||
}
|
||||
iscsi_rx_buffered_data_done ( iscsi );
|
||||
|
||||
/* Check for errors */
|
||||
|
||||
Reference in New Issue
Block a user