sys: FspVolumeTransact(): do not retry IRP completions immediately

This commit is contained in:
Bill Zissimopoulos 2016-01-27 13:59:48 -08:00
parent acf1b453fc
commit f491d6015f

View File

@ -521,6 +521,7 @@ NTSTATUS FspVolumeTransact(
LARGE_INTEGER Timeout; LARGE_INTEGER Timeout;
/* process any user-mode file system responses */ /* process any user-mode file system responses */
RepostedIrp = 0;
Response = SystemBuffer; Response = SystemBuffer;
BufferEnd = (PUINT8)SystemBuffer + InputBufferLength; BufferEnd = (PUINT8)SystemBuffer + InputBufferLength;
for (;;) for (;;)
@ -534,13 +535,21 @@ NTSTATUS FspVolumeTransact(
/* either IRP was canceled or a bogus Hint was provided */ /* either IRP was canceled or a bogus Hint was provided */
continue; continue;
FspIopDispatchComplete(ProcessIrp, Response); Result = FspIopDispatchComplete(ProcessIrp, Response);
if (STATUS_PENDING == Result)
{
/*
* The IRP has been reposted to our Ioq. Remember the first such IRP,
* so that we know to break the loop if we see it again.
*/
if (0 == RepostedIrp)
RepostedIrp = ProcessIrp;
}
Response = NextResponse; Response = NextResponse;
} }
/* process any retried IRP's */ /* process any retried IRP's */
RepostedIrp = 0;
for (;;) for (;;)
{ {
/* get the next retried IRP, but do not go beyond the first reposted IRP! */ /* get the next retried IRP, but do not go beyond the first reposted IRP! */