Routine RetryRequest del driver della classe di archiviazione

Il driver della porta di archiviazione sottostante è responsabile della ripetizione delle richieste se si verificano errori del dispositivo che comportano la trasmissione di dati sul bus, inclusi errori di parità del bus, timeout di selezione e errori di destinazione/controller occupato. Se i tentativi di ripetizione hanno esito negativo, il driver della porta di archiviazione completa la richiesta con un errore appropriato e registra anche l'errore di I/O.

Un driver della classe di archiviazione non deve mai tentare di ripetere una richiesta che il driver della porta non è già riuscito a causa di uno degli errori precedenti.

Un driver di classe di archiviazione è responsabile della ripetizione di richieste che hanno esito negativo a causa di errori specifici del dispositivo, errori di destinazione/controller diversi da target/controller-busy, reimpostazioni del bus o timeout delle richieste. In generale, una routine RetryRequest può inviare nuovamente tale IRP al driver inferiore successivo e indirizzare l'SRB all'inizio della coda specifica del driver di porta.

In particolare, una routine RetryRequest deve eseguire le operazioni seguenti:

  1. Assicurarsi che una richiesta di trasferimento parziale abbia i valori corretti impostati per l'indirizzo iniziale e la lunghezza.

  2. Azzerare i membri SrbStatus e ScsiStatus dello SRB.

  3. Configurare il membro SrbFlags, se necessario per il dispositivo.

  4. Configurare la posizione dello stack di I/O per il driver della porta nell'IRP, come già descritto in Routine di invio del driver di classe di archiviazione tramite la routine SplitTransferRequest del driver di classe di archiviazione.

  5. Chiamare IoSetCompletionRoutine per l'IRP, perché la routine IoCompletion del driver deve liberare il SRB prima che l'IRP venga restituito. La routine IoCompletion potrebbe anche dover ripetere la richiesta più volte oppure chiamare la routine InterpretRequestSense o ReleaseQueue del driver.

  6. Passare la richiesta al driver di livello inferiore con IoCallDriver.