]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Fix device relations in xendisk filter
authorPaul Durrant <paul.durrant@citrix.com>
Mon, 15 Jun 2015 11:10:45 +0000 (12:10 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 15 Jun 2015 11:10:45 +0000 (12:10 +0100)
Incorrect handling breaks device removal. The crucial point is that a
PDO in the case of a filter should always disappear when an
IRP_MN_REMOVE_DEVICE comes down the stack. It does not need to stick around
in some cases, like a true PDO.

Signed-off-by: Ghiya, Murtaza <murtazg@amazon.com>
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xendisk/fdo.c
src/xendisk/pdo.c

index e261b7ac06dd3b7d958d750216e41d4b465d8a13..dc91536d61367ffe3ce1b1f913b86b0f2ad201e8 100644 (file)
@@ -883,7 +883,15 @@ FdoQueryDeviceRelations(
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
          ListEntry = ListEntry->Flink)
+    {
+        PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
+        PXENDISK_PDO    Pdo = Dx->Pdo;
+
+        if (PdoIsMissing(Pdo))
+            continue;
+
         Count++;
+    }
 
     Size = sizeof(DEVICE_RELATIONS) + (sizeof (PDEVICE_OBJECT) * Count);
 
@@ -903,6 +911,9 @@ FdoQueryDeviceRelations(
 
         ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
 
+        if (PdoIsMissing(Pdo))
+            continue;
+
         if (PdoGetDevicePnpState(Pdo) == Present)
             PdoSetDevicePnpState(Pdo, Enumerated);
 
index fe11e1864c1471e63aca52146c14f130ede257a6..cdf4af65c2fb255c8f2ee5799d30bf6349a7db42 100644 (file)
@@ -1137,7 +1137,8 @@ done:
         FdoAcquireMutex(Fdo);
         PdoDestroy(Pdo);
         FdoReleaseMutex(Fdo);
-    }
+    } else if (__PdoGetDevicePnpState(Pdo) == Enumerated)
+        __PdoSetMissing(Pdo, "Device removed");
 
     return status;