From eb1cd24e2174e5ee3e06580ee4558b4e698cd380 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 21 Apr 2022 09:34:36 +0200 Subject: [PATCH] pbs-tape: sgutils2: check sense data when status is 'CHECK_CONDITION' Some raid controllers return a 'transport error' when we expected a 'sense error'. it seems the correct way to check the sense data is when either the result category is 'SENSE' or when the status is 'CHECK_CONDITION', so do that. (similar to how 'sg_raw' returns the errors) Signed-off-by: Dominik Csapak Signed-off-by: Dietmar Maurer --- pbs-tape/src/sgutils2.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pbs-tape/src/sgutils2.rs b/pbs-tape/src/sgutils2.rs index 1fc487be..9c0ca723 100644 --- a/pbs-tape/src/sgutils2.rs +++ b/pbs-tape/src/sgutils2.rs @@ -141,6 +141,9 @@ pub const SENSE_KEY_ABORTED_COMMAND: u8 = 0x0b; pub const SENSE_KEY_VOLUME_OVERFLOW: u8 = 0x0d; pub const SENSE_KEY_MISCOMPARE: u8 = 0x0e; +// SAM STAT +const SAM_STAT_CHECK_CONDITION: i32 = 0x02; + /// Sense Key Descriptions pub const SENSE_KEY_DESCRIPTIONS: [&str; 16] = [ "No Sense", @@ -457,11 +460,16 @@ impl<'a, F: AsRawFd> SgRaw<'a, F> { let sense_len = unsafe { get_scsi_pt_sense_len(ptvp.as_ptr()) }; - let res_cat = unsafe { get_scsi_pt_result_category(ptvp.as_ptr()) }; + let mut res_cat = unsafe { get_scsi_pt_result_category(ptvp.as_ptr()) }; + let status = unsafe { get_scsi_pt_status_response(ptvp.as_ptr()) }; + + if res_cat == SCSI_PT_RESULT_TRANSPORT_ERR && status == SAM_STAT_CHECK_CONDITION { + res_cat = SCSI_PT_RESULT_SENSE; + } + match res_cat { SCSI_PT_RESULT_GOOD => Ok(()), SCSI_PT_RESULT_STATUS => { - let status = unsafe { get_scsi_pt_status_response(ptvp.as_ptr()) }; if status != 0 { return Err( format_err!("unknown scsi error - status response {}", status).into(),