Routines IoCompletion du pilote de classe de stockage
Un pilote de classe de stockage doit avoir une ou plusieurs routines IoCompletion , sauf si le pilote attend de façon synchrone l’achèvement de chaque IRP qu’il envoie au pilote de port, réessaye les demandes si nécessaire, puis libère de la mémoire pour les SDR à partir d’une routine de répartition ou BuildRequest . Notez que la gestion synchrone de chaque IRP dégrade les performances du pilote de classe. En outre, les pilotes de classe de stockage pour les appareils qui peuvent contenir le fichier de page système doivent gérer toutes les demandes de transfert de manière asynchrone et doivent donc avoir une routine IoCompletion pour les demandes de lecture/écriture.
Comme décrit dans BuildRequest Routine du pilote de classe de stockage, les pilotes de classe de stockage sont chargés de libérer la mémoire qu’ils allouent pour les SB, qu’ils retournent à une liste de recherche ou à un pool non paginé. Comme tout autre pilote en mode noyau de niveau supérieur, ils sont également chargés de libérer tous les IRP qu’ils allouent, tels qu’un IRP pour fractionner une demande de transfert, comme décrit dans La routine SplitTransferRequest du pilote de classe de stockage.
La routine IoCompletion d’un pilote de classe est en fin de compte chargée de s’assurer que le bloc d’E/S status est défini et de terminer l’IRP d’origine. Notez que l’exécution d’un IRP peut inclure la traduction d’une erreur renvoyée dans le membre ScsiStatus ou le membre SenseInfoBuffer du SRB en une valeur de type NTSTATUS et/ou la journalisation d’une erreur, comme décrit dans Terminer les IRP dans les routines de répartition.
Lorsque certains types d’erreurs se produisent lors du traitement d’une demande, un pilote de port de stockage fige sa file d’attente interne pour l’unité logique cible (LU) et définit SRB_STATUS_QUEUE_FROZEN à la fin de la demande. Par conséquent, les pilotes de classe ont généralement des routines internes pour modifier la status de la file d’attente pour leurs demandes d’E/S d’appareil. Pour plus d’informations, consultez La routine ReleaseQueue du pilote de classe de stockage.
Si la routine BuildRequest du pilote demandait que le pilote de port retourne les informations relatives au sens de la demande pour une demande, sa routine IoCompletion appelle une routine InterpretRequestSense interne ou implémente les mêmes fonctionnalités en ligne. Pour plus d’informations, consultez La routine InterpretRequestSense du pilote de classe de stockage.
Les pilotes de classe de stockage sont responsables des nouvelles tentatives de demandes qui échouent en raison d’erreurs du contrôleur cible, de réinitialisations de bus ou de délais d’expiration des requêtes. Lorsque le pilote de port retourne une requête particulière avec son SrbStatus défini pour indiquer une telle erreur, le pilote de classe peut appeler une routine RetryRequest à partir de sa routine IoCompletion ou, éventuellement, de sa routine InterpretRequestSense . Pour plus d’informations, consultez La routine retryRequest du pilote de classe de stockage.
Pour obtenir des informations générales sur les routines IoCompletion , consultez Terminer les irps.