Error handling ASC/ASCQ编号的检测键

Error handling ASC/ASCQ编号的检测键,error-handling,disk,error-code,scsi,Error Handling,Disk,Error Code,Scsi,在SCSI中,通过3个数字的串联识别接口错误:SenseKey+ASC+ASCQ。描述基于asc/ascq值的所有错误的含义。但并非所有的asc/ascq对都有意义。如何知道每个asc/ascq对将返回哪个检测密钥?asc/ascq与检测密钥无关 感知键是您的主要错误代码。ASC和ASCQ是附加的检测代码和限定符。这是一个小提示,让您回答I___L_Q关系中的错误 因此,为了回答您的问题,通常无法知道每个ASC/ASCQ对将返回哪个检测密钥 但是有一些众所周知的“Sense key”+ASC+A

在SCSI中,通过3个数字的串联识别接口错误:SenseKey+ASC+ASCQ。描述基于asc/ascq值的所有错误的含义。但并非所有的asc/ascq对都有意义。如何知道每个asc/ascq对将返回哪个检测密钥?

asc/ascq与检测密钥无关

感知键是您的主要错误代码。ASC和ASCQ是附加的检测代码和限定符。这是一个小提示,让您回答I___L_Q关系中的错误

因此,为了回答您的问题,通常无法知道每个ASC/ASCQ对将返回哪个检测密钥

但是有一些众所周知的“Sense key”+ASC+ASCQ组合,因为大多数操作系统只对一小部分错误执行错误处理。不幸的是,您只能通过检查源代码才能找到该子集

例如,在Mac OS X Darwin内核中,您可以在。以下是第659行的示例:

// Check the sense key to see if it is an error group we know how to handle
if  ( ( ( senseBuffer.SENSE_KEY & kSENSE_KEY_Mask ) == kSENSE_KEY_NOT_READY ) || 
      ( ( senseBuffer.SENSE_KEY & kSENSE_KEY_Mask ) == kSENSE_KEY_MEDIUM_ERROR ) )
{

    // The SenseKey is an 02 ( Not Ready ) or 03 ( Medium Error ). Check to see
    // if we can do something about this

    if ( ( senseBuffer.ADDITIONAL_SENSE_CODE == 0x04 ) && 
         ( senseBuffer.ADDITIONAL_SENSE_CODE_QUALIFIER == 0x02 ) )
    {

        // Device requires a start command before we can tell if media is there
        if ( START_STOP_UNIT ( request, 0x00, 0x00, 0x00, 0x01, 0x00 ) == true )
        {

            STATUS_LOG ( ( "Sending START_STOP_UNIT.\n" ) );
            serviceResponse = SendCommand ( request, 0 );

        }

        STATUS_LOG ( ( "%s::drive NOT READY\n", getName ( ) ) );

        IOSleep ( 200 );
        continue;

    }

    else if ( ( senseBuffer.ADDITIONAL_SENSE_CODE == 0x3A ) && 
              ( senseBuffer.ADDITIONAL_SENSE_CODE_QUALIFIER == 0x00 ) )
    {

        STATUS_LOG ( ( "No Media.\n" ) );
        // No media is present, return false
        driveReady = true;
        mediaPresent = false;

    }

    else
    {

        STATUS_LOG ( ( "%s::drive NOT READY\n", getName ( ) ) );
        IOSleep ( 200 );
        continue;

    }

}
使用的SK+ASC+ASCQ元组:

  • 0x02/0x03、0x04、0x02
    -未就绪/介质错误,逻辑单元未就绪,需要初始化命令
  • 0x02/0x03、0x3A、0x00
    -未就绪/介质错误,介质不存在
正如您在这里看到的,ASC/ASCQ对与0x02或0x03感测键一起使用,要采取的操作取决于ASC/ASCQ对,因此如何在感测键之间划分ASC/ASCQ对并不重要