[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 14/14] IoCsqInsertIrpEx already calls IoMarkIrpPending
From: Owen Smith <owen.smith@xxxxxxxxxx> Also, if an IRP is marked pending, its dispatch call MUST return STATUS_PENDING, even if it completes the IRP Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xencons/console.c | 3 ++- src/xencons/fdo.c | 4 +--- src/xencons/pdo.c | 4 +--- src/xencons/ring.c | 14 ++++++++++++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/xencons/console.c b/src/xencons/console.c index e26e1db..4615ebe 100755 --- a/src/xencons/console.c +++ b/src/xencons/console.c @@ -221,11 +221,12 @@ ConsoleDispatchReadWrite( if (Handle == NULL) goto fail1; + // If StreamPutQueue succeeds, the IRP is queued and marked pending status = StreamPutQueue(Handle->Stream, Irp); if (!NT_SUCCESS(status)) goto fail2; - return STATUS_SUCCESS; + return STATUS_PENDING; fail2: Error("fail2\n"); diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c index 6aad6e2..04dceb5 100644 --- a/src/xencons/fdo.c +++ b/src/xencons/fdo.c @@ -2871,11 +2871,9 @@ FdoDispatchReadWrite( { NTSTATUS status; - IoMarkIrpPending(Irp); - status = ConsoleDispatchReadWrite(Fdo->Console, Irp); - if (!NT_SUCCESS(status)) + if (status != STATUS_PENDING) goto fail1; return STATUS_PENDING; diff --git a/src/xencons/pdo.c b/src/xencons/pdo.c index 877b21a..ccd9714 100755 --- a/src/xencons/pdo.c +++ b/src/xencons/pdo.c @@ -1673,10 +1673,8 @@ PdoDispatchReadWrite( { NTSTATUS status; - IoMarkIrpPending(Irp); - status = RingDispatchReadWrite(FrontendGetRing(Pdo->Frontend), Irp); - if (!NT_SUCCESS(status)) + if (status != STATUS_PENDING) goto fail1; return STATUS_PENDING; diff --git a/src/xencons/ring.c b/src/xencons/ring.c index 83e1761..497aa66 100755 --- a/src/xencons/ring.c +++ b/src/xencons/ring.c @@ -560,6 +560,7 @@ RingDispatchReadWrite( if (StackLocation->Parameters.Read.Length == 0) break; status = IoCsqInsertIrpEx(&Ring->Read.Csq, Irp, NULL, (PVOID)FALSE); + ASSERT(NT_SUCCESS(status)); break; case IRP_MJ_WRITE: @@ -567,14 +568,23 @@ RingDispatchReadWrite( if (StackLocation->Parameters.Write.Length == 0) break; status = IoCsqInsertIrpEx(&Ring->Write.Csq, Irp, NULL, (PVOID)FALSE); + ASSERT(NT_SUCCESS(status)); break; default: status = STATUS_NOT_SUPPORTED; break; } - if (NT_SUCCESS(status)) - KeInsertQueueDpc(&Ring->Dpc, NULL, NULL); + if (!NT_SUCCESS(status)) + goto fail1; + + KeInsertQueueDpc(&Ring->Dpc, NULL, NULL); + + // IoCsqInsertIrpEx has marked the IRP pending, must return STATUS_PENDING + return STATUS_PENDING; + +fail1: + Error("fail1 (%08x)\n", status); return status; } -- 2.8.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |