IN OUT AFSBTreeEntry **TreeEntry)
{
- NTSTATUS ntStatus = STATUS_SUCCESS;
+ NTSTATUS ntStatus = STATUS_NOT_FOUND;
AFSBTreeEntry *pCurrentEntry = NULL;
pCurrentEntry = TopNode;
*TreeEntry = TopNode;
- try_return( ntStatus);
+ try_return( ntStatus = STATUS_SUCCESS);
}
//
*TreeEntry = pCurrentEntry;
+ ntStatus = STATUS_SUCCESS;
+
break;
}
}
pObjectInfo = pFcb->ObjectInformation;
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
+
pRootFcb = pObjectInfo->VolumeCB->RootFcb;
RtlZeroMemory( &stFileCleanup,
// Decrement the open child handle count
//
- if( pObjectInfo->ParentObjectInformation != NULL &&
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
+ if( pParentObjectInfo != NULL &&
+ pParentObjectInfo->Specific.Directory.ChildOpenHandleCount > 0)
{
- lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanup (IOCtl) Decrement child open handle count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
}
ASSERT( pFcb->OpenHandleCount != 0);
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- stFileCleanup.ParentId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+ stFileCleanup.ParentId = pParentObjectInfo->FileId;
}
stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
ASSERT( pParentObjectInfo != NULL);
- AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
- if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+ if ( pParentObjectInfo != NULL)
{
- SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- }
- else
- {
+ if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+ {
- pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
- }
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- //
- // Now that the service has the entry has deleted we need to remove it from the parent
- // tree so another lookup on the node will fail
- //
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
+ else
+ {
- if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
- {
+ pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup DE %p for %wZ removing entry\n",
- pCcb->DirectoryCB,
- &pCcb->DirectoryCB->NameInformation.FileName);
+ //
+ // Now that the service has the entry has deleted we need to remove it from the parent
+ // tree so another lookup on the node will fail
+ //
+
+ if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
- AFSRemoveNameEntry( pParentObjectInfo,
- pCcb->DirectoryCB);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ removing entry\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+
+ AFSRemoveNameEntry( pParentObjectInfo,
+ pCcb->DirectoryCB);
+ }
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+ }
+
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+ (ULONG)FILE_ACTION_REMOVED);
}
else
{
+ if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
- pCcb->DirectoryCB,
- &pCcb->DirectoryCB->NameInformation.FileName);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ NOT removing entry due to pParentObjectInfo == NULL\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+ }
}
-
- AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
- AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
- pCcb,
- (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
- (ULONG)FILE_ACTION_REMOVED);
-
}
}
else
{
- if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
+ if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED) &&
+ pParentObjectInfo != NULL)
{
ULONG ulNotifyFilter = 0;
ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
- AFSFsRtlNotifyFullReportChange( pObjectInfo->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
pCcb,
(ULONG)ulNotifyFilter,
(ULONG)FILE_ACTION_MODIFIED);
if ( NT_SUCCESS( ntStatus))
{
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if ( pParentObjectInfo != NULL)
{
// Decrement the open child handle count
//
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if( pParentObjectInfo != NULL)
{
ASSERT( pFcb->OpenHandleCount != 0);
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- stFileCleanup.ParentId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+ stFileCleanup.ParentId = pParentObjectInfo->FileId;
}
stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
ASSERT( pParentObjectInfo != NULL);
- AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
- if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+ if ( pParentObjectInfo != NULL)
{
- SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- }
- else
- {
+ if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+ {
- pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
- }
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- //
- // Now that the service has the entry has deleted we need to remove it from the parent
- // tree so another lookup on the node will fail
- //
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
+ else
+ {
- if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
- {
+ pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
+ }
- AFSRemoveNameEntry( pParentObjectInfo,
- pCcb->DirectoryCB);
+ //
+ // Now that the service has the entry has deleted we need to remove it from the parent
+ // tree so another lookup on the node will fail
+ //
+
+ if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
+
+ AFSRemoveNameEntry( pParentObjectInfo,
+ pCcb->DirectoryCB);
+ }
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+ }
+
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+ (ULONG)FILE_ACTION_REMOVED);
}
else
{
+ if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
- pCcb->DirectoryCB,
- &pCcb->DirectoryCB->NameInformation.FileName);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ NOT removing entry due to pParentObjectInfo == NULL\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+ }
}
-
- AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
- AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
- pCcb,
- (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
- (ULONG)FILE_ACTION_REMOVED);
-
}
}
else
{
- if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
+ if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED) &&
+ pParentObjectInfo != NULL)
{
ULONG ulNotifyFilter = 0;
ClearFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
- if( pParentObjectInfo != NULL)
- {
-
- ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
+ ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
- AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
- pCcb,
- (ULONG)ulNotifyFilter,
- (ULONG)FILE_ACTION_MODIFIED);
- }
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)ulNotifyFilter,
+ (ULONG)FILE_ACTION_MODIFIED);
}
//
if ( NT_SUCCESS( ntStatus))
{
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if ( pParentObjectInfo != NULL)
{
// Decrement the open child handle count
//
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if( pParentObjectInfo != NULL)
{
ASSERT( pFcb->OpenHandleCount != 0);
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- stFileCleanup.ParentId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+ stFileCleanup.ParentId = pParentObjectInfo->FileId;
}
stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
ASSERT( pParentObjectInfo != NULL);
- AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
- if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+ if ( pParentObjectInfo != NULL)
{
- SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- }
- else
- {
- pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
- }
+ if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+ {
- //
- // Now that the service has the entry has deleted we need to remove it from the parent
- // tree so another lookup on the node will fail
- //
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
- {
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
+ else
+ {
+ pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
+ }
+
+ //
+ // Now that the service has the entry has deleted we need to remove it from the parent
+ // tree so another lookup on the node will fail
+ //
+
+ if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
+
+ AFSRemoveNameEntry( pParentObjectInfo,
+ pCcb->DirectoryCB);
+ }
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+ }
+
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
- AFSRemoveNameEntry( pParentObjectInfo,
- pCcb->DirectoryCB);
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+ (ULONG)FILE_ACTION_REMOVED);
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
- pCcb->DirectoryCB,
- &pCcb->DirectoryCB->NameInformation.FileName);
- }
-
- AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
- AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
- pCcb,
- (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
- (ULONG)FILE_ACTION_REMOVED);
+ if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup DE %p for %wZ NOT removing entry due to pParentObjectInfo == NULL\n",
+ pCcb->DirectoryCB,
+ &pCcb->DirectoryCB->NameInformation.FileName);
+ }
+ }
}
}
else
{
- if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
+ if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED) &&
+ pParentObjectInfo != NULL)
{
ULONG ulNotifyFilter = 0;
ClearFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
- if( pParentObjectInfo != NULL)
- {
-
- ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
+ ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
- AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
- pCcb,
- (ULONG)ulNotifyFilter,
- (ULONG)FILE_ACTION_MODIFIED);
- }
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ pCcb,
+ (ULONG)ulNotifyFilter,
+ (ULONG)FILE_ACTION_MODIFIED);
}
//
if ( NT_SUCCESS( ntStatus))
{
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if ( pParentObjectInfo != NULL)
{
// Decrement the open child handle count
//
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if( pParentObjectInfo != NULL)
{
// Decrement the open child handle count
//
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
if( pParentObjectInfo != NULL &&
pParentObjectInfo->Specific.Directory.ChildOpenHandleCount > 0)
{
try_exit:
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
if( pResultCB != NULL)
{
AFSDeviceExt *pDeviceExt = NULL;
AFSCcb *pCcb = NULL;
AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSDirectoryCB *pDirCB = NULL;
LONG lCount;
RtlZeroMemory( &stParentFileId,
sizeof( AFSFileID));
- stParentFileId = pObjectInfo->ParentObjectInformation->FileId;
+ stParentFileId = pObjectInfo->ParentFileId;
//
// Issue the close request to the service
// If this is not the root then decrement the open child reference count
//
- if( pObjectInfo->ParentObjectInformation != NULL &&
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
+
+ if( pParentObjectInfo != NULL &&
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
+ {
+
+ InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSClose (IOCtl) Decrement child open ref count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ pParentObjectInfo,
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
}
AFSReleaseResource( &pFcb->NPFcb->Resource);
pCcb->DirectoryCB = NULL;
//
+ // Object the Parent ObjectInformationCB
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
+
+ //
// Remove the Ccb and de-allocate it
//
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
}
- AFSAcquireExcl( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
- AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ ASSERT( pParentObjectInfo != NULL);
- lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirCB->NameInformation.FileName,
- pDirCB,
- pCcb,
- lCount);
+ if ( pParentObjectInfo != NULL)
+ {
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- ASSERT( lCount >= 0);
+ AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
- if( lCount == 0)
- {
+ lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Deleting dir entry %p (%p) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- pDirCB,
- pObjectInfo,
+ "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirCB->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pDirCB,
+ pCcb,
+ lCount);
- //
- // Remove and delete the directory entry from the parent list
- //
+ ASSERT( lCount >= 0);
- AFSDeleteDirEntry( pObjectInfo->ParentObjectInformation,
- pDirCB);
+ if( lCount == 0)
+ {
- AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
- TRUE);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSClose Deleting dir entry %p (%p) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ pDirCB,
+ pObjectInfo,
+ &pDirCB->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique);
- if( pObjectInfo->ObjectReferenceCount <= 0)
- {
+ //
+ // Remove and delete the directory entry from the parent list
+ //
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ AFSDeleteDirEntry( pParentObjectInfo,
+ pDirCB);
+
+ AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ if( pObjectInfo->ObjectReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Removing object %p from volume tree\n",
- pObjectInfo);
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSClose Removing object %p from volume tree\n",
+ pObjectInfo);
- AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
- &pObjectInfo->TreeEntry);
+ AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
+ &pObjectInfo->TreeEntry);
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ }
}
- }
- AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- }
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+ }
- AFSReleaseResource( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
- AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
}
else
{
//
if( pObjectInfo != NULL &&
- pObjectInfo->ParentObjectInformation != NULL &&
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+ pParentObjectInfo != NULL &&
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
{
- InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSClose Decrement child open ref count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ pParentObjectInfo,
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
}
//
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+ //
+ // Object the Parent ObjectInformationCB
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
+
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSClose Acquiring Special Share lock %p EXCL %08lX\n",
// If this is not the root then decrement the open child reference count
//
- if( pObjectInfo->ParentObjectInformation != NULL &&
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+ if( pParentObjectInfo != NULL &&
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
{
- lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSClose (Share) Decrement child open ref count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
}
AFSDumpTraceFilesFnc();
}
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
return ntStatus;
}
AFSFileDeleteCB stDelete;
AFSFileDeleteResultCB stDeleteResult;
ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
__Enter
{
- stDelete.ParentId = DirectoryCB->ObjectInformation->ParentObjectInformation->FileId;
+ pObjectInfo = DirectoryCB->ObjectInformation;
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+
+ stDelete.ParentId = pObjectInfo->ParentFileId;
stDelete.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
ulRequestFlags,
AuthGroup,
&DirectoryCB->NameInformation.FileName,
- &DirectoryCB->ObjectInformation->FileId,
+ &pObjectInfo->FileId,
&stDelete,
sizeof( AFSFileDeleteCB),
&stDeleteResult,
stDelete.ParentId.Vnode,
stDelete.ParentId.Unique,
&DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
ntStatus);
try_return( ntStatus);
}
- AFSAcquireExcl( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
if( CheckOnly)
// Validate the parent data version
//
- if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
+ if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
{
- SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
}
else
// Update the parent data version
//
- if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
+ if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
{
- SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
else
{
// Directory data version number can be updated. Until then we must force
// a verification.
//
- // DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
+ // pParentObjectInfor->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
//
- SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
}
- AFSReleaseResource( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
try_exit:
- NOTHING;
+ if ( pParentObjectInfo)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
}
return ntStatus;
AFSFileEvalResultCB *pEvalResultCB = NULL;
AFSDirEnumEntry *pDirEnumCB = NULL;
ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
- AFSObjectInfoCB *pParentInfo = NULL;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
__Enter
{
RtlZeroMemory( &stTargetID,
sizeof( AFSEvalTargetCB));
- pParentInfo = ObjectInfo->ParentObjectInformation;
-
- if( pParentInfo != NULL)
+ if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- stTargetID.ParentId = pParentInfo->FileId;
+ pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+ &ObjectInfo->ParentFileId);
+
+ stTargetID.ParentId = ObjectInfo->ParentFileId;
}
//
if( ntStatus == STATUS_OBJECT_PATH_INVALID)
{
- if( pParentInfo != NULL)
+ if( pParentObjectInfo != NULL)
{
- AFSAcquireExcl( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- SetFlag( pParentInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- pParentInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- AFSReleaseResource( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
}
// Validate the parent data version
//
- if ( pParentInfo != NULL)
+ if ( pParentObjectInfo != NULL)
{
- AFSAcquireExcl( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- if ( pParentInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ if ( pParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
{
- SetFlag( pParentInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- pParentInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
- AFSReleaseResource( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
try_exit:
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
if( pEvalResultCB != NULL)
{
if ( ntStatus == STATUS_NOT_A_DIRECTORY)
{
- if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
+ if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
Irp,
&pDirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pParentObjectInfo->FileId.Unique,
ntStatus);
}
- else if ( pObjectInfo->ParentObjectInformation == NULL)
+ else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
+ "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
Irp,
&pDirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pParentObjectInfo->FileId.Volume,
pParentObjectInfo->FileId.Vnode,
pParentObjectInfo->FileId.Unique,
- pObjectInfo->ParentObjectInformation->FileId.Cell,
- pObjectInfo->ParentObjectInformation->FileId.Volume,
- pObjectInfo->ParentObjectInformation->FileId.Vnode,
- pObjectInfo->ParentObjectInformation->FileId.Unique,
+ pObjectInfo->ParentFileId.Cell,
+ pObjectInfo->ParentFileId.Volume,
+ pObjectInfo->ParentFileId.Vnode,
+ pObjectInfo->ParentFileId.Unique,
ntStatus);
}
}
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
+ ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
//
// We may have raced and the Fcb is already created
//
// Increment the open reference and handle on the parent node
//
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
if( ulOptions & FILE_DELETE_ON_CLOSE)
BOOLEAN bAllocatedCcb = FALSE;
BOOLEAN bReleaseFcb = FALSE;
AFSObjectInfoCB *pParentObject = NULL;
+ AFSObjectInfoCB *pGrandParentObject = NULL;
UNICODE_STRING uniTargetName;
LONG lCount;
// Increment the open reference and handle on the parent node
//
- if( pParentObject->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( pParentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
+ &pParentObject->ParentFileId);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
- pParentObject->ParentObjectInformation,
- lCount);
+ if ( pGrandParentObject)
+ {
- lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
- pParentObject->ParentObjectInformation,
- lCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
+ pGrandParentObject,
+ lCount);
+
+ lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
+ pGrandParentObject,
+ lCount);
+
+ AFSReleaseObjectInfo( &pGrandParentObject);
+ }
}
try_exit:
pObjectInfo = DirectoryCB->ObjectInformation;
+ ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
//
// Check if the entry is pending a deletion
//
// Increment the open reference and handle on the parent node
//
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
pObjectInfo = DirectoryCB->ObjectInformation;
+ ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
//
// Check if we should go and retrieve updated information for the node
//
// Increment the open reference and handle on the parent node
//
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
+ AFSObjectInfoCB *pObjectInfo = NULL;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSPipeOpenCloseRequestCB stPipeOpen;
LONG lCount;
Irp,
&DirectoryCB->NameInformation.FileName);
- pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
+ pObjectInfo = DirectoryCB->ObjectInformation;
+
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
if( DirectoryCB->ObjectInformation->Fcb == NULL)
{
ntStatus = AFSInitFcb( DirectoryCB);
- *Fcb = DirectoryCB->ObjectInformation->Fcb;
+ *Fcb = pObjectInfo->Fcb;
if( !NT_SUCCESS( ntStatus))
{
else
{
- *Fcb = DirectoryCB->ObjectInformation->Fcb;
+ *Fcb = pObjectInfo->Fcb;
AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
TRUE);
AFSFcb *pFcb = NULL;
AFSNonPagedFcb *pNPFcb = NULL;
USHORT usFcbLength = 0;
- AFSObjectInfoCB *pObjectInfo = NULL, *pParentObjectInfo = NULL;
+ AFSObjectInfoCB *pObjectInfo = NULL;
AFSVolumeCB *pVolumeCB = NULL;
__Enter
pObjectInfo = DirEntry->ObjectInformation;
- pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
- pVolumeCB = pObjectInfo->VolumeCB;
-
if ( pObjectInfo->Fcb != NULL)
{
try_return( ntStatus = STATUS_SUCCESS);
}
+ pVolumeCB = pObjectInfo->VolumeCB;
+
//
// Allocate the Fcb and the nonpaged portion of the Fcb.
//
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( 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;
}
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);
NTSTATUS ntStatus = STATUS_SUCCESS;
IO_STATUS_BLOCK stIoStatus;
ULONG ulFilter = 0;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
(*ppObjectInfo)->FileId.Unique,
Reason);
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
+ &(*ppObjectInfo)->ParentFileId);
+ }
+
if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
(*ppObjectInfo)->FileType == AFS_FILE_TYPE_DFSLINK ||
(*ppObjectInfo)->FileType == AFS_FILE_TYPE_MOUNTPOINT)
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
-
- if( Reason == AFS_INVALIDATE_CREDS)
+ if ( pParentObjectInfo != NULL)
{
- ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
- }
- if( Reason == AFS_INVALIDATE_DATA_VERSION ||
- Reason == AFS_INVALIDATE_FLUSHED)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
- }
- else
- {
- ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
- }
+ ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+
+ if( Reason == AFS_INVALIDATE_CREDS)
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
+ }
+
+ if( Reason == AFS_INVALIDATE_DATA_VERSION ||
+ Reason == AFS_INVALIDATE_FLUSHED)
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
+ }
+ else
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ }
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
- NULL,
- ulFilter,
- FILE_ACTION_MODIFIED);
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ NULL,
+ ulFilter,
+ FILE_ACTION_MODIFIED);
+ }
try_return( ntStatus);
}
(*ppObjectInfo)->FileId.Vnode,
(*ppObjectInfo)->FileId.Unique);
- if( (*ppObjectInfo)->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
- (*ppObjectInfo)->ParentObjectInformation->FileId.Cell,
- (*ppObjectInfo)->ParentObjectInformation->FileId.Volume,
- (*ppObjectInfo)->ParentObjectInformation->FileId.Vnode,
- (*ppObjectInfo)->ParentObjectInformation->FileId.Unique);
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique);
- SetFlag( (*ppObjectInfo)->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- (*ppObjectInfo)->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- (*ppObjectInfo)->ParentObjectInformation->Expiration.QuadPart = 0;
- }
+ pParentObjectInfo->Expiration.QuadPart = 0;
- if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
- ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
- }
- else
- {
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
- }
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+ {
+ ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
+ }
+ else
+ {
+ ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+ }
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
- NULL,
- ulFilter,
- FILE_ACTION_REMOVED);
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ NULL,
+ ulFilter,
+ FILE_ACTION_REMOVED);
+ }
if( NT_SUCCESS( AFSQueueInvalidateObject( (*ppObjectInfo),
Reason)))
ulFilter,
FILE_ACTION_MODIFIED);
}
- else
+ else if ( pParentObjectInfo != NULL)
{
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
NULL,
ulFilter,
FILE_ACTION_MODIFIED);
try_exit:
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
return ntStatus;
}
BOOLEAN bIsChild = FALSE;
AFSFcb *pCurrentFcb = Fcb;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
while( pCurrentFcb != NULL)
{
- if( pCurrentFcb->ObjectInformation->ParentObjectInformation == Dcb->ObjectInformation)
+ if( BooleanFlagOn( pCurrentFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pCurrentFcb->ObjectInformation->ParentFileId, &Dcb->ObjectInformation->FileId))
{
bIsChild = TRUE;
break;
}
- pCurrentFcb = pCurrentFcb->ObjectInformation->ParentObjectInformation->Fcb;
+ pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
+ &pCurrentFcb->ObjectInformation->ParentFileId);
+
+ if ( pParentObjectInfo != NULL)
+ {
+
+ pCurrentFcb = pParentObjectInfo->Fcb;
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+ else
+ {
+
+ pCurrentFcb = NULL;
+ }
}
return bIsChild;
pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
- pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
-
- pObjectInfo->ParentObjectInformation = ParentObjectInfo;
-
if( ParentObjectInfo != NULL)
{
+ pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
+
+ pObjectInfo->ParentFileId = ParentObjectInfo->FileId;
+
+ SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
lCount = AFSObjectInfoIncrement( ParentObjectInfo,
AFS_OBJECT_REFERENCE_CHILD);
if( HashIndex != 0)
{
+ ASSERT( ParentObjectInfo);
+
//
// Insert the entry into the object tree and list
//
return lCount;
}
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
+ IN AFSFileID *FileId)
+{
+ DWORD ntStatus = STATUS_SUCCESS;
+ ULONGLONG ullIndex;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+
+ if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
+ {
+ pObjectInfo = &VolumeCB->ObjectInformation;
+ }
+ else
+ {
+
+ AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ ullIndex = AFSCreateLowIndex( FileId);
+
+ ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pObjectInfo);
+
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+ }
+
+ if ( NT_SUCCESS( ntStatus)) {
+
+ AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+ }
+
+ return pObjectInfo;
+}
+
+void
+AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
+{
+
+ AFSObjectInfoDecrement( *ppObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+
+ *ppObjectInfo = NULL;
+}
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
{
BOOLEAN bAcquiredTreeLock = FALSE;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
LONG lCount;
if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
bAcquiredTreeLock = TRUE;
}
+ if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+ &ObjectInfo->ParentFileId);
+ }
+
//
// Remove it from the tree and list if it was inserted
//
}
}
- if( ObjectInfo->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation,
+ lCount = AFSObjectInfoDecrement( pParentObjectInfo,
AFS_OBJECT_REFERENCE_CHILD);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
- ObjectInfo->ParentObjectInformation,
+ pParentObjectInfo,
lCount);
}
if ( ntStatus == STATUS_NOT_A_DIRECTORY)
{
- if ( pCurrentObject->ParentObjectInformation == NULL)
+ if ( !BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
pCurrentObject->FileId.Volume,
pCurrentObject->FileId.Vnode,
pCurrentObject->FileId.Unique,
- pCurrentObject->ParentObjectInformation->FileId.Cell,
- pCurrentObject->ParentObjectInformation->FileId.Volume,
- pCurrentObject->ParentObjectInformation->FileId.Vnode,
- pCurrentObject->ParentObjectInformation->FileId.Unique,
+ pCurrentObject->ParentFileId.Cell,
+ pCurrentObject->ParentFileId.Volume,
+ pCurrentObject->ParentFileId.Vnode,
+ pCurrentObject->ParentFileId.Unique,
ntStatus);
}
}
// on the entry
//
- pParentObjectInfo = pCurrentObject->ParentObjectInformation;
+ if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB,
+ &pCurrentObject->ParentFileId);
+ }
ASSERT( pParentObjectInfo != NULL);
AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock);
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+
//
// We deleted the dir entry so check if there is any remaining portion
// of the name to process.
RtlZeroMemory( &stParentFID,
sizeof( AFSFileID));
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
//
// The parent directory FID of the node
//
- ASSERT( pFcb->ObjectInformation->ParentObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY);
-
- stParentFID = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+ stParentFID = pFcb->ObjectInformation->ParentFileId;
}
//
RtlZeroMemory( &stParentFID,
sizeof( AFSFileID));
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
//
// The parent directory FID of the node
//
- stParentFID = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+ stParentFID = pFcb->ObjectInformation->ParentFileId;
}
//
// Tell the server
//
- ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentObjectInformation->FileId,
+ ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentFileId,
Fcb->ObjectInformation,
&pCcb->AuthGroup);
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo);
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB * VolumeCB,
+ IN AFSFileID * FileID);
+
+void
+AFSReleaseObjectInfo( IN OUT AFSObjectInfoCB **ppObjectInfo);
+
NTSTATUS
AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
OUT AFSDirectoryCB **TargetDirEntry);
#define AFS_OBJECT_HELD_IN_SERVICE 0x00000080
#define AFS_OBJECT_ROOT_VOLUME 0x00000100
#define AFS_OBJECT_FLAGS_VERIFY_DATA 0x00000200
+#define AFS_OBJECT_FLAGS_PARENT_FID 0x00000400
//
// Object information reference count reasons
#define AFS_OBJECT_REFERENCE_EXTENTS 4
#define AFS_OBJECT_REFERENCE_WORKER 5
#define AFS_OBJECT_REFERENCE_STATUS 6
-// unused 7
+#define AFS_OBJECT_REFERENCE_FIND 7
#define AFS_OBJECT_REFERENCE_MAX 8
//
// Parent object information
//
- struct _AFS_OBJECT_INFORMATION_CB *ParentObjectInformation;
+ AFSFileID ParentFileId;
//
// Pointer to the current Fcb, if available