Windows: Add CCB NonPaged Resource for synchronization
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFcbSupport.cpp
index 9f1a979..e9add10 100644 (file)
@@ -430,8 +430,6 @@ AFSInitVolume( IN GUID *AuthGroup,
                 AFSAcquireExcl( pVolumeCB->VolumeLock,
                                 TRUE);
 
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
                 *VolumeCB = pVolumeCB;
 
                 try_return( ntStatus);
@@ -526,10 +524,10 @@ AFSInitVolume( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitVolume Initializing count (1) on volume %08lX\n",
+                      "AFSInitVolume Initializing count (2) on volume %08lX\n",
                       pVolumeCB);
 
-        pVolumeCB->VolumeReferenceCount = 1;
+        pVolumeCB->VolumeReferenceCount = 2;
 
         AFSAcquireExcl( pVolumeCB->VolumeLock,
                         TRUE);
@@ -1142,8 +1140,25 @@ AFSInitCcb( IN OUT AFSCcb **Ccb)
                        sizeof( AFSCcb));
 
         pCcb->Size = sizeof( AFSCcb);
+
         pCcb->Type = AFS_CCB;
 
+        pCcb->NPCcb = (AFSNonPagedCcb *)AFSExAllocatePoolWithTag( NonPagedPool,
+                                                     sizeof( AFSNonPagedCcb),
+                                                     AFS_CCB_NP_ALLOCATION_TAG);
+
+        if( pCcb->NPCcb == NULL)
+        {
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSInitCcb Failed to allocate NPCcb\n");
+
+            try_return( Status = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        ExInitializeResourceLite( &pCcb->NPCcb->CcbLock);
+
         //
         // Return the Ccb
         //
@@ -1158,6 +1173,12 @@ try_exit:
             if( pCcb != NULL)
             {
 
+                if ( pCcb->NPCcb != NULL)
+                {
+
+                    AFSExFreePool( pCcb->NPCcb);
+                }
+
                 AFSExFreePool( pCcb);
             }
 
@@ -1187,6 +1208,9 @@ AFSRemoveCcb( IN AFSFcb *Fcb,
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
+    AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+                    TRUE);
+
     if( Fcb != NULL &&
         BooleanFlagOn( Ccb->Flags, CCB_FLAG_INSERTED_CCB_LIST))
     {
@@ -1265,10 +1289,16 @@ AFSRemoveCcb( IN AFSFcb *Fcb,
         AFSExFreePool( Ccb->NotifyMask.Buffer);
     }
 
+    AFSReleaseResource( &Ccb->NPCcb->CcbLock);
+
     //
     // Free up the Ccb
     //
 
+    ExDeleteResourceLite( &Ccb->NPCcb->CcbLock);
+
+    AFSExFreePool( Ccb->NPCcb);
+
     AFSExFreePool( Ccb);
 
     return ntStatus;
@@ -1284,6 +1314,9 @@ AFSInsertCcb( IN AFSFcb *Fcb,
     AFSAcquireExcl( &Fcb->NPFcb->CcbListLock,
                     TRUE);
 
+    AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+                    TRUE);
+
     if( Fcb->CcbListHead == NULL)
     {
         Fcb->CcbListHead = Ccb;
@@ -1299,6 +1332,8 @@ AFSInsertCcb( IN AFSFcb *Fcb,
 
     SetFlag( Ccb->Flags, CCB_FLAG_INSERTED_CCB_LIST);
 
+    AFSReleaseResource( &Ccb->NPCcb->CcbLock);
+
     AFSReleaseResource( &Fcb->NPFcb->CcbListLock);
 
     return ntStatus;