Windows: File Attribute Reporting Consistency
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFileInfo.cpp
index 2935d17..f6a9d66 100644 (file)
@@ -55,15 +55,13 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
                   IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(LibDeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
-    ULONG ulRequestType = 0;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     AFSFcb *pFcb = NULL;
     AFSCcb *pCcb = NULL;
-    PFILE_OBJECT pFileObject;
     BOOLEAN bReleaseMain = FALSE;
-    LONG lLength;
+    LONG lLength = 0;
     FILE_INFORMATION_CLASS stFileInformationClass;
     GUID stAuthGroup;
     PVOID pBuffer;
@@ -84,7 +82,7 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSQueryFileInfo Attempted access (%08lX) when pFcb == NULL\n",
+                          "AFSQueryFileInfo Attempted access (%p) when pFcb == NULL\n",
                           Irp);
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
@@ -94,15 +92,30 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         stFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
         pBuffer = Irp->AssociatedIrp.SystemBuffer;
 
-        RtlZeroMemory( &stAuthGroup,
-                       sizeof( GUID));
+        if ( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
+
+            RtlZeroMemory( &stAuthGroup,
+                           sizeof( GUID));
+
+            AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
+                                     (ULONGLONG)PsGetCurrentThreadId(),
+                                     &stAuthGroup);
+
+            ntStatus = AFSVerifyEntry( &stAuthGroup,
+                                       pCcb->DirectoryCB);
 
-        AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
-                                 (ULONGLONG)PsGetCurrentThreadId(),
-                                  &stAuthGroup);
+            if ( NT_SUCCESS( ntStatus))
+            {
+
+                ClearFlag( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+            }
+            else
+            {
 
-        AFSVerifyEntry( &stAuthGroup,
-                        pCcb->DirectoryCB);
+                ntStatus = STATUS_SUCCESS;
+            }
+        }
 
         //
         // Grab the main shared right off the bat
@@ -110,7 +123,7 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSQueryFileInfo Acquiring Fcb lock %08lX SHARED %08lX\n",
+                      "AFSQueryFileInfo Acquiring Fcb lock %p SHARED %08lX\n",
                       &pFcb->NPFcb->Resource,
                       PsGetCurrentThread());
 
@@ -494,12 +507,11 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
                 IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(LibDeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     AFSFcb *pFcb = NULL;
     AFSCcb *pCcb = NULL;
-    BOOLEAN bCompleteRequest = TRUE;
     FILE_INFORMATION_CLASS FileInformationClass;
     BOOLEAN bCanQueueRequest = FALSE;
     PFILE_OBJECT pFileObject = NULL;
@@ -520,7 +532,7 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
+                          "AFSSetFileInfo Attempted access (%p) when pFcb == NULL\n",
                           Irp);
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
@@ -535,7 +547,7 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSetFileInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
+                      "AFSSetFileInfo Acquiring Fcb lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->Resource,
                       PsGetCurrentThread());
 
@@ -609,9 +621,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;
         }
 
         //
@@ -833,6 +846,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,
@@ -841,17 +870,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)
                 {
 
@@ -954,6 +972,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,
@@ -962,17 +996,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)
                 {
 
@@ -1012,14 +1035,15 @@ AFSQueryInternalInfo( IN PIRP Irp,
                       IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     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);
     }
@@ -1039,6 +1063,8 @@ AFSQueryEaInfo( IN PIRP Irp,
                 IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     RtlZeroMemory( Buffer,
@@ -1067,6 +1093,7 @@ AFSQueryPositionInfo( IN PIRP Irp,
                       IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Fcb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
 
@@ -1096,6 +1123,8 @@ AFSQueryAccess( IN PIRP Irp,
                 IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
+    UNREFERENCED_PARAMETER(Fcb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
@@ -1124,6 +1153,8 @@ AFSQueryMode( IN PIRP Irp,
               IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
+    UNREFERENCED_PARAMETER(Fcb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     if( *Length >= sizeof( FILE_MODE_INFORMATION))
@@ -1152,6 +1183,8 @@ AFSQueryAlignment( IN PIRP Irp,
                    IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
+    UNREFERENCED_PARAMETER(Fcb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
@@ -1180,6 +1213,7 @@ AFSQueryNameInfo( IN PIRP Irp,
                   IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     ULONG ulCopyLength = 0;
     ULONG cchCopied = 0;
@@ -1322,6 +1356,7 @@ AFSQueryShortNameInfo( IN PIRP Irp,
                        IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
     NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
     ULONG ulCopyLength = 0;
 
@@ -1453,6 +1488,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,
@@ -1461,17 +1512,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)
                 {
 
@@ -1535,9 +1575,9 @@ AFSQueryStreamInfo( IN PIRP Irp,
                     IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
     NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
     ULONG ulCopyLength = 0;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
 
     if( *Length >= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName))
     {
@@ -1606,7 +1646,6 @@ AFSQueryAttribTagInfo( IN PIRP Irp,
 {
 
     NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
-    ULONG ulCopyLength = 0;
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSFcb *pFcb = NULL;
     AFSCcb *pCcb = NULL;
@@ -1644,6 +1683,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,
@@ -1652,17 +1707,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)
                 {
 
@@ -1700,10 +1744,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);
 
@@ -1720,9 +1770,9 @@ AFSQueryRemoteProtocolInfo( IN PIRP Irp,
                             IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(Irp);
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
-    ULONG ulCopyLength = 0;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
 
     if( *Length >= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION))
     {
@@ -1757,6 +1807,7 @@ AFSQueryPhysicalNameInfo( IN PIRP Irp,
                           IN OUT PLONG Length)
 {
 
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     ULONG ulCopyLength = 0;
     ULONG cchCopied = 0;
@@ -1956,13 +2007,21 @@ AFSSetBasicInfo( IN PIRP Irp,
         if( ulNotifyFilter > 0)
         {
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
+            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);
+
+                if ( pParentObjectInfo != NULL)
+                {
+                    AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                    pCcb,
+                                                    (ULONG)ulNotifyFilter,
+                                                    (ULONG)FILE_ACTION_MODIFIED);
+
+                    AFSReleaseObjectInfo( &pParentObjectInfo);
+                }
             }
         }
 
@@ -2092,10 +2151,11 @@ AFSSetDispositionInfo( IN PIRP Irp,
             }
             else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
             {
+                BOOLEAN bMmFlushed;
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
@@ -2106,56 +2166,76 @@ AFSSetDispositionInfo( IN PIRP Irp,
                 // Attempt to flush any outstanding data
                 //
 
-                if( !MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
-                                          MmFlushForDelete))
+                bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
+                                                  MmFlushForDelete);
+
+                if ( bMmFlushed)
                 {
 
+                    //
+                    // 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.
+                    //
+
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
+                                  DirectoryCB,
                                   &DirectoryCB->NameInformation.FileName);
 
-                    try_return( ntStatus = STATUS_CANNOT_DELETE);
-                }
-
-                //
-                // 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.
-                //
-
-                AFSDbgLogMsg( 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);
-
-                //
-                // Purge the cache as well
-                //
+                    SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
 
-                if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
-                {
+                    //
+                    // Purge the cache as well
+                    //
 
-                    if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
-                                               NULL,
-                                               0,
-                                               TRUE))
+                    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);
+                        }
                     }
                 }
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetDispositionInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSSetDispositionInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
                 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+
+                if ( !bMmFlushed)
+                {
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_ERROR,
+                                  "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
+                                  &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)
+            {
+
+                AFSDbgLogMsg( 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
@@ -2185,17 +2265,15 @@ AFSSetFileLinkInfo( IN PIRP Irp)
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
-    IO_STATUS_BLOCK stIoSb = {0,0};
     PFILE_LINK_INFORMATION pFileLinkInfo = NULL;
     PFILE_OBJECT pSrcFileObj = NULL;
     PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
-    AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
+    AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL;
     AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
-    AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
+    AFSObjectInfoCB *pSrcObject = NULL;
     AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
     UNICODE_STRING uniSourceName, uniTargetName;
     UNICODE_STRING uniFullTargetName, uniTargetParentName;
-    UNICODE_STRING uniShortName;
     BOOLEAN bCommonParent = FALSE;
     AFSDirectoryCB *pTargetDirEntry = NULL;
     AFSDirectoryCB *pNewTargetDirEntry = NULL;
@@ -2203,7 +2281,6 @@ AFSSetFileLinkInfo( IN PIRP Irp)
     BOOLEAN bTargetEntryExists = FALSE;
     LONG lCount;
     BOOLEAN bReleaseTargetDirLock = FALSE;
-    AFSFileID stNewFid;
     ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
 
     __Enter
@@ -2215,7 +2292,13 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
 
         pSrcObject = pSrcFcb->ObjectInformation;
-        pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+        if ( BooleanFlagOn( pSrcFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pSrcParentObject = AFSFindObjectInfo( pSrcFcb->ObjectInformation->VolumeCB,
+                                                  &pSrcFcb->ObjectInformation->ParentFileId);
+        }
 
         pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
 
@@ -2406,7 +2489,8 @@ 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);
 
@@ -2434,10 +2518,10 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetFileLinkInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
+                          "AFSSetFileLinkInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
-                          pTargetDirEntry->DirOpenReferenceCount);
+                          lCount);
 
             //
             // Pull the directory entry from the parent
@@ -2463,14 +2547,15 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
         ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
                                       &pSrcCcb->AuthGroup,
-                                      pSrcFcb->ObjectInformation->ParentObjectInformation,
+                                      pSrcParentObject,
                                       pTargetDcb->ObjectInformation,
                                       pSrcCcb->DirectoryCB,
                                       &uniTargetName,
                                       pFileLinkInfo->ReplaceIfExists,
                                       &pNewTargetDirEntry);
 
-        if( !NT_SUCCESS( ntStatus))
+        if( ntStatus != STATUS_REPARSE &&
+            !NT_SUCCESS( ntStatus))
         {
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -2483,9 +2568,13 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             try_return( ntStatus);
         }
 
-        AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
-                                pNewTargetDirEntry,
-                                TRUE);
+        if ( ntStatus != STATUS_REPARSE)
+        {
+
+            AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
+                                    pNewTargetDirEntry,
+                                    TRUE);
+        }
 
         //
         // Send notification for the target link file
@@ -2502,7 +2591,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             ulNotificationAction = FILE_ACTION_ADDED;
         }
 
-        AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pTargetParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -2515,7 +2604,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             if( bTargetEntryExists)
             {
 
-                AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+                AFSInsertDirectoryNode( pTargetParentObject,
                                         pTargetDirEntry,
                                         FALSE);
             }
@@ -2524,6 +2613,10 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         if( pTargetDirEntry != NULL)
         {
 
+            //
+            // Release DirOpenReferenceCount obtained above
+            //
+
             lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
@@ -2537,11 +2630,44 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             ASSERT( lCount >= 0);
         }
 
+        if( pNewTargetDirEntry != NULL)
+        {
+
+            //
+            // Release DirOpenReferenceCount obtained from AFSNotifyHardLink
+            //
+
+            lCount = InterlockedDecrement( &pNewTargetDirEntry->DirOpenReferenceCount);
+
+            AFSDbgLogMsg( 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);
+
+            ASSERT( lCount >= 0);
+        }
+
         if( bReleaseTargetDirLock)
         {
 
             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;
@@ -2554,7 +2680,6 @@ AFSSetRenameInfo( IN PIRP Irp)
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
-    IO_STATUS_BLOCK stIoSb = {0,0};
     AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
     AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
     PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject;
@@ -2567,9 +2692,9 @@ AFSSetRenameInfo( IN PIRP Irp)
     AFSDirectoryCB *pTargetDirEntry = NULL;
     ULONG ulTargetCRC = 0;
     BOOLEAN bTargetEntryExists = FALSE;
-    AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
+    AFSObjectInfoCB *pSrcObject = NULL;
     AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
-    AFSFileID stNewFid, stTmpTargetFid;
+    AFSFileID stNewFid;
     ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
     UNICODE_STRING uniFullTargetName;
     BOOLEAN bCommonParent = FALSE;
@@ -2590,7 +2715,13 @@ AFSSetRenameInfo( IN PIRP Irp)
         pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
 
         pSrcObject = pSrcFcb->ObjectInformation;
-        pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+        if ( BooleanFlagOn( pSrcFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pSrcParentObject = AFSFindObjectInfo( pSrcFcb->ObjectInformation->VolumeCB,
+                                                  &pSrcFcb->ObjectInformation->ParentFileId);
+        }
 
         //
         // Perform some basic checks to ensure FS integrity
@@ -2815,11 +2946,11 @@ 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,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
@@ -2844,10 +2975,10 @@ AFSSetRenameInfo( IN PIRP Irp)
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSSetRenameInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
+                          "AFSSetRenameInfo Target %wZ exists DE %p Count %d, performing delete of target\n",
                           &pTargetDirEntry->NameInformation.FileName,
                           pTargetDirEntry,
-                          pTargetDirEntry->DirOpenReferenceCount);
+                          lCount);
 
             //
             // Pull the directory entry from the parent
@@ -2872,7 +3003,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);
 
@@ -2883,7 +3014,7 @@ AFSSetRenameInfo( IN PIRP Irp)
 
         ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
                                     &pSrcCcb->AuthGroup,
-                                    pSrcFcb->ObjectInformation->ParentObjectInformation,
+                                    pSrcParentObject,
                                     pTargetDcb->ObjectInformation,
                                     pSrcCcb->DirectoryCB,
                                     &uniTargetName,
@@ -2896,7 +3027,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Attempt to re-insert the directory entry
             //
 
-            AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+            AFSInsertDirectoryNode( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
@@ -2914,7 +3045,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Set the notification up for the source file
         //
 
-        if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
+        if( pSrcParentObject == pTargetParentObject &&
             !bTargetEntryExists)
         {
 
@@ -2937,7 +3068,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
         }
 
-        AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pSrcParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -2956,7 +3087,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Attempt to re-insert the directory entry
             //
 
-            AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+            AFSInsertDirectoryNode( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
@@ -3080,18 +3211,40 @@ 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;
+            lCount = AFSObjectInfoIncrement( pTargetParentObject,
+                                             AFS_OBJECT_REFERENCE_CHILD);
+
+            AFSDbgLogMsg( 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);
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSSetRenameInfo Decrement count on parent object %p Cnt %d\n",
+                          pSrcParentObject,
+                          lCount);
+
+            pSrcCcb->DirectoryCB->ObjectInformation->ParentFileId = pTargetParentObject->FileId;
+
+            SetFlag( pSrcCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+            pSrcParentObject = pTargetParentObject;
 
             ulNotificationAction = FILE_ACTION_ADDED;
         }
@@ -3105,7 +3258,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Now update the notification for the target file
         //
 
-        AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pTargetParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -3136,10 +3289,80 @@ AFSSetRenameInfo( IN PIRP Irp)
             {
 
                 pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
+            }
+
+            ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
+
+            lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
+
+            AFSDbgLogMsg( 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);
+
+            ASSERT( lCount >= 0);
+
+            if( lCount == 0 &&
+                pTargetDirEntry->NameArrayReferenceCount <= 0)
+            {
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
+                              pTargetDirEntry,
+                              &pTargetDirEntry->NameInformation.FileName);
+
+                AFSDeleteDirEntry( pTargetParentObject,
+                                   pTargetDirEntry);
+            }
+
+            pTargetDirEntry = NULL;
+
+            if ( pTargetFcb != NULL)
+            {
+
+                //
+                // Do not hold TreeLocks across the MmForceSectionClosed() call as
+                // it can deadlock with Trend Micro's TmPreFlt!TmpQueryFullName
+                //
+
+                if( bReleaseTargetDirLock)
+                {
+                    AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+                    bReleaseTargetDirLock = FALSE;
+                }
+
+                if( bReleaseSourceDirLock)
+                {
+
+                    AFSReleaseResource( pSourceDirLock);
+
+                    bReleaseSourceDirLock = FALSE;
+                }
+
+                //
+                // MmForceSectionClosed() can eventually call back into AFSCleanup
+                // which will need to acquire Fcb->Resource exclusively.  Failure
+                // to obtain it here before holding the SectionObjectResource will
+                // permit the locks to be obtained out of order risking a deadlock.
+                //
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetRenameInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSSetRenameInfo Acquiring Fcb lock %p EXCL %08lX\n",
+                              &pTargetFcb->NPFcb->Resource,
+                              PsGetCurrentThread());
+
+                AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
+                                TRUE);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSSetRenameInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pTargetFcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
@@ -3157,46 +3380,25 @@ AFSSetRenameInfo( IN PIRP Irp)
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
-                                  &pTargetDirEntry->NameInformation.FileName);
+                                  &uniTargetName);
                 }
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetRenameInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSSetRenameInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pTargetFcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
                 AFSReleaseResource( &pTargetFcb->NPFcb->SectionObjectResource);
-            }
-
-            ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
-
-            lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
-
-            AFSDbgLogMsg( 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);
 
-            ASSERT( lCount >= 0);
-
-            if( lCount == 0)
-            {
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
-                              pTargetDirEntry,
-                              &pTargetDirEntry->NameInformation.FileName);
+                              "AFSSetRenameInfo Releasing Fcb lock %p EXCL %08lX\n",
+                              &pTargetFcb->NPFcb->Resource,
+                              PsGetCurrentThread());
 
-                AFSDeleteDirEntry( pTargetParentObject,
-                                   pTargetDirEntry);
+                AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
             }
-
-            pTargetDirEntry = NULL;
         }
 
 try_exit:
@@ -3206,7 +3408,10 @@ try_exit:
 
             if( bTargetEntryExists)
             {
-                AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+
+                ASSERT( pTargetParentObject != NULL);
+
+                AFSInsertDirectoryNode( pTargetParentObject,
                                         pTargetDirEntry,
                                         FALSE);
             }
@@ -3230,19 +3435,34 @@ try_exit:
 
         if( bReleaseTargetDirLock)
         {
+
             AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
 
         if( bReleaseSourceDirLock)
         {
+
             AFSReleaseResource( pSourceDirLock);
         }
-    }
 
-    if ( bDereferenceTargetParentObject)
-    {
+        if ( bDereferenceTargetParentObject)
+        {
 
-        ObDereferenceObject( pTargetParentFileObj);
+            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
+        //
+
+        pTargetParentObject = NULL;
     }
 
     return ntStatus;
@@ -3252,6 +3472,7 @@ NTSTATUS
 AFSSetPositionInfo( IN PIRP Irp,
                     IN AFSDirectoryCB *DirectoryCB)
 {
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_POSITION_INFORMATION pBuffer;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
@@ -3267,6 +3488,7 @@ NTSTATUS
 AFSSetAllocationInfo( IN PIRP Irp,
                       IN AFSDirectoryCB *DirectoryCB)
 {
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_ALLOCATION_INFORMATION pBuffer;
     BOOLEAN bReleasePaging = FALSE;
@@ -3305,7 +3527,7 @@ AFSSetAllocationInfo( IN PIRP Irp,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                      "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->SectionObjectResource,
                       PsGetCurrentThread());
 
@@ -3317,7 +3539,7 @@ AFSSetAllocationInfo( IN PIRP Irp,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSetAllocationInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                      "AFSSetAllocationInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->SectionObjectResource,
                       PsGetCurrentThread());
 
@@ -3340,7 +3562,7 @@ AFSSetAllocationInfo( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+                          "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->PagingResource,
                           PsGetCurrentThread());
 
@@ -3389,7 +3611,7 @@ AFSSetAllocationInfo( IN PIRP Irp,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+                      "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                       &pFcb->NPFcb->PagingResource,
                       PsGetCurrentThread());
 
@@ -3418,7 +3640,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);
     }
@@ -3474,6 +3699,7 @@ NTSTATUS
 AFSSetEndOfFileInfo( IN PIRP Irp,
                      IN AFSDirectoryCB *DirectoryCB)
 {
+    UNREFERENCED_PARAMETER(DirectoryCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_END_OF_FILE_INFORMATION pBuffer;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
@@ -3507,7 +3733,7 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                          "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->SectionObjectResource,
                           PsGetCurrentThread());
 
@@ -3519,7 +3745,7 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                          "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->SectionObjectResource,
                           PsGetCurrentThread());
 
@@ -3540,7 +3766,7 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
                 //
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+                              "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->PagingResource,
                               PsGetCurrentThread());
 
@@ -3589,7 +3815,7 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
             //
             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
+                          "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %p EXCL %08lX\n",
                           &pFcb->NPFcb->PagingResource,
                           PsGetCurrentThread());
 
@@ -3635,7 +3861,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);
 
@@ -3685,9 +3913,9 @@ AFSProcessShareSetInfo( IN IRP *Irp,
                         IN AFSCcb *Ccb)
 {
 
+    UNREFERENCED_PARAMETER(Fcb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
-    ULONG ulOutputBufferLen = 0, ulInputBufferLen;
     FILE_INFORMATION_CLASS ulFileInformationClass;
     void *pPipeInfo = NULL;
 
@@ -3756,9 +3984,9 @@ AFSProcessShareQueryInfo( IN IRP *Irp,
                           IN AFSCcb *Ccb)
 {
 
+    UNREFERENCED_PARAMETER(Fcb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
-    ULONG ulOutputBufferLen = 0, ulInputBufferLen;
     FILE_INFORMATION_CLASS ulFileInformationClass;
     void *pPipeInfo = NULL;
 
@@ -3830,6 +4058,8 @@ AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
                            IN OUT LONG *Length)
 {
 
+    UNREFERENCED_PARAMETER(Fcb);
+    UNREFERENCED_PARAMETER(Ccb);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     FILE_INFORMATION_CLASS ulFileInformationClass;