記憶域クラス ドライバーの RetryRequest ルーチン
基になるストレージ ポート ドライバーは、バスパリティ エラー、選択タイムアウト、ターゲット/コントローラー ビジー エラーなど、バス上のデータの転送を伴うデバイス エラーが発生した場合に要求を再試行する役割を担います。 再試行が失敗した場合、ストレージ ポート ドライバーは適切なエラーで要求を完了し、I/O エラーもログに記録します。
記憶域クラス ドライバーは、上記のエラーのいずれかが原因でポート ドライバーが既に失敗した要求を再試行できません。
記憶域クラス ドライバーは、デバイス固有のエラー、ターゲット/コントローラー ビジー以外のターゲット/コントローラー エラー、バスのリセット、または要求タイムアウトのために失敗した要求を再試行する役割を担います。 一般に、RetryRequest ルーチンは、このような IRP を次の下位ドライバーに再送信し、ポート ドライバーの LU 固有キューの先頭に SRB を配置するように指示できます。
特に、RetryRequest ルーチンは次のことを行う必要があります。
部分転送要求に、開始アドレスと長さに正しい値が設定されていることを確認します。
SRB の SrbStatus メンバーと ScsiStatus メンバーを 0 にします。
デバイスに必要に 応じて、SrbFlags メンバーを設定します。
記憶域クラス ドライバーの SplitTransferRequest ルーチンを使用して、記憶域クラス ドライバーのディスパッチ ルーチンで既に説明されているように IRP のポート ドライバーの I/O スタックの場所を設定します。
ドライバーの IoCompletion ルーチンは、IRP が戻る前に SRB を解放する必要があるため、IRP の IoSetCompletionRoutine を呼び出します。 IoCompletion ルーチンでは、要求を複数回再試行するか、ドライバーの InterpretRequestSense または ReleaseQueue ルーチンも呼び出す必要がある場合があります。
IoCallDriver を使用して、次の下位ドライバーに要求を渡します。