Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Unless a storage class driver ORs the SrbFlags for a given request with SRB_FLAGS_NO_QUEUE_FREEZE, the system port driver freezes a queue for a given logical unit after any of the following:
Ocorreu uma redefinição de barramento enquanto a unidade lógica estava executando uma solicitação.
The logical unit returned SCSISTAT_CHECK_CONDITION or SCSISTAT_COMMAND_TERMINATED, which the class driver can find in the SRB's ScsiStatus member.
Um pedido foi expirado.
Uma solicitação foi encerrada por um comando de mensagem de barramento, como SCSIMESS_ABORT.
The port driver indicates that an LU-specific queue has been frozen by returning a request with SRB_STATUS_QUEUE_FROZEN in the SrbStatus member. Novas solicitações do driver de classe podem ser inseridas na fila, mas somente solicitações de deteção automática são enviadas para a unidade lógica, desde que sua fila esteja congelada.
Congelar a fila nessas condições dá a cada driver de classe de armazenamento a oportunidade de analisar um erro antes que outros trabalhos enfileirados sejam executados. Por exemplo, trabalhos em fila podem precisar ser cancelados se a mídia tiver sido alterada. To flush the queue, the driver can send a request with the SrbFlags ORed with SRB_FLAGS_BYPASS_FROZEN_QUEUE.
A ReleaseQueue routine allocates and sets up an IRP and an SRB to either release or flush a frozen queue. The Function member of the SRB must be set to SRB_FUNCTION_RELEASE_QUEUE or SRB_FUNCTION_FLUSH_QUEUE, which both releases a frozen queue and cancels all currently queued requests for the target logical unit. The port driver completes all requests in a flushed queue with their SrbStatus members set to SRB_STATUS_REQUEST_FLUSHED.
Failing to release a frozen queue makes the device inaccessible, so a driver's ReleaseQueue routine should be designed to succeed even in low memory conditions. A ReleaseQueue routine should first attempt to allocate memory for an SRB by calling ExAllocatePool with the NonPagedPool memory type and, if that allocation fails, use an SRB that was preallocated during driver initialization. Se o driver aloca um SRB para manter na reserva quando inicializa sua extensão de dispositivo, conforme descrito em Configurando uma extensão de dispositivo do driver de classe de armazenamento, sua ReleaseQueue pode usar esse SRB se o pool de memória estiver baixo, com um mecanismo de sincronização apropriado no caso de várias operações de liberação simultâneas serem necessárias.
Note that a class driver's ReleaseQueue routine is called asynchronously, generally from its IoCompletion routine. A class driver's IoCompletion routine cannot call ReleaseQueue to flush a queue that is not frozen. However, it can call ReleaseQueue to release an unfrozen queue, and the port driver simply ignores such a request.