Windows: Fix AFSSetBasicInfo attribute processing
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFileInfo.cpp
index 04ec928..43e895b 100644 (file)
@@ -80,10 +80,10 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         if( pFcb == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSQueryFileInfo Attempted access (%p) when pFcb == NULL\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
@@ -103,11 +103,20 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
                                      &stAuthGroup);
 
             ntStatus = AFSVerifyEntry( &stAuthGroup,
-                                       pCcb->DirectoryCB);
+                                      pCcb->DirectoryCB,
+                                      FALSE);
 
             if ( NT_SUCCESS( ntStatus))
             {
 
+               AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSQueryFileInfo FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                             pFcb->ObjectInformation->FileId.Cell,
+                             pFcb->ObjectInformation->FileId.Volume,
+                             pFcb->ObjectInformation->FileId.Vnode,
+                             pFcb->ObjectInformation->FileId.Unique));
+
                 ClearFlag( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
             }
             else
@@ -121,11 +130,11 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         // Grab the main shared right off the bat
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSQueryFileInfo Acquiring Fcb lock %p SHARED %08lX\n",
                       &pFcb->NPFcb->Resource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireShared( &pFcb->NPFcb->Resource,
                           TRUE);
@@ -139,9 +148,9 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSQueryFileInfo Processing request against SpecialShare Fcb\n");
+                          "AFSQueryFileInfo Processing request against SpecialShare Fcb\n"));
 
             ntStatus = AFSProcessShareQueryInfo( Irp,
                                                  pFcb,
@@ -151,9 +160,9 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         }
         else if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
         {
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSQueryFileInfo request against PIOCtl Fcb\n");
+                          "AFSQueryFileInfo request against PIOCtl Fcb\n"));
 
             ntStatus = AFSProcessPIOCtlQueryInfo( Irp,
                                                   pFcb,
@@ -165,9 +174,9 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
 
         else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
         {
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSQueryFileInfo request against Invalid Fcb\n");
+                          "AFSQueryFileInfo request against Invalid Fcb\n"));
 
             try_return( ntStatus = STATUS_ACCESS_DENIED);
         }
@@ -454,24 +463,24 @@ try_exit:
                 pCcb->DirectoryCB != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSQueryFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               &pCcb->DirectoryCB->NameInformation.FileName,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
-                              ntStatus);
+                              pFcb->ObjectInformation->FileId.Cell,
+                              pFcb->ObjectInformation->FileId.Volume,
+                              pFcb->ObjectInformation->FileId.Vnode,
+                              pFcb->ObjectInformation->FileId.Unique,
+                              ntStatus));
             }
         }
     }
     __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
-                      "EXCEPTION - AFSQueryFileInfo\n");
+                      "EXCEPTION - AFSQueryFileInfo\n"));
 
         AFSDumpTraceFilesFnc();
 
@@ -530,10 +539,10 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         if( pFcb == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetFileInfo Attempted access (%p) when pFcb == NULL\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
@@ -545,11 +554,11 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         // Grab the Fcb EXCL
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSetFileInfo Acquiring Fcb lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->Resource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireExcl( &pFcb->NPFcb->Resource,
                         TRUE);
@@ -563,18 +572,18 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetFileInfo Failing request against PIOCtl Fcb\n");
+                          "AFSSetFileInfo Failing request against PIOCtl Fcb\n"));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
         else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetFileInfo Processing request against SpecialShare Fcb\n");
+                          "AFSSetFileInfo Processing request against SpecialShare Fcb\n"));
 
             ntStatus = AFSProcessShareSetInfo( Irp,
                                                pFcb,
@@ -583,13 +592,14 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
             try_return( ntStatus);
         }
 
-        if( BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+       if( FileInformationClass != FilePositionInformation &&
+           BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetFileInfo Request failed due to read only volume\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
@@ -597,9 +607,9 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
             FileInformationClass != FileDispositionInformation)
         {
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetFileInfo request against Invalid Fcb\n");
+                          "AFSSetFileInfo request against Invalid Fcb\n"));
 
             try_return( ntStatus = STATUS_ACCESS_DENIED);
         }
@@ -621,9 +631,10 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         RtlZeroMemory( &stParentFileId,
                        sizeof( AFSFileID));
 
-        if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
-            stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+
+            stParentFileId = pFcb->ObjectInformation->ParentFileId;
         }
 
         //
@@ -636,10 +647,9 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
             case FileBasicInformation:
             {
 
-                bUpdateFileInfo = TRUE;
-
                 ntStatus = AFSSetBasicInfo( Irp,
-                                            pCcb->DirectoryCB);
+                                           pCcb->DirectoryCB,
+                                           &bUpdateFileInfo);
 
                 break;
             }
@@ -732,15 +742,15 @@ try_exit:
                 AFSUnwindFileInfo( pFcb,
                                    pCcb);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetFileInfo Failed to send file info update to service request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               &pCcb->DirectoryCB->NameInformation.FileName,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
-                              ntStatus);
+                              pFcb->ObjectInformation->FileId.Cell,
+                              pFcb->ObjectInformation->FileId.Volume,
+                              pFcb->ObjectInformation->FileId.Vnode,
+                              pFcb->ObjectInformation->FileId.Unique,
+                              ntStatus));
 
                 AFSReleaseResource( &pFcb->NPFcb->Resource);
             }
@@ -753,24 +763,24 @@ try_exit:
                 pCcb->DirectoryCB != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               &pCcb->DirectoryCB->NameInformation.FileName,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
-                              pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
-                              ntStatus);
+                              pFcb->ObjectInformation->FileId.Cell,
+                              pFcb->ObjectInformation->FileId.Volume,
+                              pFcb->ObjectInformation->FileId.Vnode,
+                              pFcb->ObjectInformation->FileId.Unique,
+                              ntStatus));
             }
         }
     }
     __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
-                      "EXCEPTION - AFSSetFileInfo\n");
+                      "EXCEPTION - AFSSetFileInfo\n"));
 
         AFSDumpTraceFilesFnc();
 
@@ -845,6 +855,22 @@ AFSQueryBasicInfo( IN PIRP Irp,
 
             AFSReleaseResource( &pFcb->NPFcb->Resource);
 
+            //
+            // Its a reparse point regardless of whether the file attributes
+            // can be retrieved for the target.
+            //
+
+            if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+
             if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
                                                        DirectoryCB,
                                                        &uniParentPath,
@@ -853,17 +879,6 @@ AFSQueryBasicInfo( IN PIRP Irp,
                                                        &stFileInfo)))
             {
 
-                if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
-                {
-
-                    ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-                else
-                {
-
-                    ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-
                 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                 {
 
@@ -876,13 +891,13 @@ AFSQueryBasicInfo( IN PIRP Irp,
         }
 
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
                       &pCcb->DirectoryCB->NameInformation.FileName,
-                      pCcb->DirectoryCB->ObjectInformation->FileType,
-                      pCcb->DirectoryCB->ObjectInformation->FileAttributes,
-                      ulFileAttribs);
+                      pFcb->ObjectInformation->FileType,
+                      pFcb->ObjectInformation->FileAttributes,
+                      ulFileAttribs));
 
         Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
         Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
@@ -966,6 +981,22 @@ AFSQueryStandardInfo( IN PIRP Irp,
 
             AFSReleaseResource( &pFcb->NPFcb->Resource);
 
+            //
+            // Its a reparse point regardless of whether or not the
+            // file attributes can be retrieved.
+            //
+
+            if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+
             if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
                                                        DirectoryCB,
                                                        &uniParentPath,
@@ -974,17 +1005,6 @@ AFSQueryStandardInfo( IN PIRP Irp,
                                                        &stFileInfo)))
             {
 
-                if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
-                {
-
-                    ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-                else
-                {
-
-                    ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-
                 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                 {
 
@@ -996,13 +1016,13 @@ AFSQueryStandardInfo( IN PIRP Irp,
                               TRUE);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
                       &pCcb->DirectoryCB->NameInformation.FileName,
-                      pCcb->DirectoryCB->ObjectInformation->FileType,
-                      pCcb->DirectoryCB->ObjectInformation->FileAttributes,
-                      ulFileAttribs);
+                      pFcb->ObjectInformation->FileType,
+                      pFcb->ObjectInformation->FileAttributes,
+                      ulFileAttribs));
 
         Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
 
@@ -1030,9 +1050,9 @@ AFSQueryInternalInfo( IN PIRP Irp,
     if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
     {
 
-        Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Volume;
+        Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Vnode;
 
-        Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Vnode;
+        Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Unique;
 
         *Length -= sizeof( FILE_INTERNAL_INFORMATION);
     }
@@ -1477,6 +1497,22 @@ AFSQueryNetworkInfo( IN PIRP Irp,
 
             AFSReleaseResource( &pFcb->NPFcb->Resource);
 
+            //
+            // Its a reparse point regardless of whether the file attributes
+            // can be retrieved for the target.
+            //
+
+            if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+
             if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
                                                        DirectoryCB,
                                                        &uniParentPath,
@@ -1485,17 +1521,6 @@ AFSQueryNetworkInfo( IN PIRP Irp,
                                                        &stFileInfo)))
             {
 
-                if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
-                {
-
-                    ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-                else
-                {
-
-                    ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-
                 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                 {
 
@@ -1507,13 +1532,13 @@ AFSQueryNetworkInfo( IN PIRP Irp,
                               TRUE);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
                       &pCcb->DirectoryCB->NameInformation.FileName,
-                      pCcb->DirectoryCB->ObjectInformation->FileType,
-                      pCcb->DirectoryCB->ObjectInformation->FileAttributes,
-                      ulFileAttribs);
+                      pFcb->ObjectInformation->FileType,
+                      pFcb->ObjectInformation->FileAttributes,
+                      ulFileAttribs));
 
         Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
         Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
@@ -1667,6 +1692,22 @@ AFSQueryAttribTagInfo( IN PIRP Irp,
 
             AFSReleaseResource( &pFcb->NPFcb->Resource);
 
+            //
+            // Its a reparse point regardless of whether the file attributes
+            // can be retrieved for the target.
+            //
+
+            if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+
             if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
                                                        DirectoryCB,
                                                        &uniParentPath,
@@ -1675,17 +1716,6 @@ AFSQueryAttribTagInfo( IN PIRP Irp,
                                                        &stFileInfo)))
             {
 
-                if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
-                {
-
-                    ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-                else
-                {
-
-                    ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
-                }
-
                 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                 {
 
@@ -1697,13 +1727,13 @@ AFSQueryAttribTagInfo( IN PIRP Irp,
                               TRUE);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
                       &pCcb->DirectoryCB->NameInformation.FileName,
-                      pCcb->DirectoryCB->ObjectInformation->FileType,
-                      pCcb->DirectoryCB->ObjectInformation->FileAttributes,
-                      ulFileAttribs);
+                      pFcb->ObjectInformation->FileType,
+                      pFcb->ObjectInformation->FileAttributes,
+                      ulFileAttribs));
 
         Buffer->FileAttributes = ulFileAttribs;
 
@@ -1723,10 +1753,16 @@ AFSQueryAttribTagInfo( IN PIRP Irp,
             }
         }
 
-        if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
+        if ( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_MOUNTPOINT)
         {
+
             Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
         }
+        else if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
+        {
+
+            Buffer->ReparseTag = IO_REPARSE_TAG_SYMLINK;
+        }
 
         *Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
 
@@ -1875,7 +1911,8 @@ AFSQueryPhysicalNameInfo( IN PIRP Irp,
 
 NTSTATUS
 AFSSetBasicInfo( IN PIRP Irp,
-                 IN AFSDirectoryCB *DirectoryCB)
+                IN AFSDirectoryCB *DirectoryCB,
+                OUT BOOLEAN *bUpdateFileInfo)
 {
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_BASIC_INFORMATION pBuffer;
@@ -1895,26 +1932,92 @@ AFSSetBasicInfo( IN PIRP Irp,
         if( pBuffer->FileAttributes != (ULONGLONG)0)
         {
 
-            if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_FILE_FCB &&
-                BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
-            {
+           //
+           // Make sure that the reparse point attribute is not modified.
+           // Fail if the RP attribute is requested but it is not
+           // already a RP.  Otherwise, ignore it.
+           //
 
-                try_return( ntStatus = STATUS_INVALID_PARAMETER);
-            }
+           if ( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+                                FILE_ATTRIBUTE_REPARSE_POINT) &&
+                BooleanFlagOn( pBuffer->FileAttributes,
+                               FILE_ATTRIBUTE_REPARSE_POINT))
+           {
 
-            if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
-            {
+               try_return( ntStatus = STATUS_INVALID_PARAMETER);
+           }
 
-                pBuffer->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
-            }
+           //
+           // Make sure that the directory attribute is not modified.
+           // Fail if the D attribute is requested but it is not
+           // already a directory.  Otherwise, ignore it.
+           //
+
+           if ( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+                                FILE_ATTRIBUTE_DIRECTORY) &&
+                BooleanFlagOn( pBuffer->FileAttributes,
+                               FILE_ATTRIBUTE_DIRECTORY))
+           {
+
+               try_return( ntStatus = STATUS_INVALID_PARAMETER);
+           }
+
+           //
+           // Save the original value
+           //
+
+           pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
+
+           if( BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_READONLY))
+           {
+
+               //
+               // Set the readonly flag.
+               //
+
+               if ( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+                                    FILE_ATTRIBUTE_READONLY))
+               {
+
+                   if ( DirectoryCB->ObjectInformation->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+                   {
+
+                       DirectoryCB->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_READONLY;
+                   }
+                   else
+                   {
+
+                       DirectoryCB->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_READONLY;
+                   }
+
+                   ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+
+                   SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+               }
+           }
+           else
+           {
+               //
+               // Reset the readonly flag.
+               //
+
+               if ( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes,
+                                   FILE_ATTRIBUTE_READONLY))
+               {
 
-            pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
+                   DirectoryCB->ObjectInformation->FileAttributes &= ~FILE_ATTRIBUTE_READONLY;
 
-            DirectoryCB->ObjectInformation->FileAttributes = pBuffer->FileAttributes;
+                   if ( DirectoryCB->ObjectInformation->FileAttributes == 0)
+                   {
 
-            ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+                       DirectoryCB->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_NORMAL;
+                   }
 
-            SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+                   ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+
+                   SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+               }
+           }
         }
 
         pCcb->FileUnwindInfo.CreationTime.QuadPart = (ULONGLONG)-1;
@@ -1980,13 +2083,24 @@ AFSSetBasicInfo( IN PIRP Irp,
         if( ulNotifyFilter > 0)
         {
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
+           *bUpdateFileInfo = TRUE;
+
+            if( BooleanFlagOn( DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
             {
 
-                AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
-                                                pCcb,
-                                                (ULONG)ulNotifyFilter,
-                                                (ULONG)FILE_ACTION_MODIFIED);
+                AFSObjectInfoCB * pParentObjectInfo = AFSFindObjectInfo( DirectoryCB->ObjectInformation->VolumeCB,
+                                                                         &DirectoryCB->ObjectInformation->ParentFileId,
+                                                                         TRUE);
+
+                if ( pParentObjectInfo != NULL)
+                {
+                    AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                    pCcb,
+                                                    (ULONG)ulNotifyFilter,
+                                                    (ULONG)FILE_ACTION_MODIFIED);
+
+                    AFSReleaseObjectInfo( &pParentObjectInfo);
+                }
             }
         }
 
@@ -2024,9 +2138,9 @@ AFSSetDispositionInfo( IN PIRP Irp,
         if( pFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetDispositionInfo Attempt to delete root entry\n");
+                          "AFSSetDispositionInfo Attempt to delete root entry\n"));
 
             try_return( ntStatus = STATUS_CANNOT_DELETE);
         }
@@ -2038,10 +2152,10 @@ AFSSetDispositionInfo( IN PIRP Irp,
         if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_READONLY))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetDispositionInfo Attempt to delete read only entry %wZ\n",
-                          &DirectoryCB->NameInformation.FileName);
+                          &DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_CANNOT_DELETE);
         }
@@ -2060,11 +2174,11 @@ AFSSetDispositionInfo( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetDispositionInfo Cannot delete entry %wZ Status %08lX\n",
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2086,31 +2200,77 @@ AFSSetDispositionInfo( IN PIRP Irp,
                 if( pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSSetDispositionInfo Attempt to delete directory %wZ with open %u handles\n",
                                   &DirectoryCB->NameInformation.FileName,
-                                  pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount);
+                                  pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount));
 
                     try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
                 }
 
+                //
+                // Make sure the directory is enumerated before checking to see if it is empty.
+                //
+
+                if( !BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
+                {
+
+                    AFSAcquireExcl( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                    TRUE);
+
+                    if( !BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
+                    {
+
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_VERBOSE,
+                                      "AFSSetDispositionInfo Enumerating parent FID %08lX-%08lX-%08lX-%08lX\n",
+                                      pFcb->ObjectInformation->FileId.Cell,
+                                      pFcb->ObjectInformation->FileId.Volume,
+                                      pFcb->ObjectInformation->FileId.Vnode,
+                                      pFcb->ObjectInformation->FileId.Unique));
+
+                        ntStatus = AFSEnumerateDirectory( &pCcb->AuthGroup,
+                                                          pFcb->ObjectInformation,
+                                                          TRUE);
+
+                        if( !NT_SUCCESS( ntStatus))
+                        {
+
+                            AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_ERROR,
+                                          "AFSSetDispositionInfo Failed to enumerate parent FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          pFcb->ObjectInformation->FileId.Cell,
+                                          pFcb->ObjectInformation->FileId.Volume,
+                                          pFcb->ObjectInformation->FileId.Vnode,
+                                          pFcb->ObjectInformation->FileId.Unique,
+                                          ntStatus));
+
+                            try_return( ntStatus);
+                        }
+                    }
+
+                    AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                }
+
                 if( !AFSIsDirectoryEmptyForDelete( pFcb))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
-                                  &DirectoryCB->NameInformation.FileName);
+                                  &DirectoryCB->NameInformation.FileName));
 
                     try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry  %p Name %wZ\n",
                               DirectoryCB,
-                              &DirectoryCB->NameInformation.FileName);
+                              &DirectoryCB->NameInformation.FileName));
 
                 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
             }
@@ -2118,76 +2278,127 @@ AFSSetDispositionInfo( IN PIRP Irp,
             {
                 BOOLEAN bMmFlushed;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSSetDispositionInfo Acquiring Fcb lock %p EXCL %08lX\n",
+                             &pFcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               AFSAcquireExcl( &pFcb->NPFcb->Resource,
+                               TRUE);
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
                                 TRUE);
 
-                //
-                // Attempt to flush any outstanding data
-                //
-
-                bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
-                                                  MmFlushForDelete);
-
-                if ( bMmFlushed)
+               __try
                 {
 
                     //
-                    // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
-                    // deadlock with Trend Micro's Enterprise anti-virus product
-                    // which attempts to open the file which is being deleted.
+                   // Attempt to flush any outstanding data
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
-                                  DirectoryCB,
-                                  &DirectoryCB->NameInformation.FileName);
+                   bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
+                                                     MmFlushForDelete);
 
-                    SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+                   if ( bMmFlushed)
+                   {
 
-                    //
-                    // Purge the cache as well
-                    //
+                       //
+                       // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
+                       // deadlock with Trend Micro's Enterprise anti-virus product
+                       // which attempts to open the file which is being deleted.
+                       //
 
-                    if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
-                    {
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
+                                     DirectoryCB,
+                                     &DirectoryCB->NameInformation.FileName));
 
-                        if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
-                                                   NULL,
-                                                   0,
-                                                   TRUE))
+                       SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+
+                       //
+                       // Purge the cache as well
+                       //
+
+                       if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
                         {
 
-                            SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+                           if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
+                                                      NULL,
+                                                      0,
+                                                      TRUE))
+                           {
+
+                               SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+                           }
                         }
                     }
                 }
+               __except( EXCEPTION_EXECUTE_HANDLER)
+               {
+
+                   bMmFlushed = FALSE;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSSetDispositionInfo MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pFcb->ObjectInformation->FileId.Cell,
+                                 pFcb->ObjectInformation->FileId.Volume,
+                                 pFcb->ObjectInformation->FileId.Vnode,
+                                 pFcb->ObjectInformation->FileId.Unique,
+                                 ntStatus));
+               }
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetDispositionInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSSetDispositionInfo Releasing Fcb lock %p EXCL %08lX\n",
+                             &pFcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               AFSReleaseResource( &pFcb->NPFcb->Resource);
+
                 if ( !bMmFlushed)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
-                                  &DirectoryCB->NameInformation.FileName);
+                                  &DirectoryCB->NameInformation.FileName));
 
                     try_return( ntStatus = STATUS_CANNOT_DELETE);
                 }
             }
+            else if( pFcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
+                     pFcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
+                     pFcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+                     pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
+            {
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
+                              DirectoryCB,
+                              &DirectoryCB->NameInformation.FileName));
+
+                SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+            }
         }
         else
         {
@@ -2243,7 +2454,26 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
 
         pSrcObject = pSrcFcb->ObjectInformation;
-        pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+        if ( BooleanFlagOn( pSrcObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pSrcParentObject = AFSFindObjectInfo( pSrcObject->VolumeCB,
+                                                  &pSrcObject->ParentFileId,
+                                                  TRUE);
+        }
+
+        if( pSrcParentObject == NULL)
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSSetFileLinkInfo Unable to resolve SrcParentObject (INVALID_PARAMETER)\n"));
+
+            ASSERT( FALSE);
+
+            try_return( ntStatus = STATUS_INVALID_PARAMETER);
+        }
 
         pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
 
@@ -2254,9 +2484,9 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         if( pSrcFcb->Header.NodeTypeCode != AFS_FILE_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetFileLinkInfo Attempt to non-file (INVALID_PARAMETER)\n");
+                          "AFSSetFileLinkInfo Attempt to non-file (INVALID_PARAMETER)\n"));
 
             try_return( ntStatus = STATUS_INVALID_PARAMETER);
         }
@@ -2279,10 +2509,10 @@ AFSSetFileLinkInfo( IN PIRP Irp)
                 // error.
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory by handle INVALID_PARAMETER\n",
-                              &pSrcCcb->DirectoryCB->NameInformation.FileName);
+                              &pSrcCcb->DirectoryCB->NameInformation.FileName));
 
                 try_return( ntStatus = STATUS_INVALID_PARAMETER);
             }
@@ -2316,11 +2546,11 @@ AFSSetFileLinkInfo( IN PIRP Irp)
                     // will be moved to.  Must obtain the TargetParentObject.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSSetFileLinkInfo Attempt to link  %wZ to alternate directory %wZ (NOT_SAME_DEVICE)\n",
                                   &pSrcCcb->DirectoryCB->NameInformation.FileName,
-                                  &uniFullTargetName);
+                                  &uniFullTargetName));
 
                     try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
                 }
@@ -2378,10 +2608,10 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetFileLinkInfo Attempt to link to different volume %wZ\n",
-                              &pSrcCcb->DirectoryCB->NameInformation.FileName);
+                              &pSrcCcb->DirectoryCB->NameInformation.FileName));
 
                 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
             }
@@ -2434,38 +2664,39 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         if( pTargetDirEntry != NULL)
         {
 
-            ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
+            ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                    AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
 
             lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetFileLinkInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
                           pSrcCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
 
             if( !pFileLinkInfo->ReplaceIfExists)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetFileLinkInfo Attempt to link with target collision %wZ Target %wZ\n",
                               &pSrcCcb->DirectoryCB->NameInformation.FileName,
-                              &pTargetDirEntry->NameInformation.FileName);
+                              &pTargetDirEntry->NameInformation.FileName));
 
                 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
             }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetFileLinkInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
-                          lCount);
+                          lCount));
 
             //
             // Pull the directory entry from the parent
@@ -2479,9 +2710,9 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         }
         else
         {
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetFileLinkInfo Target does NOT exist, normal linking\n");
+                          "AFSSetFileLinkInfo Target does NOT exist, normal linking\n"));
         }
 
         //
@@ -2489,9 +2720,9 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         // request to the service.
         //
 
-        ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
+        ntStatus = AFSNotifyHardLink( pSrcObject,
                                       &pSrcCcb->AuthGroup,
-                                      pSrcFcb->ObjectInformation->ParentObjectInformation,
+                                      pSrcParentObject,
                                       pTargetDcb->ObjectInformation,
                                       pSrcCcb->DirectoryCB,
                                       &uniTargetName,
@@ -2502,12 +2733,12 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetFileLinkInfo Failed link of %wZ to target %wZ Status %08lX\n",
                           &pSrcCcb->DirectoryCB->NameInformation.FileName,
                           &uniTargetName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2535,7 +2766,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             ulNotificationAction = FILE_ACTION_ADDED;
         }
 
-        AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pTargetParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -2548,7 +2779,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             if( bTargetEntryExists)
             {
 
-                AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+                AFSInsertDirectoryNode( pTargetParentObject,
                                         pTargetDirEntry,
                                         FALSE);
             }
@@ -2563,13 +2794,13 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
             lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetFileLinkInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
                           pSrcCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -2583,13 +2814,13 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
             lCount = InterlockedDecrement( &pNewTargetDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetFileLinkInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pNewTargetDirEntry->NameInformation.FileName,
                           pNewTargetDirEntry,
                           pSrcCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -2599,6 +2830,19 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
             AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
+
+        if ( pSrcParentObject != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pSrcParentObject);
+        }
+
+        //
+        // No need to release pTargetParentObject as it is either a copy of pSrcParentObject
+        // or (AFSFcb *)pTargetFileObj->FsContext->ObjectInformation
+        //
+
+        pTargetParentObject = NULL;
     }
 
     return ntStatus;
@@ -2646,7 +2890,26 @@ AFSSetRenameInfo( IN PIRP Irp)
         pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
 
         pSrcObject = pSrcFcb->ObjectInformation;
-        pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+        if ( BooleanFlagOn( pSrcObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pSrcParentObject = AFSFindObjectInfo( pSrcObject->VolumeCB,
+                                                  &pSrcObject->ParentFileId,
+                                                  TRUE);
+        }
+
+        if( pSrcParentObject == NULL)
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSSetRenameInfo Unable to resolve SrcParentObject (INVALID_PARAMETER)\n"));
+
+            ASSERT( FALSE);
+
+            try_return( ntStatus = STATUS_INVALID_PARAMETER);
+        }
 
         //
         // Perform some basic checks to ensure FS integrity
@@ -2659,9 +2922,9 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Can't rename the root directory
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetRenameInfo Attempt to rename root entry\n");
+                          "AFSSetRenameInfo Attempt to rename root entry\n"));
 
             try_return( ntStatus = STATUS_INVALID_PARAMETER);
         }
@@ -2673,13 +2936,13 @@ AFSSetRenameInfo( IN PIRP Irp)
             // If there are any open children then fail the rename
             //
 
-            if( pSrcFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
+            if( pSrcObject->Specific.Directory.ChildOpenHandleCount > 0)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetRenameInfo Attempt to rename directory with open children %wZ\n",
-                              &pSrcCcb->DirectoryCB->NameInformation.FileName);
+                              &pSrcCcb->DirectoryCB->NameInformation.FileName));
 
                 try_return( ntStatus = STATUS_ACCESS_DENIED);
             }
@@ -2705,9 +2968,9 @@ AFSSetRenameInfo( IN PIRP Irp)
             if ( pRenameInfo->RootDirectory)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n");
+                              "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n"));
 
                 try_return( ntStatus = STATUS_INVALID_PARAMETER);
             }
@@ -2741,11 +3004,11 @@ AFSSetRenameInfo( IN PIRP Irp)
                     // will be moved to.  Must obtain the TargetParentObject.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSSetRenameInfo Attempt to move %wZ to %wZ -- not yet supported (NOT_SAME_DEVICE)\n",
                                   &pSrcCcb->DirectoryCB->NameInformation.FileName,
-                                  &uniFullTargetName);
+                                  &uniFullTargetName));
 
                     try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
                 }
@@ -2806,10 +3069,10 @@ AFSSetRenameInfo( IN PIRP Irp)
         if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetRenameInfo Attempt to rename directory to different volume %wZ\n",
-                          &pSrcCcb->DirectoryCB->NameInformation.FileName);
+                          &pSrcCcb->DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
         }
@@ -2871,38 +3134,39 @@ AFSSetRenameInfo( IN PIRP Irp)
         if( pTargetDirEntry != NULL)
         {
 
-            ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
+            ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                    AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
 
             lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
                           pSrcCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
 
             if( !bReplaceIfExists)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
                               &pSrcCcb->DirectoryCB->NameInformation.FileName,
-                              &pTargetDirEntry->NameInformation.FileName);
+                              &pTargetDirEntry->NameInformation.FileName));
 
                 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
             }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetRenameInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
-                          lCount);
+                          lCount));
 
             //
             // Pull the directory entry from the parent
@@ -2916,9 +3180,9 @@ AFSSetRenameInfo( IN PIRP Irp)
         }
         else
         {
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetRenameInfo Target does NOT exist, normal rename\n");
+                          "AFSSetRenameInfo Target does NOT exist, normal rename\n"));
         }
 
         //
@@ -2927,7 +3191,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // same parent we do not pull the node from the enumeration list
         //
 
-        AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
+        AFSRemoveDirNodeFromParent( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
@@ -2936,9 +3200,9 @@ AFSSetRenameInfo( IN PIRP Irp)
         // request to the service.
         //
 
-        ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
+        ntStatus = AFSNotifyRename( pSrcObject,
                                     &pSrcCcb->AuthGroup,
-                                    pSrcFcb->ObjectInformation->ParentObjectInformation,
+                                    pSrcParentObject,
                                     pTargetDcb->ObjectInformation,
                                     pSrcCcb->DirectoryCB,
                                     &uniTargetName,
@@ -2951,16 +3215,16 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Attempt to re-insert the directory entry
             //
 
-            AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+            AFSInsertDirectoryNode( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetRenameInfo Failed rename of %wZ to target %wZ Status %08lX\n",
                           &pSrcCcb->DirectoryCB->NameInformation.FileName,
                           &uniTargetName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2969,7 +3233,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Set the notification up for the source file
         //
 
-        if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
+        if( pSrcParentObject == pTargetParentObject &&
             !bTargetEntryExists)
         {
 
@@ -2981,7 +3245,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             ulNotificationAction = FILE_ACTION_REMOVED;
         }
 
-        if( pSrcCcb->DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
+        if( pSrcObject->FileType == AFS_FILE_TYPE_DIRECTORY)
         {
 
             ulNotifyFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
@@ -2992,7 +3256,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
         }
 
-        AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pSrcParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -3011,16 +3275,16 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Attempt to re-insert the directory entry
             //
 
-            AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+            AFSInsertDirectoryNode( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSSetRenameInfo Failed update of dir entry %wZ to target %wZ Status %08lX\n",
                           &pSrcCcb->DirectoryCB->NameInformation.FileName,
                           &uniTargetName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3101,11 +3365,11 @@ AFSSetRenameInfo( IN PIRP Irp)
             pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
                                                                                            TRUE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Initialized short name hash for %wZ longname %wZ\n",
                           &uniShortName,
-                          &pSrcCcb->DirectoryCB->NameInformation.FileName);
+                          &pSrcCcb->DirectoryCB->NameInformation.FileName));
         }
         else
         {
@@ -3135,18 +3399,48 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Update the parent pointer in the source object if they are different
         //
 
-        if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
+        if( pSrcParentObject != pTargetParentObject)
         {
 
-            lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+            lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenHandleCount);
 
-            lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+            lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenReferenceCount);
 
             lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
 
             lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
 
-            pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
+
+            //
+            // Guaranteed to be in the same volume
+            //
+
+            AFSAcquireExcl( pSrcParentObject->VolumeCB->ObjectInfoTree.TreeLock,
+                            TRUE);
+
+            lCount = AFSObjectInfoIncrement( pTargetParentObject,
+                                             AFS_OBJECT_REFERENCE_CHILD);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSSetRenameInfo Increment count on parent object %p Cnt %d\n",
+                          pTargetParentObject,
+                          lCount));
+
+            lCount = AFSObjectInfoDecrement( pSrcParentObject,
+                                             AFS_OBJECT_REFERENCE_CHILD);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSSetRenameInfo Decrement count on parent object %p Cnt %d\n",
+                          pSrcParentObject,
+                          lCount));
+
+            pSrcObject->ParentFileId = pTargetParentObject->FileId;
+
+            SetFlag( pSrcObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+            AFSReleaseResource( pSrcParentObject->VolumeCB->ObjectInfoTree.TreeLock);
 
             ulNotificationAction = FILE_ACTION_ADDED;
         }
@@ -3160,7 +3454,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Now update the notification for the target file
         //
 
-        AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pTargetParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -3173,11 +3467,11 @@ AFSSetRenameInfo( IN PIRP Irp)
         if( bTargetEntryExists)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
                           pTargetDirEntry,
-                          &pTargetDirEntry->NameInformation.FileName);
+                          &pTargetDirEntry->NameInformation.FileName));
 
             SetFlag( pTargetDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
 
@@ -3197,27 +3491,28 @@ AFSSetRenameInfo( IN PIRP Irp)
 
             lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
                           pSrcCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
 
-            if( lCount == 0)
+            if( lCount == 0 &&
+                pTargetDirEntry->NameArrayReferenceCount <= 0)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
                               pTargetDirEntry,
-                              &pTargetDirEntry->NameInformation.FileName);
+                              &pTargetDirEntry->NameInformation.FileName));
 
                 AFSDeleteDirEntry( pTargetParentObject,
-                                   pTargetDirEntry);
+                                   &pTargetDirEntry);
             }
 
             pTargetDirEntry = NULL;
@@ -3252,51 +3547,69 @@ AFSSetRenameInfo( IN PIRP Irp)
                 // permit the locks to be obtained out of order risking a deadlock.
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetRenameInfo Acquiring Fcb lock %p EXCL %08lX\n",
                               &pTargetFcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
                                 TRUE);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetRenameInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pTargetFcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pTargetFcb->NPFcb->SectionObjectResource,
                                 TRUE);
 
-                //
-                // Close the section in the event it was mapped
-                //
+               __try
+               {
+
+                   //
+                   // Close the section in the event it was mapped
+                   //
+
+                   if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
+                                              TRUE))
+                   {
 
-                if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
-                                           TRUE))
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_ERROR,
+                                     "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
+                                     &uniTargetName));
+                   }
+               }
+               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
-                                  &uniTargetName);
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSSetRenameInfo MmForceSectionClosed failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pTargetFcb->ObjectInformation->FileId.Cell,
+                                 pTargetFcb->ObjectInformation->FileId.Volume,
+                                 pTargetFcb->ObjectInformation->FileId.Vnode,
+                                 pTargetFcb->ObjectInformation->FileId.Unique,
+                                 ntStatus));
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetRenameInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pTargetFcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &pTargetFcb->NPFcb->SectionObjectResource);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSSetRenameInfo Releasing Fcb lock %p EXCL %08lX\n",
                               &pTargetFcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
             }
@@ -3309,7 +3622,10 @@ try_exit:
 
             if( bTargetEntryExists)
             {
-                AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+
+                ASSERT( pTargetParentObject != NULL);
+
+                AFSInsertDirectoryNode( pTargetParentObject,
                                         pTargetDirEntry,
                                         FALSE);
             }
@@ -3320,13 +3636,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
                           pSrcCcb,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -3342,12 +3658,25 @@ try_exit:
 
             AFSReleaseResource( pSourceDirLock);
         }
-    }
 
-    if ( bDereferenceTargetParentObject)
-    {
+        if ( bDereferenceTargetParentObject)
+        {
+
+            ObDereferenceObject( pTargetParentFileObj);
+        }
+
+        if ( pSrcParentObject != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pSrcParentObject);
+        }
+
+        //
+        // No need to release pTargetParentObject as it is either a copy of pSrcParentObject
+        // or (AFSFcb *)pTargetFileObj->FsContext->ObjectInformation
+        //
 
-        ObDereferenceObject( pTargetParentFileObj);
+        pTargetParentObject = NULL;
     }
 
     return ntStatus;
@@ -3410,23 +3739,43 @@ AFSSetAllocationInfo( IN PIRP Irp,
     if( pFcb->Header.AllocationSize.QuadPart > pBuffer->AllocationSize.QuadPart)
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
                         TRUE);
 
-        bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
-                                             &pBuffer->AllocationSize);
+       __try
+       {
+
+           bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
+                                                &pBuffer->AllocationSize);
+       }
+       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+       {
+
+           bUserMapped = FALSE;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+           ntStatus = GetExceptionCode();
+
+           AFSDbgTrace(( 0,
+                         0,
+                         "EXCEPTION - AFSSetAllocationInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                         pFcb->ObjectInformation->FileId.Cell,
+                         pFcb->ObjectInformation->FileId.Volume,
+                         pFcb->ObjectInformation->FileId.Vnode,
+                         pFcb->ObjectInformation->FileId.Unique,
+                         ntStatus));
+       }
+
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSetAllocationInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
@@ -3445,11 +3794,11 @@ AFSSetAllocationInfo( IN PIRP Irp,
             // If this is a truncation we need to grab the paging IO resource.
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->PagingResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
                             TRUE);
@@ -3494,11 +3843,11 @@ AFSSetAllocationInfo( IN PIRP Irp,
         // Tell Cc if allocation is increased.
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->PagingResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
                         TRUE);
@@ -3525,7 +3874,10 @@ AFSSetAllocationInfo( IN PIRP Irp,
     //
     if (bTellService)
     {
-        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
+
+        ASSERT( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID));
+
+        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentFileId,
                                              pFcb->ObjectInformation,
                                              &pCcb->AuthGroup);
     }
@@ -3613,23 +3965,43 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
         if( pBuffer->EndOfFile.QuadPart < pFcb->Header.FileSize.QuadPart)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->SectionObjectResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
                             TRUE);
 
-            bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
-                                                 &pBuffer->EndOfFile);
+           __try
+           {
+
+               bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
+                                                    &pBuffer->EndOfFile);
+           }
+           __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+           {
+
+               bUserMapped = FALSE;
+
+               ntStatus = GetExceptionCode();
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( 0,
+                             0,
+                             "EXCEPTION - AFSSetEndOfFileInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                             pFcb->ObjectInformation->FileId.Cell,
+                             pFcb->ObjectInformation->FileId.Volume,
+                             pFcb->ObjectInformation->FileId.Vnode,
+                             pFcb->ObjectInformation->FileId.Unique,
+                             ntStatus));
+           }
+
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->SectionObjectResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
@@ -3646,11 +4018,11 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
                 // If this is a truncation we need to grab the paging
                 // IO resource.
                 //
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
+                             "AFSSetEndOfFileInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->PagingResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
                                 TRUE);
@@ -3695,11 +4067,11 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
             // If this is a truncation we need to grab the paging
             // IO resource.
             //
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
+                         "AFSSetEndOfFileInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->PagingResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
                             TRUE);
@@ -3743,7 +4115,9 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
         // Tell the server
         //
 
-        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
+        ASSERT( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID));
+
+        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentFileId,
                                              pFcb->ObjectInformation,
                                              &pCcb->AuthGroup);
 
@@ -3803,11 +4177,11 @@ AFSProcessShareSetInfo( IN IRP *Irp,
     {
         ulFileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessShareSetInfo On pipe %wZ Class %08lX\n",
                       &Ccb->DirectoryCB->NameInformation.FileName,
-                      ulFileInformationClass);
+                      ulFileInformationClass));
 
         pPipeInfo = AFSLockSystemBuffer( Irp,
                                          pIrpSp->Parameters.SetFile.Length);
@@ -3815,10 +4189,10 @@ AFSProcessShareSetInfo( IN IRP *Irp,
         if( pPipeInfo == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessShareSetInfo Failed to lock buffer on pipe %wZ\n",
-                          &Ccb->DirectoryCB->NameInformation.FileName);
+                          &Ccb->DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -3835,20 +4209,20 @@ AFSProcessShareSetInfo( IN IRP *Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessShareSetInfo Failed to send request to service on pipe %wZ Status %08lX\n",
                           &Ccb->DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessShareSetInfo Completed request on pipe %wZ Class %08lX\n",
                       &Ccb->DirectoryCB->NameInformation.FileName,
-                      ulFileInformationClass);
+                      ulFileInformationClass));
 
 try_exit:
 
@@ -3875,11 +4249,11 @@ AFSProcessShareQueryInfo( IN IRP *Irp,
 
         ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessShareQueryInfo On pipe %wZ Class %08lX\n",
                       &Ccb->DirectoryCB->NameInformation.FileName,
-                      ulFileInformationClass);
+                      ulFileInformationClass));
 
         pPipeInfo = AFSLockSystemBuffer( Irp,
                                          pIrpSp->Parameters.QueryFile.Length);
@@ -3887,10 +4261,10 @@ AFSProcessShareQueryInfo( IN IRP *Irp,
         if( pPipeInfo == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessShareQueryInfo Failed to lock buffer on pipe %wZ\n",
-                          &Ccb->DirectoryCB->NameInformation.FileName);
+                          &Ccb->DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -3908,20 +4282,20 @@ AFSProcessShareQueryInfo( IN IRP *Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessShareQueryInfo Failed to send request to service on pipe %wZ Status %08lX\n",
                           &Ccb->DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessShareQueryInfo Completed request on pipe %wZ Class %08lX\n",
                       &Ccb->DirectoryCB->NameInformation.FileName,
-                      ulFileInformationClass);
+                      ulFileInformationClass));
 
 try_exit:
 
@@ -3955,9 +4329,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             case FileBasicInformation:
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
+                              "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n"));
 
                 if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
                 {
@@ -3982,9 +4356,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             case FileStandardInformation:
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
+                              "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n"));
 
                 if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
                 {
@@ -4017,9 +4391,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
                 PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
                 UNICODE_STRING uniName;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
+                              "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n"));
 
                 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
@@ -4097,10 +4471,10 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
                             uniName.Buffer = pNameInfo->FileName;
                         }
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSProcessPIOCtlQueryInfo (FileNameInformation) Returning %wZ\n",
-                                      &uniName);
+                                      &uniName));
                     }
                 }
 
@@ -4112,9 +4486,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
 
                 PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
+                              "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n"));
 
                 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
                 {
@@ -4138,9 +4512,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4149,9 +4523,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4160,9 +4534,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4171,9 +4545,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4182,9 +4556,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4193,9 +4567,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4204,9 +4578,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4215,9 +4589,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4226,9 +4600,9 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
-                              "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
+                              "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n"));
 
                 break;
             }
@@ -4237,20 +4611,20 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
             {
                 ntStatus = STATUS_INVALID_PARAMETER;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
                               "AFSProcessPIOCtlQueryInfo Not handling request %08lX\n",
-                              ulFileInformationClass);
+                              ulFileInformationClass));
 
                 break;
             }
         }
     }
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",
-                  ntStatus);
+                  ntStatus));
 
     return ntStatus;
 }