Routine retryRequest du pilote de classe de stockage
Le pilote de port de stockage sous-jacent est responsable de la nouvelle tentative des demandes si des erreurs d’appareil se produisent qui impliquent la transmission de données sur le bus, y compris les erreurs de parité du bus, les délais de sélection et les erreurs de cible/de disponibilité du contrôleur. Si les tentatives échouent, le pilote de port de stockage termine la demande avec une erreur appropriée et enregistre également l’erreur d’E/S.
Un pilote de classe de stockage ne doit jamais tenter de réessayer une demande indiquant que le pilote de port a déjà échoué en raison de l’une des erreurs précédentes.
Un pilote de classe de stockage est responsable des nouvelles tentatives de demandes qui échouent en raison d’erreurs spécifiques à l’appareil, d’erreurs de cible/de contrôleur autres que la cible/l’occupation du contrôleur, les réinitialisations de bus ou les délais d’expiration des demandes. En général, une routine RetryRequest peut renvoyer un tel IRP au pilote inférieur suivant et indiquer que le SRB soit placé en tête de la file d’attente spécifique à l’unité logique du pilote de port.
En particulier, une routine RetryRequest doit effectuer les opérations suivantes :
Vérifiez qu’une demande de transfert partiel a les valeurs correctes définies pour l’adresse et la longueur de départ.
Zéro les membres SrbStatus et ScsiStatus du SRB.
Configurez le membre SrbFlags , si nécessaire pour l’appareil.
Configurez l’emplacement de la pile d’E/S pour le pilote de port dans l’IRP, comme décrit dans Routines de répartition du pilote de classe de stockage via la routine SplitTransferRequest du pilote de classe de stockage.
Appelez IoSetCompletionRoutine pour l’IRP, car la routine IoCompletion du pilote doit libérer le SRB avant le retour de l’IRP. La routine IoCompletion peut également avoir besoin de réessayer la requête plusieurs fois, ou d’appeler la routine InterpretRequestSense ou ReleaseQueue du pilote.
Transmettez la demande au pilote inférieur suivant avec IoCallDriver.