Windows: Move work item queues over to the Control Device
authorRod Widdowson <rdw@steadingsoftware.com>
Tue, 19 Feb 2013 16:12:26 +0000 (16:12 +0000)
committerJeffrey Altman <jaltman@your-file-system.com>
Fri, 22 Feb 2013 21:12:06 +0000 (13:12 -0800)
Currently, when the library is unloaded it stops all worker
threands and then evaporates the work item queues.  Thus
any work items which are pending will disappear.

Whilst it is OK that the threads going away, any work items need to
remain queued so that when the library is restarted the work
can continue.  This checkin does this by moving the work item
queues and their synchronization primitives into the FS maintained
Control Device Object Extension.  The list of worker threads
remains in the Library Device Object Extension.

Change-Id: If5c7cd3bdfea1a368c8df69649e627bac3a9585f
Reviewed-on: http://gerrit.openafs.org/9139
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Peter Scott <pscott@kerneldrivers.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/common/AFSRedirCommonStructs.h
src/WINNT/afsrdr/kernel/fs/AFSInit.cpp
src/WINNT/afsrdr/kernel/lib/AFSDevControl.cpp
src/WINNT/afsrdr/kernel/lib/AFSInit.cpp
src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp

index e5a06e6..a79b5c8 100644 (file)
@@ -561,6 +561,32 @@ typedef struct _AFS_DEVICE_EXTENSION
 
             KEVENT              MemoryAvailableEvent;
 
+            //
+            // Worker Pool Queues
+            //
+
+            ERESOURCE           QueueLock;
+
+            struct _AFS_WORK_ITEM     *QueueHead;
+
+            struct _AFS_WORK_ITEM     *QueueTail;
+
+            KEVENT              WorkerQueueHasItems;
+
+            LONG                QueueItemCount;
+
+            ERESOURCE           IOQueueLock;
+
+            struct _AFS_WORK_ITEM     *IOQueueHead;
+
+            struct _AFS_WORK_ITEM     *IOQueueTail;
+
+            KEVENT              IOWorkerQueueHasItems;
+
+            LONG                IOQueueItemCount;
+
+
+
         } Control;
 
         struct
@@ -667,16 +693,6 @@ typedef struct _AFS_DEVICE_EXTENSION
 
             struct _AFS_WORKER_QUEUE_HDR *PoolHead;
 
-            ERESOURCE        QueueLock;
-
-            struct _AFS_WORK_ITEM     *QueueHead;
-
-            struct _AFS_WORK_ITEM     *QueueTail;
-
-            KEVENT           WorkerQueueHasItems;
-
-            LONG             QueueItemCount;
-
             //
             // IO Worker queue
             //
@@ -685,16 +701,6 @@ typedef struct _AFS_DEVICE_EXTENSION
 
             struct _AFS_WORKER_QUEUE_HDR *IOPoolHead;
 
-            ERESOURCE        IOQueueLock;
-
-            struct _AFS_WORK_ITEM     *IOQueueHead;
-
-            struct _AFS_WORK_ITEM     *IOQueueTail;
-
-            KEVENT           IOWorkerQueueHasItems;
-
-            LONG             IOQueueItemCount;
-
         } Library;
 
     } Specific;
index 1969d4f..3384a46 100644 (file)
@@ -421,6 +421,23 @@ DriverEntry( PDRIVER_OBJECT DriverObject,
         AFSSysProcess = PsGetCurrentProcessId();
 
         //
+        // Initialize the worker Queues and their syncrhonization structures
+        //
+
+        KeInitializeEvent( &pDeviceExt->Specific.Control.WorkerQueueHasItems,
+                           SynchronizationEvent,
+                           FALSE);
+
+        ExInitializeResourceLite( &pDeviceExt->Specific.Control.QueueLock);
+
+        KeInitializeEvent( &pDeviceExt->Specific.Control.IOWorkerQueueHasItems,
+                           SynchronizationEvent,
+                           FALSE);
+
+        ExInitializeResourceLite( &pDeviceExt->Specific.Control.IOQueueLock);
+
+
+        //
         // Register for shutdown notification
         //
 
index d92afaf..1d56c34 100644 (file)
@@ -104,6 +104,23 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
                 }
 
                 //
+                // Initialize the worker pool.
+                //
+
+                ntStatus = AFSInitializeWorkerPool();
+
+                if( !NT_SUCCESS( ntStatus))
+                {
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+                                  AFS_TRACE_LEVEL_ERROR,
+                                  "AFSDevControl AFSInitializeWorkerPool failure %08lX\n",
+                                  ntStatus);
+
+                    break;
+                }
+
+                //
                 // Initialize our global entries
                 //
 
index 6bd8756..34fc994 100644 (file)
@@ -206,18 +206,12 @@ DriverEntry( PDRIVER_OBJECT DriverObject,
         }
 
         //
-        // Initialize the worker thread pool
+        // Initialize the worker thread pool counts.
         //
 
-        ntStatus = AFSInitializeWorkerPool();
+        pDeviceExt->Specific.Library.WorkerCount = 0;
 
-        if( !NT_SUCCESS( ntStatus))
-        {
-
-            AFSPrint("AFS DriverEntry Failed to initialize worker pool Status %08lX\n", ntStatus);
-
-            try_return( ntStatus);
-        }
+        pDeviceExt->Specific.Library.IOWorkerCount = 0;
 
         //
         // Fill in the dispatch table
@@ -264,12 +258,6 @@ try_exit:
 
             AFSPrint("AFSLibrary DriverEntry failed to initialize %08lX\n", ntStatus);
 
-            if( AFSLibraryDeviceObject != NULL)
-            {
-
-                AFSRemoveWorkerPool();
-            }
-
             if( AFSRegistryPath.Buffer != NULL)
             {
 
index dbf98eb..8f7d0d8 100644 (file)
@@ -72,18 +72,6 @@ AFSInitializeWorkerPool()
         // Initialize the worker threads.
         //
 
-        pDevExt->Specific.Library.WorkerCount = 0;
-
-        KeInitializeEvent( &pDevExt->Specific.Library.WorkerQueueHasItems,
-                           SynchronizationEvent,
-                           FALSE);
-
-        //
-        // Initialize the queue resource
-        //
-
-        ExInitializeResourceLite( &pDevExt->Specific.Library.QueueLock);
-
         while( pDevExt->Specific.Library.WorkerCount < AFS_WORKER_COUNT)
         {
 
@@ -154,18 +142,6 @@ AFSInitializeWorkerPool()
         // Now our IO Worker queue
         //
 
-        pDevExt->Specific.Library.IOWorkerCount = 0;
-
-        KeInitializeEvent( &pDevExt->Specific.Library.IOWorkerQueueHasItems,
-                           SynchronizationEvent,
-                           FALSE);
-
-        //
-        // Initialize the queue resource
-        //
-
-        ExInitializeResourceLite( &pDevExt->Specific.Library.IOQueueLock);
-
         while( pDevExt->Specific.Library.IOWorkerCount < AFS_IO_WORKER_COUNT)
         {
 
@@ -320,8 +296,6 @@ AFSRemoveWorkerPool()
 
     pDevExt->Specific.Library.PoolHead = NULL;
 
-    ExDeleteResourceLite( &pDevExt->Specific.Library.QueueLock);
-
     //
     // Loop through the IO workers shutting them down in two stages.
     // First, clear AFS_WORKER_PROCESS_REQUESTS so that workers
@@ -375,8 +349,6 @@ AFSRemoveWorkerPool()
 
     pDevExt->Specific.Library.IOPoolHead = NULL;
 
-    ExDeleteResourceLite( &pDevExt->Specific.Library.IOQueueLock);
-
     return ntStatus;
 }
 
@@ -577,7 +549,7 @@ AFSShutdownWorkerThread( IN AFSWorkQueueContext *PoolContext)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     if( PoolContext->WorkerThreadObject != NULL)
     {
@@ -589,7 +561,7 @@ AFSShutdownWorkerThread( IN AFSWorkQueueContext *PoolContext)
             // Wake up the thread if it is a sleep
             //
 
-            KeSetEvent( &pDeviceExt->Specific.Library.WorkerQueueHasItems,
+            KeSetEvent( &pControlDeviceExt->Specific.Control.WorkerQueueHasItems,
                         0,
                         FALSE);
 
@@ -625,7 +597,7 @@ AFSShutdownIOWorkerThread( IN AFSWorkQueueContext *PoolContext)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     if( PoolContext->WorkerThreadObject != NULL)
     {
@@ -637,7 +609,7 @@ AFSShutdownIOWorkerThread( IN AFSWorkQueueContext *PoolContext)
             // Wake up the thread if it is a sleep
             //
 
-            KeSetEvent( &pDeviceExt->Specific.Library.IOWorkerQueueHasItems,
+            KeSetEvent( &pControlDeviceExt->Specific.Control.IOWorkerQueueHasItems,
                         0,
                         FALSE);
 
@@ -676,10 +648,10 @@ AFSWorkerThread( IN PVOID Context)
     AFSWorkQueueContext *pPoolContext = (AFSWorkQueueContext *)Context;
     AFSWorkItem *pWorkItem;
     BOOLEAN freeWorkItem = TRUE;
-    AFSDeviceExt *pLibraryDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL;
     LONG lCount;
 
-    pLibraryDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     //
     // Indicate that we are initialized and ready
@@ -695,7 +667,7 @@ AFSWorkerThread( IN PVOID Context)
 
     SetFlag( pPoolContext->State, AFS_WORKER_INITIALIZED);
 
-    ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.WorkerQueueHasItems,
+    ntStatus = KeWaitForSingleObject( &pControlDevExt->Specific.Control.WorkerQueueHasItems,
                                       Executive,
                                       KernelMode,
                                       FALSE,
@@ -721,7 +693,7 @@ AFSWorkerThread( IN PVOID Context)
             if( pWorkItem == NULL)
             {
 
-                ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.WorkerQueueHasItems,
+                ntStatus = KeWaitForSingleObject( &pControlDevExt->Specific.Control.WorkerQueueHasItems,
                                                   Executive,
                                                   KernelMode,
                                                   FALSE,
@@ -811,7 +783,7 @@ AFSWorkerThread( IN PVOID Context)
 
     // Wake up another worker so they too can exit
 
-    KeSetEvent( &pLibraryDevExt->Specific.Library.WorkerQueueHasItems,
+    KeSetEvent( &pControlDevExt->Specific.Control.WorkerQueueHasItems,
                 0,
                 FALSE);
 
@@ -828,9 +800,9 @@ AFSIOWorkerThread( IN PVOID Context)
     AFSWorkQueueContext *pPoolContext = (AFSWorkQueueContext *)Context;
     AFSWorkItem *pWorkItem;
     BOOLEAN freeWorkItem = TRUE;
-    AFSDeviceExt *pLibraryDevExt = NULL, *pRdrDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL, *pRdrDevExt = NULL;
 
-    pLibraryDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     //
     // Indicate that we are initialized and ready
@@ -847,7 +819,7 @@ AFSIOWorkerThread( IN PVOID Context)
 
     SetFlag( pPoolContext->State, AFS_WORKER_INITIALIZED);
 
-    ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.IOWorkerQueueHasItems,
+    ntStatus = KeWaitForSingleObject( &pControlDevExt->Specific.Control.IOWorkerQueueHasItems,
                                       Executive,
                                       KernelMode,
                                       FALSE,
@@ -873,7 +845,7 @@ AFSIOWorkerThread( IN PVOID Context)
             if( pWorkItem == NULL)
             {
 
-                ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.IOWorkerQueueHasItems,
+                ntStatus = KeWaitForSingleObject( &pControlDevExt->Specific.Control.IOWorkerQueueHasItems,
                                                   Executive,
                                                   KernelMode,
                                                   FALSE,
@@ -958,7 +930,7 @@ AFSIOWorkerThread( IN PVOID Context)
 
     // Wake up another IOWorker so they too can exit
 
-    KeSetEvent( &pLibraryDevExt->Specific.Library.IOWorkerQueueHasItems,
+    KeSetEvent( &pControlDevExt->Specific.Control.IOWorkerQueueHasItems,
                 0,
                 FALSE);
 
@@ -1978,21 +1950,21 @@ AFSInsertWorkitem( IN AFSWorkItem *WorkItem)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL;
     LONG lCount;
 
-    pDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSInsertWorkitem Acquiring Control QueueLock lock %p EXCL %08lX\n",
-                  &pDevExt->Specific.Library.QueueLock,
+                  &pControlDevExt->Specific.Control.QueueLock,
                   PsGetCurrentThread());
 
-    AFSAcquireExcl( &pDevExt->Specific.Library.QueueLock,
+    AFSAcquireExcl( &pControlDevExt->Specific.Control.QueueLock,
                     TRUE);
 
-    lCount = InterlockedIncrement( &pDevExt->Specific.Library.QueueItemCount);
+    lCount = InterlockedIncrement( &pControlDevExt->Specific.Control.QueueItemCount);
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
@@ -2000,26 +1972,26 @@ AFSInsertWorkitem( IN AFSWorkItem *WorkItem)
                   WorkItem,
                   lCount);
 
-    if( pDevExt->Specific.Library.QueueTail != NULL) // queue already has nodes
+    if( pControlDevExt->Specific.Control.QueueTail != NULL) // queue already has nodes
     {
 
-        pDevExt->Specific.Library.QueueTail->next = WorkItem;
+        pControlDevExt->Specific.Control.QueueTail->next = WorkItem;
     }
     else // first node
     {
 
-        pDevExt->Specific.Library.QueueHead = WorkItem;
+        pControlDevExt->Specific.Control.QueueHead = WorkItem;
     }
 
     WorkItem->next = NULL;
-    pDevExt->Specific.Library.QueueTail = WorkItem;
+    pControlDevExt->Specific.Control.QueueTail = WorkItem;
 
     // indicate that the queue has nodes
-    KeSetEvent( &(pDevExt->Specific.Library.WorkerQueueHasItems),
+    KeSetEvent( &(pControlDevExt->Specific.Control.WorkerQueueHasItems),
                 0,
                 FALSE);
 
-    AFSReleaseResource( &pDevExt->Specific.Library.QueueLock);
+    AFSReleaseResource( &pControlDevExt->Specific.Control.QueueLock);
 
     return ntStatus;
 }
@@ -2029,21 +2001,21 @@ AFSInsertIOWorkitem( IN AFSWorkItem *WorkItem)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL;
     LONG lCount;
 
-    pDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSInsertIOWorkitem Acquiring Control QueueLock lock %p EXCL %08lX\n",
-                  &pDevExt->Specific.Library.IOQueueLock,
+                  &pControlDevExt->Specific.Control.IOQueueLock,
                   PsGetCurrentThread());
 
-    AFSAcquireExcl( &pDevExt->Specific.Library.IOQueueLock,
+    AFSAcquireExcl( &pControlDevExt->Specific.Control.IOQueueLock,
                     TRUE);
 
-    lCount = InterlockedIncrement( &pDevExt->Specific.Library.IOQueueItemCount);
+    lCount = InterlockedIncrement( &pControlDevExt->Specific.Control.IOQueueItemCount);
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
@@ -2051,26 +2023,26 @@ AFSInsertIOWorkitem( IN AFSWorkItem *WorkItem)
                   WorkItem,
                   lCount);
 
-    if( pDevExt->Specific.Library.IOQueueTail != NULL) // queue already has nodes
+    if( pControlDevExt->Specific.Control.IOQueueTail != NULL) // queue already has nodes
     {
 
-        pDevExt->Specific.Library.IOQueueTail->next = WorkItem;
+        pControlDevExt->Specific.Control.IOQueueTail->next = WorkItem;
     }
     else // first node
     {
 
-        pDevExt->Specific.Library.IOQueueHead = WorkItem;
+        pControlDevExt->Specific.Control.IOQueueHead = WorkItem;
     }
 
     WorkItem->next = NULL;
-    pDevExt->Specific.Library.IOQueueTail = WorkItem;
+    pControlDevExt->Specific.Control.IOQueueTail = WorkItem;
 
     // indicate that the queue has nodes
-    KeSetEvent( &(pDevExt->Specific.Library.IOWorkerQueueHasItems),
+    KeSetEvent( &(pControlDevExt->Specific.Control.IOWorkerQueueHasItems),
                 0,
                 FALSE);
 
-    AFSReleaseResource( &pDevExt->Specific.Library.IOQueueLock);
+    AFSReleaseResource( &pControlDevExt->Specific.Control.IOQueueLock);
 
     return ntStatus;
 }
@@ -2080,25 +2052,25 @@ AFSInsertWorkitemAtHead( IN AFSWorkItem *WorkItem)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL;
     LONG lCount;
 
-    pDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSInsertWorkitemAtHead Acquiring Control QueueLock lock %p EXCL %08lX\n",
-                  &pDevExt->Specific.Library.QueueLock,
+                  &pControlDevExt->Specific.Control.QueueLock,
                   PsGetCurrentThread());
 
-    AFSAcquireExcl( &pDevExt->Specific.Library.QueueLock,
+    AFSAcquireExcl( &pControlDevExt->Specific.Control.QueueLock,
                     TRUE);
 
-    WorkItem->next = pDevExt->Specific.Library.QueueHead;
+    WorkItem->next = pControlDevExt->Specific.Control.QueueHead;
 
-    pDevExt->Specific.Library.QueueHead = WorkItem;
+    pControlDevExt->Specific.Control.QueueHead = WorkItem;
 
-    lCount = InterlockedIncrement( &pDevExt->Specific.Library.QueueItemCount);
+    lCount = InterlockedIncrement( &pControlDevExt->Specific.Control.QueueItemCount);
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
@@ -2110,11 +2082,11 @@ AFSInsertWorkitemAtHead( IN AFSWorkItem *WorkItem)
     // indicate that the queue has nodes
     //
 
-    KeSetEvent( &(pDevExt->Specific.Library.WorkerQueueHasItems),
+    KeSetEvent( &(pControlDevExt->Specific.Control.WorkerQueueHasItems),
                 0,
                 FALSE);
 
-    AFSReleaseResource( &pDevExt->Specific.Library.QueueLock);
+    AFSReleaseResource( &pControlDevExt->Specific.Control.QueueLock);
 
     return ntStatus;
 }
@@ -2124,26 +2096,26 @@ AFSRemoveWorkItem()
 {
 
     AFSWorkItem        *pWorkItem = NULL;
-    AFSDeviceExt *pDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL;
     LONG lCount;
 
-    pDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSRemoveWorkItem Acquiring Control QueueLock lock %p EXCL %08lX\n",
-                  &pDevExt->Specific.Library.QueueLock,
+                  &pControlDevExt->Specific.Control.QueueLock,
                   PsGetCurrentThread());
 
-    AFSAcquireExcl( &pDevExt->Specific.Library.QueueLock,
+    AFSAcquireExcl( &pControlDevExt->Specific.Control.QueueLock,
                     TRUE);
 
-    if( pDevExt->Specific.Library.QueueHead != NULL) // queue has nodes
+    if( pControlDevExt->Specific.Control.QueueHead != NULL) // queue has nodes
     {
 
-        pWorkItem = pDevExt->Specific.Library.QueueHead;
+        pWorkItem = pControlDevExt->Specific.Control.QueueHead;
 
-        lCount = InterlockedDecrement( &pDevExt->Specific.Library.QueueItemCount);
+        lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.QueueItemCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -2152,12 +2124,12 @@ AFSRemoveWorkItem()
                       lCount,
                       PsGetCurrentThreadId());
 
-        pDevExt->Specific.Library.QueueHead = pDevExt->Specific.Library.QueueHead->next;
+        pControlDevExt->Specific.Control.QueueHead = pControlDevExt->Specific.Control.QueueHead->next;
 
-        if( pDevExt->Specific.Library.QueueHead == NULL) // if queue just became empty
+        if( pControlDevExt->Specific.Control.QueueHead == NULL) // if queue just became empty
         {
 
-            pDevExt->Specific.Library.QueueTail = NULL;
+            pControlDevExt->Specific.Control.QueueTail = NULL;
         }
         else
         {
@@ -2166,13 +2138,13 @@ AFSRemoveWorkItem()
             // Wake up another worker
             //
 
-            KeSetEvent( &(pDevExt->Specific.Library.WorkerQueueHasItems),
+            KeSetEvent( &(pControlDevExt->Specific.Control.WorkerQueueHasItems),
                         0,
                         FALSE);
         }
     }
 
-    AFSReleaseResource( &pDevExt->Specific.Library.QueueLock);
+    AFSReleaseResource( &pControlDevExt->Specific.Control.QueueLock);
 
     return pWorkItem;
 }
@@ -2182,26 +2154,26 @@ AFSRemoveIOWorkItem()
 {
 
     AFSWorkItem        *pWorkItem = NULL;
-    AFSDeviceExt *pDevExt = NULL;
+    AFSDeviceExt *pControlDevExt = NULL;
     LONG lCount;
 
-    pDevExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
+    pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSRemoveIOWorkItem Acquiring Control QueueLock lock %p EXCL %08lX\n",
-                  &pDevExt->Specific.Library.IOQueueLock,
+                  &pControlDevExt->Specific.Control.IOQueueLock,
                   PsGetCurrentThread());
 
-    AFSAcquireExcl( &pDevExt->Specific.Library.IOQueueLock,
+    AFSAcquireExcl( &pControlDevExt->Specific.Control.IOQueueLock,
                     TRUE);
 
-    if( pDevExt->Specific.Library.IOQueueHead != NULL) // queue has nodes
+    if( pControlDevExt->Specific.Control.IOQueueHead != NULL) // queue has nodes
     {
 
-        pWorkItem = pDevExt->Specific.Library.IOQueueHead;
+        pWorkItem = pControlDevExt->Specific.Control.IOQueueHead;
 
-        lCount = InterlockedDecrement( &pDevExt->Specific.Library.IOQueueItemCount);
+        lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.IOQueueItemCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -2210,12 +2182,12 @@ AFSRemoveIOWorkItem()
                       lCount,
                       PsGetCurrentThreadId());
 
-        pDevExt->Specific.Library.IOQueueHead = pDevExt->Specific.Library.IOQueueHead->next;
+        pControlDevExt->Specific.Control.IOQueueHead = pControlDevExt->Specific.Control.IOQueueHead->next;
 
-        if( pDevExt->Specific.Library.IOQueueHead == NULL) // if queue just became empty
+        if( pControlDevExt->Specific.Control.IOQueueHead == NULL) // if queue just became empty
         {
 
-            pDevExt->Specific.Library.IOQueueTail = NULL;
+            pControlDevExt->Specific.Control.IOQueueTail = NULL;
         }
         else
         {
@@ -2224,13 +2196,13 @@ AFSRemoveIOWorkItem()
             // Wake up another worker
             //
 
-            KeSetEvent( &(pDevExt->Specific.Library.IOWorkerQueueHasItems),
+            KeSetEvent( &(pControlDevExt->Specific.Control.IOWorkerQueueHasItems),
                         0,
                         FALSE);
         }
     }
 
-    AFSReleaseResource( &pDevExt->Specific.Library.IOQueueLock);
+    AFSReleaseResource( &pControlDevExt->Specific.Control.IOQueueLock);
 
     return pWorkItem;
 }