Compartir a través de


Rutina retryRequest del controlador de clase de almacenamiento

El controlador de puerto de almacenamiento subyacente es responsable de reintentar solicitudes si se producen errores de dispositivo que implican la transmisión de datos en el bus, incluidos los errores de paridad de bus, los tiempos de espera de selección y los errores de destino o de disponibilidad del controlador. Si se produce un error en los reintentos, el controlador de puerto de almacenamiento completa la solicitud con un error adecuado y registra también el error de E/S.

Un controlador de clase de almacenamiento nunca debe intentar reintentar una solicitud que el controlador de puerto ya ha producido un error debido a alguno de los errores anteriores.

Un controlador de clase de almacenamiento es responsable de reintentar las solicitudes que producen un error debido a errores específicos del dispositivo, errores de destino o controlador que no sean target/controller-busy, restablecimientos de bus o tiempos de espera de solicitud. En general, una rutina RetryRequest puede volver a enviar un IRP al controlador inferior siguiente y dirigir que el SRB se coloque en la cabeza de la cola específica de LU del controlador de puerto.

En concreto, una rutina RetryRequest debe hacer lo siguiente:

  1. Asegúrese de que una solicitud de transferencia parcial tiene los valores correctos establecidos para la dirección inicial y la longitud.

  2. Cero los miembros SrbStatus y ScsiStatus del SRB.

  3. Configure el miembro SrbFlags , según sea necesario para el dispositivo.

  4. Configure la ubicación de la pila de E/S para el controlador de puerto en el IRP como ya se describe en Rutinas de envío del controlador de clase de almacenamiento a través de la rutina SplitTransferRequest del controlador de clase de almacenamiento.

  5. Llame a IoSetCompletionRoutine para irP, ya que la rutina ioCompletion del controlador debe liberar el SRB antes de que el IRP vuelva. Es posible que la rutina IoCompletion también necesite reintentar la solicitud más de una vez o llamar a la rutina InterpretRequestSense o ReleaseQueue del controlador.

  6. Pase la solicitud al controlador siguiente inferior con IoCallDriver.