How to acknowledge Win7 oplocks and get NewOplockLevel pended?

Hi there!

When you have a legacy Level 1 oplock broken with FILE_OPLOCK_BROKEN_TO_LEVEL_2, you get the FSCTL_OPLOCK_BREAK_ACKNOWLEDGE IRP pended, so that you can be notified whenever the Level 2 oplock breaks. That means you can acknowledge the first oplock break and wait for the new oplock level to be broken using only one IRP.

As far as I could understand, this is not possible when using Win7 oplocks. When you have an RW oplock broken to R (from REQUEST_OPLOCK_OUTPUT_BUFFER.NewOplockLevel), you must first acknowledge the oplock break, and this IRP will always complete, then you must request a new R oplock that will be pended until the oplock breaks to none.

Is that true?
Am I missing anything?

TIA

That sounds right to me.

1 Like

We have a layered file system which is managing its cache based on the oplock state we get from the underlying file system. Initially we request an RW oplock to build a cache for read and write requests we receive.

Now, besides flushing the cache when I see the oplock break from RW to R, this Win7 behavior is forcing me to purge all cache data. This is because there is a time window between acknowledging the RW oplock break and requesting a new R oplock on the same file stream. There is no way of knowing whether the file has been changed since the acknowledge was received.

Does anyone know a better way of dealing with this and prevent the cache from being purged? I mean, just like we used to do on legacy oplock by having FSCTL_OPLOCK_BREAK_ACKNOWLEDGE IRP pended until the Level 2 oplock breaks to None.

Thanks in advance,