KeInitializeThreadedDpc(&(*BlkifRing)->Dpc, BlkifRingDpc, *BlkifRing);
- status = BlkifRingCacheCreate(*BlkifRing);
- if (!NT_SUCCESS(status))
- goto fail4;
-
status = ThreadCreate(RingWatchdog,
*BlkifRing,
&(*BlkifRing)->WatchdogThread);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
return STATUS_SUCCESS;
-fail5:
- Error("fail5\n");
-
- BlkifRingCacheDestroy(*BlkifRing);
-
fail4:
Error("fail4\n");
ThreadJoin(BlkifRing->WatchdogThread);
BlkifRing->WatchdogThread = NULL;
- BlkifRingCacheDestroy(BlkifRing);
-
RtlZeroMemory(&BlkifRing->Dpc, sizeof(KDPC));
ASSERT(IsListEmpty(&BlkifRing->PreparedQueue));
}
KeSetImportanceDpc(&BlkifRing->Dpc, MediumHighImportance);
+ status = BlkifRingCacheCreate(BlkifRing);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
BlkifRing->Mdl = __AllocatePages(1 << Ring->Order);
status = STATUS_NO_MEMORY;
if (BlkifRing->Mdl == NULL)
- goto fail1;
+ goto fail2;
BlkifRing->Shared = MmGetSystemAddressForMdlSafe(BlkifRing->Mdl,
NormalPagePriority);
FALSE,
&BlkifRing->Grants[Index]);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail3;
}
BlkifRing->Channel = XENBUS_EVTCHN(Open,
TRUE);
status = STATUS_NO_MEMORY;
if (BlkifRing->Channel == NULL)
- goto fail3;
+ goto fail4;
XENBUS_EVTCHN(Unmask,
&Ring->EvtchnInterface,
__MODULE__"|RING[%u]",
BlkifRing->Index);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail5;
status = XENBUS_DEBUG(Register,
&Ring->DebugInterface,
BlkifRing,
&BlkifRing->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail6;
BlkifRing->Connected = TRUE;
Trace("<==== %u\n", BlkifRing->Index);
return STATUS_SUCCESS;
+fail6:
+ Error("fail6\n");
fail5:
Error("fail5\n");
-fail4:
- Error("fail4\n");
XENBUS_EVTCHN(Close,
&Ring->EvtchnInterface,
BlkifRing->Channel);
BlkifRing->Channel = NULL;
+fail4:
+ Error("fail4\n");
fail3:
Error("fail3\n");
-fail2:
- Error("fail2\n");
for (Index = 0; Index < (1ul << Ring->Order); ++Index) {
if (BlkifRing->Grants[Index] == NULL)
continue;
__FreePages(BlkifRing->Mdl);
BlkifRing->Shared = NULL;
BlkifRing->Mdl = NULL;
+fail2:
+ Error("fail2\n");
+ BlkifRingCacheDestroy(BlkifRing);
fail1:
Error("fail1 %08x\n", status);
return status;
BlkifRing->Shared = NULL;
BlkifRing->Mdl = NULL;
+ BlkifRingCacheDestroy(BlkifRing);
+
BlkifRing->Events = 0;
BlkifRing->Dpcs = 0;
BlkifRing->RequestsPosted = 0;