XENBUS_SUSPEND_INTERFACE SuspendInterface;
XENBUS_STORE_INTERFACE StoreInterface;
+ PXENBUS_SUSPEND_CALLBACK SuspendCallbackEarly;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
PXENBUS_DEBUG_CALLBACK DebugCallback;
PXENBUS_STORE_WATCH Watch;
(VOID) FrontendSetState(Frontend, FRONTEND_UNKNOWN);
}
+static DECLSPEC_NOINLINE VOID
+FrontendSuspendCallbackEarly(
+ IN PVOID Argument
+ )
+{
+ PXENVIF_FRONTEND Frontend = Argument;
+
+ Frontend->Online = FALSE;
+}
+
static DECLSPEC_NOINLINE VOID
FrontendSuspendCallbackLate(
IN PVOID Argument
__FrontendResume(Frontend);
+ status = XENBUS_SUSPEND(Register,
+ &Frontend->SuspendInterface,
+ SUSPEND_CALLBACK_EARLY,
+ FrontendSuspendCallbackEarly,
+ Frontend,
+ &Frontend->SuspendCallbackEarly);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
status = XENBUS_SUSPEND(Register,
&Frontend->SuspendInterface,
SUSPEND_CALLBACK_LATE,
Frontend,
&Frontend->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail3;
KeLowerIrql(Irql);
return STATUS_SUCCESS;
+fail3:
+ Error("fail3\n");
+
+ XENBUS_SUSPEND(Deregister,
+ &Frontend->SuspendInterface,
+ Frontend->SuspendCallbackEarly);
+ Frontend->SuspendCallbackEarly = NULL;
+
fail2:
Error("fail2\n");
Frontend->SuspendCallbackLate);
Frontend->SuspendCallbackLate = NULL;
+ XENBUS_SUSPEND(Deregister,
+ &Frontend->SuspendInterface,
+ Frontend->SuspendCallbackEarly);
+ Frontend->SuspendCallbackEarly = NULL;
+
__FrontendSuspend(Frontend);
XENBUS_SUSPEND(Release, &Frontend->SuspendInterface);