存储类驱动程序的 RetryRequest 例程

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

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

存储类驱动程序负责重试因设备特定错误、除目标/控制器忙以外的目标/控制器错误、总线重置或请求超时而导致失败的请求。 通常, RetryRequest 例程可以将此类 IRP 重新提交到下一个较低的驱动程序,并指示 SRB 放置在端口驱动程序的 LU 特定队列的头。

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

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

  2. 清零 SRBSrbStatusScsiStatus 成员。

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

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

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

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