了解 SCSI 异步事件处理

SCSI 设备驱动程序可以通过对 SCSI-adapter 设备驱动程序调用 SCIOEVENT ioctl 操作来注册特定设备实例以接收异步事件状态。 当 SCSI 适配器设备驱动程序检测到 SCIOEVENT ioctl 操作所覆盖的事件时,它会构建 sc_event_info 结构,并将指针传递到该结构以及先前注册的异步事件处理程序例程入口点。

注: 并非所有 SCSI I/O 控制器都支持此操作。

结构中的字段由 SCSI 适配器设备驱动程序填充,如下所示:

描述
标识 对于发起方方式,此值设置为连接的 SCSI 目标设备的 SCSI 标识。 对于目标方式,这将设置为连接的 SCSI 发起方设备的 SCSI 标识。
lun 对于启动器方式,此参数设置为连接的 SCSI 目标设备的 SCSI LUN。 对于目标方式,此 0 设置为 0)。
方式 标识发起方或目标方式设备是否正在报告。 可能的值如下所示:
SC_IM_MODE
正在报告发起程序方式设备。
SC_TM_MODE
正在报告一个目标方式设备。
事件 此字段设置为指示正在报告的一个或多个事件。 可以使用 /usr/include/sys/scsi.h 文件中定义的以下值:
SC_FATAL_HDW_ERR
发生致命适配器硬件错误。
SC_ADAP_CMD_FAILED
发生不可恢复的适配器命令故障。
SC_SCSI_RESET_EVENT
检测到 SCSI 总线复位。
SC_BUFS_EXHAUSTED
在目标方式下,发生了最大缓冲区使用情况事件。
适配器设备 此字段设置为指示设备所在的适配器的设备主号码和次号码。
async_correlator 此字段设置为在 sc_event_struct 结构中传递给 SCSI 适配器设备驱动程序的值。 SCSI 设备驱动程序可以选择使用此字段来提供将事件状态与它所使用的设备实例相关联的有效方法。 或者, SCSI 设备驱动程序使用以下项的组合:id,lun,modeadap_devno字段来标识设备实例。
注: 由 SCSI 适配器设备驱动程序将保留字段设置为 0。

所报告的信息sc_event_info.events字段不会排队到 SCSI 设备驱动程序,而是在出现一个或多个标志时报告为这些标志。 由于数据不排队,因此 SCSI 适配器设备驱动程序写程序可以使用单个 sc_event_info 结构,并通过指针将其一次一个传递到相应设备实例的每个异步事件处理程序例程。 在确定要报告哪些设备的事件之后, SCSI 设备驱动程序必须复制sc_event_info.events字段进入本地空间,并且不得修改 sc_event_info 结构的其余部分的内容。

因为事件状态是可选的,所以 SCSI 设备驱动程序写程序确定在接收事件状态时需要执行的操作。 写程序可能决定保存该状态并将其报告给调用应用程序,或者 SCSI 设备驱动程序或应用程序级别程序可以执行错误恢复操作。