[filedisk,ramdisk] Set the ParentBus earlier
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 17 Jan 2011 00:02:54 +0000 (19:02 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 17 Jan 2011 00:05:32 +0000 (19:05 -0500)
WvBusAddDev() calls WvlBusAddNode(), which will trigger
a device relations query on the bus before WvBusAddDev()
returns.  We must set the WVL_S_DISK_T::ParentBus
member a bit earlier so that when the disk is queried
for its capabilties, it is able to query the parent bus.

src/winvblock/filedisk/filedisk.c
src/winvblock/filedisk/grub4dos.c
src/winvblock/ramdisk/grub4dos.c
src/winvblock/ramdisk/memdisk.c

index b098020..f3085fc 100644 (file)
@@ -40,6 +40,9 @@
 #include "filedisk.h"
 #include "debug.h"
 
+/* From bus.c */
+extern WVL_S_BUS_T WvBus;
+
 /** Private. */
 static WV_F_DEV_FREE WvFilediskFree_;
 static WVL_F_DISK_IO WvFilediskIo_;
@@ -275,11 +278,11 @@ NTSTATUS STDCALL WvFilediskAttach(IN PIRP irp) {
     filedisk->hash = hash;
 
     /* Add the filedisk to the bus. */
+    filedisk->disk->ParentBus = WvBus.Fdo;
     if (!WvBusAddDev(filedisk->Dev)) {
         status = STATUS_UNSUCCESSFUL;
         goto err_add_child;
       }
-    filedisk->disk->ParentBus = filedisk->Dev->Parent;
 
     return STATUS_SUCCESS;
 
index d137303..36eceb1 100644 (file)
@@ -42,6 +42,9 @@
 #include "byte.h"
 #include "msvhd.h"
 
+/* From bus.c */
+extern WVL_S_BUS_T WvBus;
+
 /** Private. */
 static WVL_FP_DISK_IO WvFilediskG4dSyncIo_;
 static WVL_F_DISK_IO WvFilediskG4dIo_;
@@ -502,9 +505,9 @@ VOID filedisk_grub4dos__find(void) {
           FoundGrub4DosMapping = TRUE;
           filedisk_ptr->Dev->Boot = TRUE;
           /* Add the filedisk to the bus. */
+          filedisk_ptr->disk->ParentBus = WvBus.Fdo;
           if (!WvBusAddDev(filedisk_ptr->Dev))
             WvDevFree(filedisk_ptr->Dev);
-          filedisk_ptr->disk->ParentBus = filedisk_ptr->Dev->Parent;
         } /* search for sector-mapped disks. */
       InterruptVector = &SafeMbrHookPtr->PrevHook;
     } /* walk the safe hook chain. */
index eb9aac5..04c1230 100644 (file)
@@ -38,6 +38,9 @@
 #include "probe.h"
 #include "grub4dos.h"
 
+/* From bus.c */
+extern WVL_S_BUS_T WvBus;
+
 /* Scan for GRUB4DOS RAM disks and add them to the WinVBlock bus. */
 VOID WvRamdiskG4dFind(void) {
     PHYSICAL_ADDRESS phys_addr;
@@ -149,9 +152,9 @@ VOID WvRamdiskG4dFind(void) {
             ramdisk->disk->SectorSize = sector_size;
             ramdisk->Dev->Boot = TRUE;
              /* Add the ramdisk to the bus. */
+            ramdisk->disk->ParentBus = WvBus.Fdo;
             if (!WvBusAddDev(ramdisk->Dev))
               WvDevFree(ramdisk->Dev);
-            ramdisk->disk->ParentBus = ramdisk->Dev->Parent;
           } /* while i */
         int_vector = &safe_mbr_hook->PrevHook;
       } /* while safe hook chain. */
index 3650b0a..e8c99b1 100644 (file)
@@ -38,6 +38,9 @@
 #include "mdi.h"
 #include "probe.h"
 
+/* From bus.c */
+extern WVL_S_BUS_T WvBus;
+
 static BOOLEAN STDCALL WvMemdiskCheckMbft_(
     PUCHAR phys_mem,
     UINT32 offset
@@ -104,11 +107,11 @@ static BOOLEAN STDCALL WvMemdiskCheckMbft_(
     ramdisk->Dev->Boot = TRUE;
 
     /* Add the ramdisk to the bus. */
+    ramdisk->disk->ParentBus = WvBus.Fdo;
     if (!WvBusAddDev(ramdisk->Dev)) {
         WvDevFree(ramdisk->Dev);
         return FALSE;
       }
-    ramdisk->disk->ParentBus = ramdisk->Dev->Parent;
     assoc_hook->Flags = 1;
     return TRUE;
   }