Windows: Replace ParentObjectInformation pointer
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFcbSupport.cpp
index 1e09d83..5630ba5 100644 (file)
@@ -47,7 +47,7 @@
 //
 // Return:
 //
-//      A status is returned for the function
+//      Return Fcb->NPFcb->Resource held exclusive
 //
 
 NTSTATUS
@@ -55,14 +55,10 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSFcb *pFcb = NULL;
     AFSNonPagedFcb *pNPFcb = NULL;
-    IO_STATUS_BLOCK stIoSb = {0,0};
     USHORT  usFcbLength = 0;
-    ULONGLONG   ullIndex = 0;
-    AFSDirEnumEntry *pDirEnumCB = NULL;
-    AFSObjectInfoCB *pObjectInfo = NULL, *pParentObjectInfo = NULL;
+    AFSObjectInfoCB *pObjectInfo = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
 
     __Enter
@@ -70,7 +66,14 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 
         pObjectInfo = DirEntry->ObjectInformation;
 
-        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
+        if ( pObjectInfo->Fcb != NULL)
+        {
+
+            AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+                            TRUE);
+
+            try_return( ntStatus = STATUS_SUCCESS);
+        }
 
         pVolumeCB = pObjectInfo->VolumeCB;
 
@@ -145,6 +148,8 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 
         ExInitializeResourceLite( &pNPFcb->PagingResource);
 
+        ExInitializeResourceLite( &pNPFcb->SectionObjectResource);
+
         ExInitializeResourceLite( &pNPFcb->CcbListLock);
 
         pFcb->Header.Resource = &pNPFcb->Resource;
@@ -157,7 +162,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());
 
@@ -260,8 +265,13 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
             pFcb->Header.NodeTypeCode = AFS_INVALID_FCB;
         }
 
+        pFcb->ObjectInformation = pObjectInfo;
+
+        AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+                          TRUE);
         //
-        // Initialize some fields in the Fcb
+        // Swap the allocated FCB into the ObjectInformation structure if it
+        // does not already have one.
         //
 
         if ( InterlockedCompareExchangePointer( (PVOID *)&pObjectInfo->Fcb, pFcb, NULL) != NULL)
@@ -269,28 +279,30 @@ 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());
 
+            AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
             AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
                             TRUE);
 
             try_return( ntStatus = STATUS_REPARSE);
         }
 
-        pFcb->ObjectInformation = pObjectInfo;
+        AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
 
         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);
 
@@ -328,6 +340,8 @@ try_exit:
                         ExDeleteResourceLite( &pNPFcb->Specific.File.DirtyExtentsListLock);
                     }
 
+                    ExDeleteResourceLite( &pNPFcb->SectionObjectResource);
+
                     ExDeleteResourceLite( &pNPFcb->PagingResource);
 
                     ExDeleteResourceLite( &pNPFcb->CcbListLock);
@@ -352,14 +366,13 @@ AFSInitVolume( IN GUID *AuthGroup,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    IO_STATUS_BLOCK stIoStatus = {0,0};
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSNonPagedVolumeCB *pNonPagedVcb = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
     AFSNonPagedObjectInfoCB *pNonPagedObject = NULL;
     ULONGLONG ullIndex = 0;
     BOOLEAN bReleaseLocks = FALSE;
-    AFSVolumeInfoCB stVolumeInformation;
+    AFSVolumeInfoCB stVolumeInformation = {0};
     AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
     LONG lCount;
 
@@ -421,6 +434,12 @@ AFSInitVolume( IN GUID *AuthGroup,
 
                 lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
 
+                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitVolume Increment count on volume %p Cnt %d\n",
+                              pVolumeCB,
+                              lCount);
+
                 AFSReleaseResource( pDeviceExt->Specific.RDR.VolumeTree.TreeLock);
 
                 AFSReleaseResource( &pDeviceExt->Specific.RDR.VolumeListLock);
@@ -447,7 +466,7 @@ AFSInitVolume( IN GUID *AuthGroup,
         // into the volume tree ...
         //
 
-        pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( NonPagedPool,
+        pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( PagedPool,
                                                              sizeof( AFSVolumeCB),
                                                              AFS_VCB_ALLOCATION_TAG);
 
@@ -506,6 +525,8 @@ AFSInitVolume( IN GUID *AuthGroup,
         RtlZeroMemory( pNonPagedObject,
                        sizeof( AFSNonPagedObjectInfoCB));
 
+        ExInitializeResourceLite( &pNonPagedObject->ObjectInfoLock);
+
         ExInitializeResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
 
         pVolumeCB->NonPagedVcb = pNonPagedVcb;
@@ -524,7 +545,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;
@@ -542,6 +563,11 @@ AFSInitVolume( IN GUID *AuthGroup,
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSInitVolume AFS_DIR_ENTRY_TAG allocated %p\n",
+                      pVolumeCB->DirectoryCB);
+
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
                                                                                 sizeof( AFSNonPagedDirectoryCB),
                                                                                 AFS_DIR_ENTRY_NP_TAG);
@@ -673,7 +699,7 @@ try_exit:
             if( pNonPagedObject != NULL)
             {
 
-                ExDeleteResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
+                ExDeleteResourceLite( &pNonPagedObject->ObjectInfoLock);
 
                 AFSExFreePoolWithTag( pNonPagedObject, AFS_NP_OBJECT_INFO_TAG);
             }
@@ -684,6 +710,11 @@ try_exit:
                 if( pVolumeCB->DirectoryCB != NULL)
                 {
 
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSInitVolume AFS_DIR_ENTRY_TAG deallocating %p\n",
+                                  pVolumeCB->DirectoryCB);
+
                     AFSExFreePoolWithTag( pVolumeCB->DirectoryCB, AFS_DIR_ENTRY_TAG);
                 }
 
@@ -781,7 +812,12 @@ AFSRemoveVolume( IN AFSVolumeCB *VolumeCB)
             if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
             {
 
+                AFSAcquireExcl( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+                                TRUE);
+
                 AFSRemoveFcb( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+
+                AFSReleaseResource( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
             }
 
             AFSDeleteObjectInfo( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
@@ -790,6 +826,11 @@ AFSRemoveVolume( IN AFSVolumeCB *VolumeCB)
 
             AFSExFreePoolWithTag( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
 
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSRemoveVolume (pioctl) AFS_DIR_ENTRY_TAG deallocating %p\n",
+                          VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB);
+
             AFSExFreePoolWithTag( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG);
         }
 
@@ -825,6 +866,8 @@ AFSRemoveVolume( IN AFSVolumeCB *VolumeCB)
         if( VolumeCB->ObjectInformation.NonPagedInfo != NULL)
         {
 
+            ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock);
+
             ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->DirectoryNodeHdrLock);
 
             AFSExFreePoolWithTag( VolumeCB->ObjectInformation.NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
@@ -841,6 +884,11 @@ AFSRemoveVolume( IN AFSVolumeCB *VolumeCB)
                 AFSExFreePoolWithTag( VolumeCB->DirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
             }
 
+            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSRemoveVolume AFS_DIR_ENTRY_TAG deallocating %p\n",
+                          VolumeCB->DirectoryCB);
+
             AFSExFreePoolWithTag( VolumeCB->DirectoryCB, AFS_DIR_ENTRY_TAG);
         }
 
@@ -868,11 +916,10 @@ AFSInitRootFcb( IN ULONGLONG ProcessID,
                 IN AFSVolumeCB *VolumeCB)
 {
 
+    UNREFERENCED_PARAMETER(ProcessID);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSFcb *pFcb = NULL;
     AFSNonPagedFcb *pNPFcb = NULL;
-    IO_STATUS_BLOCK stIoStatus = {0,0};
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
 
     __Enter
     {
@@ -933,7 +980,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());
 
@@ -994,9 +1041,6 @@ void
 AFSRemoveRootFcb( IN AFSFcb *RootFcb)
 {
 
-    AFSDirectoryCB *pCurrentDirEntry = NULL;
-    AFSVolumeCB *pVolumeCB = RootFcb->ObjectInformation->VolumeCB;
-
     if( RootFcb->NPFcb != NULL)
     {
 
@@ -1058,7 +1102,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)
@@ -1095,6 +1139,8 @@ AFSRemoveFcb( IN AFSFcb **ppFcb)
 
     ExDeleteResourceLite( &pFcb->NPFcb->PagingResource);
 
+    ExDeleteResourceLite( &pFcb->NPFcb->SectionObjectResource);
+
     ExDeleteResourceLite( &pFcb->NPFcb->CcbListLock);
 
     //
@@ -1113,11 +1159,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
     {
@@ -1163,6 +1213,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
         //
@@ -1202,15 +1268,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);
@@ -1293,6 +1359,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);
 
     //
@@ -1304,8 +1386,6 @@ AFSRemoveCcb( IN AFSFcb *Fcb,
     AFSExFreePoolWithTag( Ccb->NPCcb, AFS_CCB_NP_ALLOCATION_TAG);
 
     AFSExFreePoolWithTag( Ccb, AFS_CCB_ALLOCATION_TAG);
-
-    return ntStatus;
 }
 
 NTSTATUS