Partager via


Routine RetryRequest du pilote de classe de stockage

Le pilote de port de stockage sous-jacent est chargé de réessayer les demandes si des erreurs d’appareil impliquent la transmission de données sur le bus, notamment les erreurs de parité de bus, les délais de sélection et les erreurs de disponibilité cible/contrôleur. Si les tentatives de nouvelle tentative é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 requête 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 chargé de réessayer les demandes qui échouent en raison d’erreurs spécifiques à l’appareil, d’erreurs de cible/contrôleur autres que celles dues à une cible/un contrôleur occupé, de réinitialisations de bus ou de délais d’expiration de requête. En règle générale, une routine RetryRequest peut renvoyer un tel IRP au pilote de niveau inférieur suivant et diriger le SRB à la tête de la file d'attente spécifique à l'unité logique (LU) du pilote de port.

En particulier, une routine RetryRequest doit effectuer les opérations suivantes :

  1. Vérifiez qu’une demande de transfert partielle a les valeurs correctes définies pour l’adresse de départ et la longueur.

  2. Mettez à zéro les membres SrbStatus et ScsiStatus du SRB.

  3. Configurez le membre SrbFlags , si nécessaire pour l’appareil.

  4. Configurez l'emplacement de la pile d'E/S pour le pilote de port dans l'IRP, comme déjà décrit dans les routines de répartition du pilote de classe de stockage à travers la routine SplitTransferRequest du pilote de classe de stockage.

  5. Appelez IoSetCompletionRoutine pour l’IRP, car la routine IoCompletion du pilote doit libérer la SRB avant que l’IRP ne retourne. 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.

  6. Transmettez la requête au pilote inférieur suivant avec IoCallDriver.