Windows: Add CCB NonPaged Resource for synchronization
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFcbSupport.cpp
index 0ea85fa..e9add10 100644 (file)
@@ -59,7 +59,6 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
     AFSFcb *pFcb = NULL;
     AFSNonPagedFcb *pNPFcb = NULL;
     IO_STATUS_BLOCK stIoSb = {0,0};
-    BOOLEAN bUninitFileLock = FALSE;
     USHORT  usFcbLength = 0;
     ULONGLONG   ullIndex = 0;
     AFSDirEnumEntry *pDirEnumCB = NULL;
@@ -179,14 +178,6 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
             //
 
             pFcb->Header.NodeTypeCode = AFS_DIRECTORY_FCB;
-
-            //
-            // Initialize enumeration information
-            //
-
-            KeInitializeEvent( &pFcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
-                               NotificationEvent,
-                               FALSE);
         }
         else if( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
         {
@@ -201,8 +192,6 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
                                      NULL,
                                      NULL);
 
-            bUninitFileLock = TRUE;
-
             //
             // Initialize the header file sizes to our dir entry information
             //
@@ -322,32 +311,34 @@ try_exit:
             if( pFcb != NULL)
             {
 
-                if( bUninitFileLock)
-                {
-
-                    FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
-                }
-
                 if( pNPFcb != NULL)
                 {
 
                     AFSReleaseResource( &pNPFcb->Resource);
 
+                    FsRtlTeardownPerStreamContexts( &pFcb->Header);
+
+                    if ( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
+                    {
+
+                        FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
+
+                        ExDeleteResourceLite( &pNPFcb->Specific.File.ExtentsResource);
+
+                        ExDeleteResourceLite( &pNPFcb->Specific.File.DirtyExtentsListLock);
+                    }
+
                     ExDeleteResourceLite( &pNPFcb->PagingResource);
 
                     ExDeleteResourceLite( &pNPFcb->CcbListLock);
 
                     ExDeleteResourceLite( &pNPFcb->Resource);
+
+                    AFSExFreePool( pNPFcb);
                 }
 
                 AFSExFreePool( pFcb);
             }
-
-            if( pNPFcb != NULL)
-            {
-
-                AFSExFreePool( pNPFcb);
-            }
         }
     }
 
@@ -439,8 +430,6 @@ AFSInitVolume( IN GUID *AuthGroup,
                 AFSAcquireExcl( pVolumeCB->VolumeLock,
                                 TRUE);
 
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
                 *VolumeCB = pVolumeCB;
 
                 try_return( ntStatus);
@@ -535,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);
@@ -792,7 +781,7 @@ AFSRemoveVolume( IN AFSVolumeCB *VolumeCB)
             if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
             {
 
-                AFSRemoveFcb( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+                AFSRemoveFcb( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
             }
 
             AFSDeleteObjectInfo( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
@@ -958,14 +947,6 @@ AFSInitRootFcb( IN ULONGLONG ProcessID,
         pFcb->NPFcb = pNPFcb;
 
         //
-        // Initialize enumeration information
-        //
-
-        KeInitializeEvent( &pFcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
-                           NotificationEvent,
-                           FALSE);
-
-        //
         // Save the root Fcb in the VolumeCB
         //
 
@@ -1054,9 +1035,19 @@ AFSRemoveRootFcb( IN AFSFcb *RootFcb)
 //
 
 void
-AFSRemoveFcb( IN AFSFcb *Fcb)
+AFSRemoveFcb( IN AFSFcb **ppFcb)
 {
 
+    AFSFcb * pFcb;
+
+    pFcb = (AFSFcb *) InterlockedCompareExchangePointer( (PVOID *)ppFcb, NULL, (PVOID)(*ppFcb));
+
+    if ( pFcb == NULL)
+    {
+
+        return;
+    }
+
     //
     // Uninitialize the file lock if it is a file
     //
@@ -1064,23 +1055,23 @@ AFSRemoveFcb( IN AFSFcb *Fcb)
     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSRemoveFcb Removing Fcb %08lX\n",
-                  Fcb);
+                  pFcb);
 
-    if( Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
+    if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
     {
 
-        FsRtlUninitializeFileLock( &Fcb->Specific.File.FileLock);
+        FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
 
         //
         // The resource we allocated
         //
 
-        ExDeleteResourceLite( &Fcb->NPFcb->Specific.File.ExtentsResource );
+        ExDeleteResourceLite( &pFcb->NPFcb->Specific.File.ExtentsResource );
 
-        ExDeleteResourceLite( &Fcb->NPFcb->Specific.File.DirtyExtentsListLock);
+        ExDeleteResourceLite( &pFcb->NPFcb->Specific.File.DirtyExtentsListLock);
 
     }
-    else if( Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
+    else if( pFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
     {
 
 
@@ -1090,29 +1081,29 @@ AFSRemoveFcb( IN AFSFcb *Fcb)
     // Tear down the FM specific contexts
     //
 
-    FsRtlTeardownPerStreamContexts( &Fcb->Header);
+    FsRtlTeardownPerStreamContexts( &pFcb->Header);
 
     //
     // Delete the resources
     //
 
-    ExDeleteResourceLite( &Fcb->NPFcb->Resource);
+    ExDeleteResourceLite( &pFcb->NPFcb->Resource);
 
-    ExDeleteResourceLite( &Fcb->NPFcb->PagingResource);
+    ExDeleteResourceLite( &pFcb->NPFcb->PagingResource);
 
-    ExDeleteResourceLite( &Fcb->NPFcb->CcbListLock);
+    ExDeleteResourceLite( &pFcb->NPFcb->CcbListLock);
 
     //
     // The non paged region
     //
 
-    AFSExFreePool( Fcb->NPFcb);
+    AFSExFreePool( pFcb->NPFcb);
 
     //
     // And the Fcb itself, which includes the name
     //
 
-    AFSExFreePool( Fcb);
+    AFSExFreePool( pFcb);
 
     return;
 }
@@ -1149,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
         //
@@ -1165,6 +1173,12 @@ try_exit:
             if( pCcb != NULL)
             {
 
+                if ( pCcb->NPCcb != NULL)
+                {
+
+                    AFSExFreePool( pCcb->NPCcb);
+                }
+
                 AFSExFreePool( pCcb);
             }
 
@@ -1194,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))
     {
@@ -1272,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;
@@ -1291,6 +1314,9 @@ AFSInsertCcb( IN AFSFcb *Fcb,
     AFSAcquireExcl( &Fcb->NPFcb->CcbListLock,
                     TRUE);
 
+    AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+                    TRUE);
+
     if( Fcb->CcbListHead == NULL)
     {
         Fcb->CcbListHead = Ccb;
@@ -1306,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;