Sincronização do Oplock
Filtros e sistemas de arquivos que solicitam bloqueios oportunistas exclusivos (oplocks) devem sincronizar chamadas no pacote oplock fornecido pelo sistema. Em particular, as chamadas para rotinas FSCTRL oplock (para estabelecer oplocks) devem ser sincronizadas com chamadas para rotinas de quebra de marcar oplock. Uma lista dos dois conjuntos de rotinas inclui:
Rotinas de FSCTRL do Oplock:
- Minifilters: FltOplockFsctrl, FltOplockFsctrlEx
- Filtros herdados e sistemas de arquivos: FsRtlOplockFsctrl, FsRtlOplockFsctrlEx, FsRtlUpperOplockFsctrl
Rotinas de quebra de marcar oplock:
- Minifilters: FltCheckOplock, FltCheckOplockEx
- Filtros herdados e sistemas de arquivos: FsRtlCheckOplock, FsRtlCheckOplockEx, FsRtlCheckOplockEx2, FsRtlOplockBreakH
Ao processar uma solicitação oplock, os filtros e os sistemas de arquivos devem garantir o seguinte:
- A E/S que pode interromper um oplock não pode ocorrer em paralelo com o processamento da solicitação.
- As solicitações oplock não podem ocorrer simultaneamente com confirmações de interrupção do oplock.
As chamadas IRP que solicitam a criação de oplocks exclusivos para o mesmo fcb (bloco de controle de arquivo) são:
- IRP_MJ_CREATE com o bit FILE_OPEN_REQUIRING_OPLOCK definido em Create.Options
- IRP_MJ_FILE_SYSTEM_CONTROL com controles oplock
Veja a seguir alguns exemplos de sincronização de oplock:
Ao processar uma solicitação oplock, um sistema de arquivos adquiriria um recurso exclusivamente, chamaria FsRtlOplockFsctrlEx e liberaria o recurso.
Ao processar uma confirmação de interrupção de oplock, o sistema de arquivos adquiriria esse mesmo recurso compartilhado, chamaria FsRtlOplockFsctrlEx e liberaria o recurso.
Ao executar E/S, o sistema de arquivos adquiriria esse mesmo recurso compartilhado, chamaria FsRtlCheckOplockEx2, executaria a E/S e liberaria o recurso.
Os sistemas de arquivos superiores devem garantir que eles sincronizem entre chamadas de FsRtlCheckUpperOplock e FsRtlUpperOplockFsctrl de maneira semelhante.