儲存體類別驅動程式的 RetryRequest 常式
基礎儲存體埠驅動程式負責重試要求,如果發生牽涉到在匯流排上傳輸資料的裝置錯誤,包括匯流排同位錯誤、選取逾時,以及目標/控制器忙碌錯誤。 如果重試嘗試失敗,儲存體埠驅動程式就會完成要求並出現適當的錯誤,並記錄 I/O 錯誤。
儲存體類別驅動程式不應該嘗試重試埠驅動程式因上述任何錯誤而失敗的要求。
儲存體類別驅動程式負責重試因裝置特定錯誤、目標/控制器錯誤以外的目標/控制器錯誤、匯流排重設或要求逾時而失敗的要求。 一般而言, RetryRequest 常式可以將這類 IRP 重新提交至下一個較低的驅動程式,並指示 SRB 放置在埠驅動程式 LU 特定佇列的前端。
特別是 ,RetryRequest 常式應該執行下列動作:
確定部分傳輸要求已針對起始位址和長度設定正確的值。
零 SRB 的 SrbStatus 和 ScsiStatus 成員。
視裝置需要設定 SrbFlags 成員。
依照儲存體類別驅動程式的SplitTransferRequest 例程,設定 IRP 中埠驅動程式的 I/O 堆疊位置,如儲存體類別驅動程式的分派常式中所述。
呼叫 IRP 的 IoSetCompletionRoutine ,因為驅動程式的 IoCompletion 常式必須在 IRP 傳回之前釋放 SRB。 IoCompletion常式可能也需要多次重試要求,或呼叫驅動程式的InterpretRequestSense或ReleaseQueue常式。
使用 IoCallDriver將要求傳遞至下一個較低的驅動程式。