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;
}
//
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);
}
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);
+ }
}
}
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;
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);
ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
&pSrcCcb->AuthGroup,
- pSrcFcb->ObjectInformation->ParentObjectInformation,
+ pSrcParentObject,
pTargetDcb->ObjectInformation,
pSrcCcb->DirectoryCB,
&uniTargetName,
ulNotificationAction = FILE_ACTION_ADDED;
}
- AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pTargetParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
if( bTargetEntryExists)
{
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+ AFSInsertDirectoryNode( pTargetParentObject,
pTargetDirEntry,
FALSE);
}
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;
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
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);
// same parent we do not pull the node from the enumeration list
//
- AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSRemoveDirNodeFromParent( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
&pSrcCcb->AuthGroup,
- pSrcFcb->ObjectInformation->ParentObjectInformation,
+ pSrcParentObject,
pTargetDcb->ObjectInformation,
pSrcCcb->DirectoryCB,
&uniTargetName,
// Attempt to re-insert the directory entry
//
- AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSInsertDirectoryNode( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
// Set the notification up for the source file
//
- if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
+ if( pSrcParentObject == pTargetParentObject &&
!bTargetEntryExists)
{
ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
}
- AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pSrcParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
// Attempt to re-insert the directory entry
//
- AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+ AFSInsertDirectoryNode( pSrcParentObject,
pSrcCcb->DirectoryCB,
!bCommonParent);
// 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);
pTargetParentObject,
lCount);
- lCount = AFSObjectInfoDecrement( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+ 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",
- pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+ pSrcParentObject,
lCount);
- pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
+ pSrcCcb->DirectoryCB->ObjectInformation->ParentFileId = pTargetParentObject->FileId;
+
+ SetFlag( pSrcCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ pSrcParentObject = pTargetParentObject;
ulNotificationAction = FILE_ACTION_ADDED;
}
// Now update the notification for the target file
//
- AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pTargetParentObject,
pSrcCcb,
(ULONG)ulNotifyFilter,
(ULONG)ulNotificationAction);
ASSERT( lCount >= 0);
- if( lCount == 0)
+ if( lCount == 0 &&
+ pTargetDirEntry->NameArrayReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
if( bTargetEntryExists)
{
- AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+
+ ASSERT( pTargetParentObject != NULL);
+
+ AFSInsertDirectoryNode( pTargetParentObject,
pTargetDirEntry,
FALSE);
}
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;
//
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);
}
// 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);