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 errores de paridad de bus, tiempos de espera de selección y errores de destino/controlador ocupado. Si se produce un error en los intentos de reintento, 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 cualquiera de los errores anteriores.

Un controlador de clase de almacenamiento es responsable de volver a intentar las solicitudes que producen errores 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 tenga los valores correctos establecidos para la dirección inicial y la longitud.

  2. Establezca a 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 distribución del controlador de clase de almacenamiento a través de la rutina SplitTransferRequest del controlador de clase de almacenamiento.

  5. Llame a IoSetCompletionRoutine para el IRP, ya que la rutina IoCompletion del controlador debe liberar el SRB antes de que el IRP devuelva. Es posible que la rutina ioCompletion también tenga que volver a intentar 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.