Condividi tramite


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 ed errori di disponibilità di destinazione/controller. 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 della 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 di nuovo 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 per una richiesta di trasferimento parziale siano impostati i valori corretti per l'indirizzo iniziale e la lunghezza.

  2. Zero i membri SrbStatus e ScsiStatus di SRB.

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

  4. Configurare la posizione dello stack di I/O per il driver di porta in IRP come descritto in Routine dispatch del driver della classe di archiviazione tramite la routine SplitTransferRequest del driver della classe di archiviazione.

  5. Chiamare IoSetCompletionRoutine per L'IRP, perché la routine IoCompletion del driver deve liberare il valore SRB prima che venga restituito il valore di IRP. 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 inferiore successivo con IoCallDriver.