Sincronizzazione dell'oplock
I filtri e i file system che richiedono blocchi opportunistici esclusivi (oplock) devono sincronizzare le chiamate nel pacchetto oplock fornito dal sistema. In particolare, le chiamate alle routine OPlock FSCTRL (per stabilire gli oplock), devono essere sincronizzate con le chiamate alle routine di check-break di oplock. Un elenco di entrambi i set di routine include:
Routine OPlock FSCTRL:
- Minifilters: FltOplockFsctrl, FltOplockFsctrlEx
- Filtri legacy e file system: FsRtlOplockFsctrl,FsRtlOplockFsctrlEx, FsRtlUpperOplockFsctrl
Routine di check-break di oplock:
- Minifilters: FltCheckOplock, FltCheckOplockEx
- Filtri legacy e file system: FsRtlCheckOplock, FsRtlCheckOplockEx, FsRtlCheckOplockEx2, FsRtlOplockBreakH
Quando si elabora una richiesta di oplock, i filtri e i file system devono garantire quanto segue:
- I/O che potrebbe interrompere un oplock non può verificarsi in parallelo con l'elaborazione della richiesta.
- Le richieste di oplock non possono verificarsi simultaneamente con i riconoscimenti di interruzione di oplock.
Le chiamate IRP che richiedono la creazione di oplock esclusivi per lo stesso blocco di controllo file (FCB) sono:
- IRP_MJ_CREATE con il bit FILE_OPEN_REQUIRING_OPLOCK impostato in Create.Options
- IRP_MJ_FILE_SYSTEM_CONTROL con controlli oplock
Di seguito sono riportati alcuni esempi di sincronizzazione di oplock:
Quando si elabora una richiesta di oplock, un file system acquisisce una risorsa esclusivamente, chiama FsRtlOplockFsctrlEx e rilascia la risorsa.
Quando si elabora un riconoscimento di interruzione oplock, il file system acquisisce la stessa risorsa condivisa, chiama FsRtlOplockFsctrlEx e rilascia la risorsa.
Quando si esegue L/O, il file system acquisisce la stessa risorsa condivisa, chiama FsRtlCheckOplockEx2, esegui l'I/O e rilascia la risorsa.
I file system superiori devono assicurarsi che si sincronizzano tra le chiamate di FsRtlCheckUpperOplock e FsRtlUpperOplockFsctrl in modo analogo.