逻辑上:masked_status == ((status & 0x3e) >> 1) 。因此,'masked_status' 会从 'status' 中剥离厂商信息位,然后将其右移一位。 这样就可以更轻松地执行诸如 "if (CHECK_CONDITION == masked_status) ..." 之类的操作,并使用 <scsi/scsi.h> 中的定义。 此文件中定义的值为
GOOD [0x00](良好)
CHECK_CONDITION [0x01](检查状态)
CONDITION_GOOD [0x02](状态良好)
BUSY 0x04(忙)
INTERMEDIATE_GOOD 0x08(中间良好)
INTERMEDIATE_C_GOOD 0x0a(中间 C 良好)
RESERVATION_CONFLICT 0x0c(保留冲突)
COMMAND_TERMINATED 0x11(命令终止)
QUEUE_FULL 0x14(队列已满)
请注意,SCSI 3 定义了一些其他的状态代码。[1] masked_status 的类型为 unsigned char 。
一些较低级别的驱动程序(例如,ide-scsi)即使在发生 CHECK_CONDITION 或 COMMAND_TERMINATED 状态时也会清除此 masked_status 字段。 但是,它们确实在 driver_status 字段中设置了 DRIVER_SENSE。 另外,(sb_len_wr > 0) 表示存在 sense 缓冲区。