*NeedReboot = FALSE;
for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
+ BOOLEAN Missing = TRUE;
+
Pdo = __FdoGetPdo(Fdo, TargetId);
if (Pdo == NULL)
continue;
- if (!PdoIsMissing(Pdo)) {
- BOOLEAN Missing = TRUE;
- for (Device = Devices; *Device; Device = __NextSz(Device)) {
- ULONG DeviceTargetId = __ParseVbd(Device);
- if (TargetId == DeviceTargetId) {
- Missing = FALSE;
- break;
- }
- }
- if (Missing) {
- PdoSetMissing(Pdo, "Device Dissappeared");
- if (PdoGetDevicePnpState(Pdo) == Present)
- PdoSetDevicePnpState(Pdo, Deleted);
- else
- *NeedInvalidate = TRUE;
+ for (Device = Devices; *Device; Device = __NextSz(Device)) {
+ ULONG DeviceTargetId = __ParseVbd(Device);
+ if (TargetId == DeviceTargetId) {
+ Missing = FALSE;
+ break;
}
}
-
- if (PdoIsMissing(Pdo) &&
- PdoGetDevicePnpState(Pdo) == Deleted) {
- // drop reference count before destroying
+
+ if (Missing && !PdoIsMissing(Pdo)) {
+ PdoSetMissing(Pdo, "Device Disappeared");
+ if (PdoGetDevicePnpState(Pdo) == Present)
+ PdoSetDevicePnpState(Pdo, Deleted);
+ else
+ *NeedInvalidate = TRUE;
+ }
+
+ if (PdoGetDevicePnpState(Pdo) == Deleted) {
PdoDereference(Pdo);
PdoDestroy(Pdo);
} else {
__in DEVICE_PNP_STATE State
)
{
- ASSERT(Pdo->DevicePnpState != Deleted || State == Deleted);
- Verbose("Target[%d] : PNP %s to %s\n", PdoGetTargetId(Pdo), __PnpStateName(Pdo->DevicePnpState), __PnpStateName(State));
+ Verbose("Target[%d] : PNP %s to %s\n",
+ PdoGetTargetId(Pdo),
+ __PnpStateName(Pdo->DevicePnpState),
+ __PnpStateName(State));
+
+ if (Pdo->DevicePnpState == Deleted) {
+ ASSERT(State == Deleted);
+ return;
+ }
+
Pdo->PrevPnpState = Pdo->DevicePnpState;
Pdo->DevicePnpState = State;
}