Поделиться через


Подпрограмма RetryRequest драйвера класса хранилища

Базовый драйвер порта хранилища отвечает за повторные запросы при возникновении ошибок устройства, связанных с передачей данных в шине, включая ошибки четности шины, время ожидания выбора и ошибки занятости целевого объекта или контроллера. Если повторные попытки завершаются сбоем, драйвер порта хранилища завершает запрос с соответствующей ошибкой и регистрирует ошибку ввода-вывода.

Драйвер класса хранения никогда не должен пытаться повторить запрос, который уже завершился сбоем драйвера порта из-за любой из предыдущих ошибок.

Драйвер класса хранения отвечает за повторные попытки запросов, которые завершаются сбоем из-за ошибок конкретного устройства, ошибок целевого объекта или контроллера, отличных от сведений о доступности целевого объекта или контроллера, сброса шины или времени ожидания запроса. Как правило, подпрограмма RetryRequest может повторно отправить такой IRP драйверу следующего ниже и направить SRB в голову очереди LU драйвера порта.

В частности, подпрограмма RetryRequest должна выполнять следующие действия.

  1. Убедитесь, что в запросе на частичную передачу заданы правильные значения для начального адреса и длины.

  2. Ноль элементов SrbStatus и ScsiStatus SRB.

  3. При необходимости настройте элемент SrbFlags для устройства.

  4. Настройте расположение стека ввода-вывода для драйвера порта в IRP, как уже описано в разделе Подпрограммы диспетчеризации драйвера класса хранилища с помощью подпрограммы SplitTransferRequest драйвера класса хранилища.

  5. Вызовите IoSetCompletionRoutine для IRP, так как подпрограмма IoCompletion драйвера должна освободить SRB перед возвратом IRP. Подпрограмме IoCompletion также может потребоваться повторить запрос несколько раз или вызвать подпрограмму InterpretRequestSense или ReleaseQueue драйвера.

  6. Передайте запрос следующему ниже драйверу с помощью IoCallDriver.