Feature #11015

Updated by Gordon Ross about 1 year ago

SMB2 leasing requires a more capable implementation of the logic
used to change an SMB2/3 request to run asynchronously.

The old implementation used a simple but limited design where the
dispatch loop allows one request in a sequence to set a "call back"
function used for "async" processing, which the dispatcher would
call after the request sequence is complete.

The new implementation instead essentially "re-enters" the SMB command
dispatch loop (actually a special variant of that loop called "go async") loop) and then:

if we've not already "gone async" the "go async" funciton:
* saves our position (etc.) in the SMB command sequence (and related)
* constructs the required "interim responses" (with STATUS_PENDING) for the current and all remaining commands in the sequence
* sends a compound response containing those interim responses
* restores our position to where it was in step 1
* marks the request state as "async".
After the request has "gone async", any request processing that needs to
block for longer than a few milliseconds may do so without causing problems.

The SMB leasing support introduces some new cases where the SMB2 code
needs to block where the old async design would be inadequate.


This commit does not have its own functional verification test,
but regression tests should pass. We can consider this verified if the
oplock work in #11016 passes its tests.