在SCSI接口(interface)中,错误可通过3个数字的串联来识别:SenseKey + ASC + ASCQ。 asc/ascq pair description根据asc/ascq值描述所有错误的含义。但是,并非所有的asc/ascq对都具有所有感应键的含义。我如何知道每对asc/ascq对将返回哪个检测键?

最佳答案

ASC/ASCQ未绑定(bind)到感应键。

感应键是您的主要错误代码。 ASC和ASCQ是附加感知代码和限定符。这是提示您回答I_T_L_Q关系中存在问题的小技巧。

因此,要回答您的问题-无法知道一般中每个ASC/ASCQ对将返回哪个检测键。

但是,由于大多数操作系统仅对一小部分错误实现错误处理,因此存在一些众所周知的“感知键” + ASC + ASCQ组合。不幸的是,您只能通过检查源代码才能找到该子集。

例如,在Mac OS X Darwin内核中,您可以在IOSCSIArchitectureModelFamily中查找ADDITIONAL_SENSE_CODE。这是 IOSCSIBlockCommands/IOSCSIBlockCommandsDevicePM.cpp 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 Sense键一起使用,并且采取的 Action 是由ASC/ASCQ对决定的,因此,如何在Sense键之间分配ASC/ASCQ对并不重要。

    关于error-handling - ASC/ASCQ编号的感应键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22297233/

    10-09 03:02