Windows: Do not prime the service directory cache
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSDirControl.cpp
index 1c5a8cc..b62a0bd 100644 (file)
@@ -141,6 +141,7 @@ AFSQueryDirectory( IN PIRP Irp)
     ULONG ulBytesConverted;
     AFSDirectoryCB *pDirEntry = NULL;
     BOOLEAN bReleaseMain = FALSE;
+    BOOLEAN bReleaseFcb = FALSE;
     ULONG ulTargetFileType = AFS_FILE_TYPE_UNKNOWN;
     AFSFileInfoCB       stFileInfo;
     BOOLEAN         bUseFileInfo = TRUE;
@@ -221,27 +222,7 @@ AFSQueryDirectory( IN PIRP Irp)
             AFSAcquireExcl( &pFcb->NPFcb->Resource,
                             TRUE);
 
-            //
-            // Tell the service to prime the cache of the directory content
-            //
-
-            ntStatus = AFSEnumerateDirectoryNoResponse( &pFcb->AuthGroup,
-                                                        &pFcb->ObjectInformation->FileId);
-
-            if( !NT_SUCCESS( ntStatus))
-            {
-
-                AFSReleaseResource( &pFcb->NPFcb->Resource);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSQueryDirectory Enumerate directory failure for parent %wZ Mask %wZ Status %08lX\n",
-                              &pCcb->DirectoryCB->NameInformation.FileName,
-                              &pCcb->MaskName,
-                              ntStatus);
-
-                try_return( ntStatus);
-            }
+            bReleaseFcb = TRUE;
         }
         else
         {
@@ -259,6 +240,8 @@ AFSQueryDirectory( IN PIRP Irp)
 
             AFSAcquireShared( &pFcb->NPFcb->Resource,
                               TRUE);
+
+            bReleaseFcb = TRUE;
         }
 
         //
@@ -287,7 +270,7 @@ AFSQueryDirectory( IN PIRP Irp)
                           pFcb->ObjectInformation->FileId.Vnode,
                           pFcb->ObjectInformation->FileId.Unique);
 
-            ntStatus = AFSVerifyEntry( &pFcb->AuthGroup,
+            ntStatus = AFSVerifyEntry( &pCcb->AuthGroup,
                                        pCcb->DirectoryCB);
 
             if( !NT_SUCCESS( ntStatus))
@@ -336,6 +319,8 @@ AFSQueryDirectory( IN PIRP Irp)
 
         AFSReleaseResource( &pFcb->NPFcb->Resource);
 
+        bReleaseFcb = FALSE;
+
         //
         // Start processing the data
         //
@@ -737,7 +722,7 @@ AFSQueryDirectory( IN PIRP Irp)
             //
 
             AFSValidateEntry( pDirEntry,
-                              &pFcb->AuthGroup,
+                              &pCcb->AuthGroup,
                               FALSE,
                               FALSE);
 
@@ -763,9 +748,12 @@ AFSQueryDirectory( IN PIRP Irp)
                                                            pDirEntry,
                                                            &pCcb->FullFileName,
                                                            pCcb->NameArray,
+                                                           &pCcb->AuthGroup,
                                                            &stFileInfo)))
                 {
 
+                    ulAdditionalAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+
                     bUseFileInfo = TRUE;
                 }
             }
@@ -851,7 +839,7 @@ AFSQueryDirectory( IN PIRP Irp)
                         pDirInfo->EndOfFile = stFileInfo.EndOfFile;
                         pDirInfo->AllocationSize = stFileInfo.AllocationSize;
 
-                        pDirInfo->FileAttributes = stFileInfo.FileAttributes;
+                        pDirInfo->FileAttributes = stFileInfo.FileAttributes | ulAdditionalAttributes;
                     }
                     else if( BooleanFlagOn( pDirEntry->Flags, AFS_DIR_ENTRY_FAKE))
                     {
@@ -971,6 +959,12 @@ try_exit:
             AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
 
+        if ( bReleaseFcb)
+        {
+
+            AFSReleaseResource( &pFcb->NPFcb->Resource);
+        }
+
         if( pFcb != NULL)
         {
 
@@ -1110,6 +1104,11 @@ AFSLocateNextDirEntry( IN AFSObjectInfoCB *ObjectInfo,
 
                 pDirEntry = ObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
 
+                if( pDirEntry != NULL)
+                {
+                    InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+                }
+
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSLocateNextDirEntry Returning PIOctl entry %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
@@ -1136,6 +1135,11 @@ AFSLocateNextDirEntry( IN AFSObjectInfoCB *ObjectInfo,
 
             pDirEntry = AFSGlobalDotDirEntry;
 
+            if( pDirEntry != NULL)
+            {
+                InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+            }
+
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSLocateNextDirEntry Returning1 snapshot entry %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
@@ -1154,6 +1158,11 @@ AFSLocateNextDirEntry( IN AFSObjectInfoCB *ObjectInfo,
 
             pDirEntry = AFSGlobalDotDotDirEntry;
 
+            if( pDirEntry != NULL)
+            {
+                InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+            }
+
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSLocateNextDirEntry Returning2 snapshot entry %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",