Windows: Allocated VolumeCB from PagedPool
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFcbSupport.cpp
index 5fbeedb..fec903f 100644 (file)
@@ -164,7 +164,7 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitFcb Acquiring Fcb lock %08lX EXCL %08lX\n",
+                      "AFSInitFcb Acquiring Fcb lock %p EXCL %08lX\n",
                       &pNPFcb->Resource,
                       PsGetCurrentThread());
 
@@ -281,14 +281,14 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
-                          "AFSInitFcb Raced Fcb %08lX pFcb %08lX Name %wZ\n",
+                          "AFSInitFcb Raced Fcb %p pFcb %p Name %wZ\n",
                           pObjectInfo->Fcb,
                           pFcb,
                           &DirEntry->NameInformation.FileName);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitFcb Acquiring Fcb lock %08lX EXCL %08lX\n",
+                          "AFSInitFcb Acquiring Fcb lock %p EXCL %08lX\n",
                           &pObjectInfo->Fcb->NPFcb->Resource,
                           PsGetCurrentThread());
 
@@ -304,7 +304,7 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitFcb Initialized Fcb %08lX Name %wZ\n",
+                      "AFSInitFcb Initialized Fcb %p Name %wZ\n",
                       &pObjectInfo->Fcb,
                       &DirEntry->NameInformation.FileName);
 
@@ -438,7 +438,7 @@ AFSInitVolume( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSInitVolume Increment count on volume %08lX Cnt %d\n",
+                              "AFSInitVolume Increment count on volume %p Cnt %d\n",
                               pVolumeCB,
                               lCount);
 
@@ -468,7 +468,7 @@ AFSInitVolume( IN GUID *AuthGroup,
         // into the volume tree ...
         //
 
-        pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( NonPagedPool,
+        pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( PagedPool,
                                                              sizeof( AFSVolumeCB),
                                                              AFS_VCB_ALLOCATION_TAG);
 
@@ -547,7 +547,7 @@ AFSInitVolume( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitVolume Initializing count (2) on volume %08lX\n",
+                      "AFSInitVolume Initializing count (2) on volume %p\n",
                       pVolumeCB);
 
         pVolumeCB->VolumeReferenceCount = 2;
@@ -962,7 +962,7 @@ AFSInitRootFcb( IN ULONGLONG ProcessID,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInitRootFcb Acquiring Fcb lock %08lX EXCL %08lX\n",
+                      "AFSInitRootFcb Acquiring Fcb lock %p EXCL %08lX\n",
                       &pNPFcb->Resource,
                       PsGetCurrentThread());
 
@@ -1084,7 +1084,7 @@ AFSRemoveFcb( IN AFSFcb **ppFcb)
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSRemoveFcb Removing Fcb %08lX\n",
+                  "AFSRemoveFcb Removing Fcb %p\n",
                   pFcb);
 
     if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
@@ -1141,11 +1141,15 @@ AFSRemoveFcb( IN AFSFcb **ppFcb)
 }
 
 NTSTATUS
-AFSInitCcb( IN OUT AFSCcb **Ccb)
+AFSInitCcb( IN OUT AFSCcb **Ccb,
+            IN     AFSDirectoryCB *DirectoryCB,
+            IN     ACCESS_MASK     GrantedAccess,
+            IN     ULONG           FileAccess)
 {
 
     NTSTATUS Status = STATUS_SUCCESS;
     AFSCcb *pCcb = NULL;
+    LONG lCount;
 
     __Enter
     {
@@ -1191,6 +1195,22 @@ AFSInitCcb( IN OUT AFSCcb **Ccb)
 
         ExInitializeResourceLite( &pCcb->NPCcb->CcbLock);
 
+        pCcb->DirectoryCB = DirectoryCB;
+
+        lCount = InterlockedIncrement( &pCcb->DirectoryCB->DirOpenReferenceCount);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitCcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+                      &pCcb->DirectoryCB->NameInformation.FileName,
+                      pCcb->DirectoryCB,
+                      pCcb,
+                      lCount);
+
+        pCcb->GrantedAccess = GrantedAccess;
+
+        pCcb->FileAccess = FileAccess;
+
         //
         // Return the Ccb
         //
@@ -1230,15 +1250,15 @@ try_exit:
 //
 // Return:
 //
-//      A status is returned for the function
+//      None
 //
 
-NTSTATUS
+void
 AFSRemoveCcb( IN AFSFcb *Fcb,
               IN AFSCcb *Ccb)
 {
 
-    NTSTATUS ntStatus = STATUS_SUCCESS;
+    LONG lCount;
 
     AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
                     TRUE);
@@ -1321,6 +1341,22 @@ AFSRemoveCcb( IN AFSFcb *Fcb,
         AFSExFreePoolWithTag( Ccb->NotifyMask.Buffer, AFS_GENERIC_MEMORY_7_TAG);
     }
 
+    if ( Ccb->DirectoryCB != NULL)
+    {
+
+        lCount = InterlockedDecrement( &Ccb->DirectoryCB->DirOpenReferenceCount);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSRemoveCcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+                      &Ccb->DirectoryCB->NameInformation.FileName,
+                      Ccb->DirectoryCB,
+                      Ccb,
+                      lCount);
+
+        ASSERT( lCount >= 0);
+    }
+
     AFSReleaseResource( &Ccb->NPCcb->CcbLock);
 
     //
@@ -1332,8 +1368,6 @@ AFSRemoveCcb( IN AFSFcb *Fcb,
     AFSExFreePoolWithTag( Ccb->NPCcb, AFS_CCB_NP_ALLOCATION_TAG);
 
     AFSExFreePoolWithTag( Ccb, AFS_CCB_ALLOCATION_TAG);
-
-    return ntStatus;
 }
 
 NTSTATUS