[bus] Put the device right in the bus
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 21 Dec 2010 15:21:34 +0000 (10:21 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 21 Dec 2010 15:21:34 +0000 (10:21 -0500)
Instead of a pointer and a separate allocation, put
the device structure right inside the bus structure.
Now when we free, we simply free the bus structure.

src/aoe/bus.c
src/include/bus.h
src/winvblock/bus/bus.c
src/winvblock/disk/pnp.c
src/winvblock/driver.c

index 8876490..7b23a43 100644 (file)
@@ -116,9 +116,9 @@ winvblock__bool AoeBusCreate(void) {
         goto err_new_bus;
       }
     /* When the PDO is created, we need to handle PnP ID queries. */
-    new_bus->Dev->Ops.PnpId = AoeBusPnpId_;
+    new_bus->Dev.Ops.PnpId = AoeBusPnpId_;
     /* Add it as a sub-bus to WinVBlock. */
-    if (!WvBusAddChild(driver__bus(), new_bus->Dev)) {
+    if (!WvBusAddChild(driver__bus(), &new_bus->Dev)) {
         DBG("Couldn't add AoE bus to WinVBlock bus!\n");
         goto err_add_child;
       }
@@ -138,10 +138,10 @@ winvblock__bool AoeBusCreate(void) {
     IoDeleteSymbolicLink(&AoeBusDosname_);
     err_dos_symlink:
 
-    IoDeleteDevice(AoeBusMain->Dev->Self);
+    IoDeleteDevice(AoeBusMain->Dev.Self);
     err_add_child:
 
-    WvDevFree(new_bus->Dev);
+    WvDevFree(&new_bus->Dev);
     err_new_bus:
 
     return FALSE;
@@ -154,11 +154,11 @@ void AoeBusFree(void) {
       return;
 
     IoDeleteSymbolicLink(&AoeBusDosname_);
-    IoDeleteDevice(AoeBusMain->Dev->Self);
+    IoDeleteDevice(AoeBusMain->Dev.Self);
     #if 0
-    bus__remove_child(driver__bus(), AoeBusMain->Dev);
+    bus__remove_child(driver__bus(), &AoeBusMain->Dev);
     #endif
-    WvDevFree(AoeBusMain->Dev);
+    WvDevFree(&AoeBusMain->Dev);
     return;
   }
 
index e2d3f93..d0c3a8d 100644 (file)
@@ -40,7 +40,7 @@ typedef WV_F_BUS_THREAD * WV_FP_BUS_THREAD;
 
 /* The bus type. */
 typedef struct WV_BUS_T {
-    WV_SP_DEV_T Dev;
+    WV_S_DEV_T Dev;
     PDEVICE_OBJECT LowerDeviceObject;
     PDEVICE_OBJECT PhysicalDeviceObject;
     winvblock__uint32 Children;
@@ -51,7 +51,6 @@ typedef struct WV_BUS_T {
     struct {
         LIST_ENTRY Nodes;
         USHORT NodeCount;
-        WV_FP_DEV_FREE PrevFree;
         LIST_ENTRY WorkItems;
         KSPIN_LOCK WorkItemsLock;
       } BusPrivate_;
index 3c33e61..c2ac8d4 100644 (file)
@@ -108,7 +108,7 @@ winvblock__lib_func winvblock__bool STDCALL WvBusAddChild(
         return FALSE;
       }
 
-    Dev->Parent = Bus->Dev->Self;
+    Dev->Parent = Bus->Dev.Self;
     /*
      * Initialize the device.  For disks, this routine is responsible for
      * determining the disk's geometry appropriately for AoE/RAM/file disks.
@@ -252,22 +252,19 @@ static winvblock__bool STDCALL WvBusDevInit_(IN WV_SP_DEV_T dev) {
  * @v Bus               Points to the bus to initialize with defaults.
  */
 winvblock__lib_func void WvBusInit(WV_SP_BUS_T Bus) {
-    WV_SP_DEV_T dev = Bus->Dev;
-
     RtlZeroMemory(Bus, sizeof *Bus);
     /* Populate non-zero bus device defaults. */
-    Bus->Dev = dev;
-    Bus->BusPrivate_.PrevFree = dev->Ops.Free;
+    WvDevInit(&Bus->Dev);
     Bus->Thread = WvBusDefaultThread_;
     KeInitializeSpinLock(&Bus->BusPrivate_.WorkItemsLock);
     InitializeListHead(&Bus->BusPrivate_.WorkItems);
     KeInitializeEvent(&Bus->ThreadSignal, SynchronizationEvent, FALSE);
-    dev->Ops.CreatePdo = WvBusCreatePdo_;
-    dev->Ops.Init = WvBusDevInit_;
-    dev->Ops.Free = WvBusFree_;
-    dev->ext = Bus;
-    dev->IrpMj = &WvBusIrpMj_;
-    dev->IsBus = TRUE;
+    Bus->Dev.Ops.CreatePdo = WvBusCreatePdo_;
+    Bus->Dev.Ops.Init = WvBusDevInit_;
+    Bus->Dev.Ops.Free = WvBusFree_;
+    Bus->Dev.ext = Bus;
+    Bus->Dev.IrpMj = &WvBusIrpMj_;
+    Bus->Dev.IsBus = TRUE;
   }
 
 /**
@@ -277,17 +274,11 @@ winvblock__lib_func void WvBusInit(WV_SP_BUS_T Bus) {
  *
  * This function should not be confused with a PDO creation routine, which is
  * actually implemented for each device type.  This routine will allocate a
- * WV_S_BUS_T, track it in a global list, as well as populate the bus
- * with default values.
+ * WV_S_BUS_T as well as populate the bus with default values.
  */
 winvblock__lib_func WV_SP_BUS_T WvBusCreate(void) {
-    WV_SP_DEV_T dev;
     WV_SP_BUS_T bus;
 
-    /* Try to create a device. */
-    dev = WvDevCreate();
-    if (dev == NULL)
-      goto err_no_dev;
     /*
      * Bus devices might be used for booting and should
      * not be allocated from a paged memory pool.
@@ -296,15 +287,12 @@ winvblock__lib_func WV_SP_BUS_T WvBusCreate(void) {
     if (bus == NULL)
       goto err_no_bus;
 
-    bus->Dev = dev;
     WvBusInit(bus);
     return bus;
 
+    wv_free(bus);
     err_no_bus:
 
-    WvDevFree(dev);
-    err_no_dev:
-
     return NULL;
   }
 
@@ -369,8 +357,6 @@ static PDEVICE_OBJECT STDCALL WvBusCreatePdo_(IN WV_SP_DEV_T dev) {
  */
 static void STDCALL WvBusFree_(IN WV_SP_DEV_T dev) {
     WV_SP_BUS_T bus = WvBusFromDev(dev);
-    /* Free the "inherited class". */
-    bus->BusPrivate_.PrevFree(dev);
 
     wv_free(bus);
   }
@@ -466,7 +452,7 @@ winvblock__lib_func void WvBusProcessWorkItems(WV_SP_BUS_T Bus) {
             case WvBusWorkItemCmdProcessIrp_:
               irp = work_item->Context.Irp;
               io_stack_loc = IoGetCurrentIrpStackLocation(irp);
-              dev_obj = Bus->Dev->Self;
+              dev_obj = Bus->Dev.Self;
               driver_obj = dev_obj->DriverObject;
               driver_obj->MajorFunction[io_stack_loc->MajorFunction](
                   dev_obj,
@@ -542,7 +528,7 @@ static void STDCALL WvBusDefaultThread_(IN WV_SP_BUS_T bus) {
     timeout.QuadPart = -300000000LL;
 
     /* Hook WV_SP_DEV_T::ops.free() */
-    bus->Dev->Ops.Free = WvBusThreadFree_;
+    bus->Dev.Ops.Free = WvBusThreadFree_;
 
     /* When bus::Stop is set, we shut down. */
     while (!bus->Stop) {
@@ -563,7 +549,7 @@ static void STDCALL WvBusDefaultThread_(IN WV_SP_BUS_T bus) {
       } /* while bus->alive */
 
     WvBusCancelWorkItems(bus);
-    WvBusFree_(bus->Dev);
+    WvBusFree_(&bus->Dev);
     return;
   }
 
@@ -645,7 +631,7 @@ winvblock__lib_func NTSTATUS STDCALL WvBusAddNode(
     if (
         !Bus ||
         !Node ||
-        Bus->Dev->Self->DriverObject != Node->BusPrivate_.Pdo->DriverObject
+        Bus->Dev.Self->DriverObject != Node->BusPrivate_.Pdo->DriverObject
       )
       return STATUS_INVALID_PARAMETER;
 
index 189b337..8938cfa 100644 (file)
@@ -224,7 +224,7 @@ static NTSTATUS STDCALL disk_pnp__query_capabilities_(
           );
       } else {
         status = WvBusGetDevCapabilities(
-            bus->Dev->Self,
+            bus->Dev.Self,
             &ParentDeviceCapabilities
           );
       }      
index 9d41063..394128e 100644 (file)
@@ -183,8 +183,8 @@ static NTSTATUS STDCALL driver__attach_fdo_(
         goto err_dos_symlink;
       }
     /* Set associations for the bus, device, FDO, PDO. */
-    WvDevForDevObj(fdo, bus->Dev);
-    bus->Dev->Self = fdo;
+    WvDevForDevObj(fdo, &bus->Dev);
+    bus->Dev.Self = fdo;
     bus->PhysicalDeviceObject = PhysicalDeviceObject;
     fdo->Flags |= DO_DIRECT_IO;         /* FIXME? */
     fdo->Flags |= DO_POWER_INRUSH;      /* FIXME? */
@@ -232,7 +232,7 @@ static NTSTATUS STDCALL driver__attach_fdo_(
     IoDeleteDevice(fdo);
     err_fdo:
 
-    WvDevFree(bus->Dev);
+    WvDevFree(&bus->Dev);
     err_bus:
 
     err_already_established: