存储类驱动程序的 RetryRequest 例程

如果发生涉及总线上数据传输的设备错误(包括总线奇偶校验错误、选择时数和目标/控制器忙错误)时,基础存储端口驱动程序负责重试请求。 如果重试尝试失败,存储端口驱动程序会使用相应的错误完成请求并记录 I/O 错误。

存储类驱动程序不应尝试重试端口驱动程序由于上述任何错误而失败的请求。

存储类驱动程序负责重试因设备特定错误、目标/控制器错误(目标/控制器忙、总线重置或请求出现时间过长)而失败的请求。 通常, RetryRequest 例程可以将此类 IRP 重新提交到下一个较低级别驱动程序,并指示将 SRB 置于端口驱动程序特定于 LU 的队列的前面。

具体而言, RetryRequest 例程应执行以下操作:

  1. 确保部分传输请求为起始地址和长度设置了正确的值。

  2. SRB 的 SrbStatusScsiStatus 成员。

  3. 根据设备 需要设置 SrbFlags 成员。

  4. 根据 存储 类驱动程序的 Dispatch 例程通过 存储 类驱动程序的 SplitTransferRequest 例程中所述,在 IRP 中设置端口驱动程序的 I/O 堆栈位置。

  5. IRP 调用 IoSetCompletionRoutine ,因为驱动程序的 IoCompletion 例程必须在 IRP 返回之前释放 SRB。 IoCompletion 例程可能还需要多次重试请求,或者调用驱动程序的 InterpretRequestSenseReleaseQueue 例程。

  6. 使用 IoCallDriver 将请求传递到下一个较低级别驱动程序。