AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
IN PIRP Irp)
{
-
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
- ULONG ulRequestType = 0;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFcb *pFcb = NULL;
AFSDeviceExt *pDeviceExt = NULL;
AFSCcb *pCcb = NULL;
AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSDirectoryCB *pDirCB = NULL;
+ LONG lCount;
__try
{
AFSPIOCtlOpenCloseRequestCB stPIOCtlClose;
AFSFileID stParentFileId;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Acquiring GlobalRoot lock %08lX EXCL %08lX\n",
+ "AFSClose Acquiring GlobalRoot lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->Resource,
TRUE);
RtlZeroMemory( &stParentFileId,
sizeof( AFSFileID));
- stParentFileId = pObjectInfo->ParentObjectInformation->FileId;
+ stParentFileId = pObjectInfo->ParentFileId;
//
// Issue the close request to the service
AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_CLOSE,
AFS_REQUEST_FLAG_SYNCHRONOUS,
- &pFcb->AuthGroup,
+ &pCcb->AuthGroup,
NULL,
&stParentFileId,
+ NULL,
+ 0,
(void *)&stPIOCtlClose,
sizeof( AFSPIOCtlOpenCloseRequestCB),
NULL,
NULL);
- pDirCB = pCcb->DirectoryCB;
-
//
// Remove the Ccb and de-allocate it
//
- ntStatus = AFSRemoveCcb( pCcb);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
-
- //
- // We can't actually fail a close operation so reset the status
- //
-
- ntStatus = STATUS_SUCCESS;
- }
-
- ASSERT( pDirCB->OpenReferenceCount > 0);
-
- InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (IOCtl) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirCB->NameInformation.FileName,
- pDirCB,
- pCcb,
- pDirCB->OpenReferenceCount);
+ AFSRemoveCcb( pFcb,
+ pCcb);
//
// 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,
+ FALSE);
+ }
+
+ if( pParentObjectInfo != NULL &&
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (IOCtl) Decrement child open ref count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ "AFSClose (IOCtl) Decrement child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount));
}
AFSReleaseResource( &pFcb->NPFcb->Resource);
- ASSERT( pFcb->OpenReferenceCount != 0);
-
- InterlockedDecrement( &pFcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (IOCtl) Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSClose (IOCtl) Decrement count on Fcb %p Cnt %d\n",
pFcb,
- pFcb->OpenReferenceCount);
+ lCount));
+
+ ASSERT( lCount >= 0);
break;
}
case AFS_ROOT_ALL:
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Acquiring Special Root ALL lock %08lX EXCL %08lX\n",
+ "AFSClose Acquiring Special Root ALL lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->Resource,
TRUE);
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
- pDirCB = pCcb->DirectoryCB;
-
//
// Remove the Ccb and de-allocate it
//
- ntStatus = AFSRemoveCcb( pCcb);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
-
- //
- // We can't actually fail a close operation so reset the status
- //
-
- ntStatus = STATUS_SUCCESS;
- }
-
- ASSERT( pDirCB->OpenReferenceCount > 0);
-
- InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Decrement (Root ALL) count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirCB->NameInformation.FileName,
- pDirCB,
- pCcb,
- pDirCB->OpenReferenceCount);
+ AFSRemoveCcb( pFcb,
+ pCcb);
AFSReleaseResource( &pFcb->NPFcb->Resource);
- ASSERT( pFcb->OpenReferenceCount > 0);
-
- InterlockedDecrement( &pFcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (RootAll) Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSClose (RootAll) Decrement count on Fcb %p Cnt %d\n",
pFcb,
- pFcb->OpenReferenceCount);
+ lCount));
+
+ ASSERT( lCount >= 0);
break;
}
case AFS_SYMBOLIC_LINK_FCB:
case AFS_MOUNT_POINT_FCB:
case AFS_DFS_LINK_FCB:
+ case AFS_INVALID_FCB:
{
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
// We may be performing some cleanup on the Fcb so grab it exclusive to ensure no collisions
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Acquiring Dcb lock %08lX EXCL %08lX\n",
+ "AFSClose Acquiring Dcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->Resource,
TRUE);
KeQueryTickCount( &pFcb->ObjectInformation->LastAccessCount);
+ if( pFcb->OpenReferenceCount == 1 &&
+ pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+ {
+
+ SetFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
+
+ //
+ // Attempt to tear down our extent list for the file
+ // If there are remaining dirty extents then attempt to
+ // flush them as well
+ //
+
+ if( pFcb->Specific.File.ExtentsDirtyCount)
+ {
+
+ AFSFlushExtents( pFcb,
+ &pCcb->AuthGroup);
+ }
+
+ //
+ // Wait for any outstanding queued flushes to complete
+ //
+
+ AFSWaitOnQueuedFlushes( pFcb);
+
+ ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
+ pFcb->Specific.File.QueuedFlushCount == 0);
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
+ //
+ // Tear 'em down, we'll not be needing them again
+ //
+
+ AFSTearDownFcbExtents( pFcb,
+ &pCcb->AuthGroup);
+ }
+ else
+ {
+
+ if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
+ pFcb->Specific.File.ExtentsDirtyCount &&
+ (pCcb->GrantedAccess & FILE_WRITE_DATA))
+ {
+
+ AFSFlushExtents( pFcb,
+ &pCcb->AuthGroup);
+ }
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+ }
+
pDirCB = pCcb->DirectoryCB;
//
- // Remove the Ccb and de-allocate it
+ // Steal the DirOpenReferenceCount from the Ccb
//
- ntStatus = AFSRemoveCcb( pCcb);
+ pCcb->DirectoryCB = NULL;
- if( !NT_SUCCESS( ntStatus))
+ //
+ // Object the Parent ObjectInformationCB
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSClose Failed to remove Ccb from Fcb Status %08lX\n",
- ntStatus);
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId,
+ FALSE);
+ }
- //
- // We can't actually fail a close operation so reset the status
- //
+ //
+ // Remove the Ccb and de-allocate it
+ //
- ntStatus = STATUS_SUCCESS;
- }
+ AFSRemoveCcb( pFcb,
+ pCcb);
//
// If this entry is deleted then remove the object from the volume tree
if( BooleanFlagOn( pDirCB->Flags, AFS_DIR_ENTRY_DELETED))
{
- if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+ if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
+ pObjectInfo->Links == 0)
{
//
// Stop anything possibly in process
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Acquiring Fcb extents lock %08lX EXCL %08lX\n",
+ "AFSClose Acquiring Fcb extents lock %p EXCL %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
TRUE);
0,
FALSE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Releasing Fcb extents lock %08lX EXCL %08lX\n",
+ "AFSClose Releasing Fcb extents lock %p EXCL %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
}
- AFSAcquireExcl( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
- AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ ASSERT( pParentObjectInfo != NULL);
- if ( pDirCB->OpenReferenceCount == 0)
+ if ( pParentObjectInfo != NULL)
{
- AFSDbgLogMsg( 0,
- 0,
- "AFSClose (Other) OpenReferenceCount is Zero on DE %08lX Ccb %08lX FileName %wZ\n",
- pDirCB,
- pCcb,
- &pDirCB->NameInformation.FileName);
- }
-
- ASSERT( pDirCB->OpenReferenceCount > 0);
-
- InterlockedDecrement( &pDirCB->OpenReferenceCount);
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- 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,
- pDirCB->OpenReferenceCount);
+ AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
- if( pDirCB->OpenReferenceCount == 0)
- {
+ lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Deleting dir entry %08lX (%08lX) for %wZ\n",
+ "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirCB->NameInformation.FileName,
pDirCB,
- pObjectInfo,
- &pDirCB->NameInformation.FileName);
-
- //
- // Remove and delete the directory entry from the parent list
- //
+ pCcb,
+ lCount));
- AFSDeleteDirEntry( pObjectInfo->ParentObjectInformation,
- pDirCB);
+ ASSERT( lCount >= 0);
- if( pObjectInfo->ObjectReferenceCount == 0)
+ if( lCount == 0 &&
+ pDirCB->NameArrayReferenceCount <= 0)
{
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ AFSDbgTrace(( 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));
+
+ //
+ // Remove and delete the directory entry from the parent list
+ //
+
+ AFSDeleteDirEntry( pParentObjectInfo,
+ &pDirCB);
+
+ AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ if( pObjectInfo->ObjectReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Removing object %08lX from volume tree\n",
- pObjectInfo);
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ {
+
+ AFSDbgTrace(( 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);
+ }
}
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+ 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
{
- ASSERT( pDirCB->OpenReferenceCount > 0);
-
- InterlockedDecrement( &pDirCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSClose (Other2) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirCB->NameInformation.FileName,
pDirCB,
pCcb,
- pDirCB->OpenReferenceCount);
+ lCount));
+
+ ASSERT( lCount >= 0);
}
//
//
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_FCB_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Decrement child open ref count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
- }
-
- if( pFcb->OpenReferenceCount == 1 &&
- pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
- {
-
- SetFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
-
- //
- // Attempt to tear down our extent list for the file
- // If there are remaining dirty extents then attempt to
- // flush them as well
- //
-
- if( pFcb->Specific.File.ExtentsDirtyCount)
- {
-
- AFSFlushExtents( pFcb);
- }
-
- //
- // Wait for any outstanding queued flushes to complete
- //
-
- AFSWaitOnQueuedFlushes( pFcb);
-
- ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
- pFcb->Specific.File.QueuedFlushCount == 0);
-
- AFSReleaseResource( &pFcb->NPFcb->Resource);
-
- //
- // Tear 'em down, we'll not be needing them again
- //
-
- if( AFSTearDownFcbExtents( pFcb))
- {
-
- //
- // Indicate to the service that the file required complete flushing to the
- // server.
- //
-
- AFSProcessRequest( AFS_REQUEST_TYPE_FLUSH_FILE,
- AFS_REQUEST_FLAG_SYNCHRONOUS,
- &pFcb->AuthGroup,
- NULL,
- &pFcb->ObjectInformation->FileId,
- NULL,
- 0,
- NULL,
- NULL);
- }
- }
- else
- {
-
- if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
- {
-
- if( pFcb->Specific.File.ExtentsDirtyCount)
- {
-
- AFSFlushExtents( pFcb);
- }
- }
-
- AFSReleaseResource( &pFcb->NPFcb->Resource);
+ "AFSClose Decrement child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount));
}
//
// Decrement the reference count on the Fcb. this is protecting it from teardown.
//
- ASSERT( pFcb->OpenReferenceCount != 0);
-
- InterlockedDecrement( &pFcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSClose Decrement count on Fcb %p Cnt %d\n",
pFcb,
- pFcb->OpenReferenceCount);
+ lCount));
+
+ ASSERT( lCount >= 0);
break;
}
AFSPipeOpenCloseRequestCB stPipeClose;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+ //
+ // Object the Parent ObjectInformationCB
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId,
+ FALSE);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose Acquiring Special Share lock %08lX EXCL %08lX\n",
+ "AFSClose Acquiring Special Share lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pFcb->NPFcb->Resource,
TRUE);
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
- pDirCB = pCcb->DirectoryCB;
-
RtlZeroMemory( &stPipeClose,
sizeof( AFSPipeOpenCloseRequestCB));
&pFcb->AuthGroup,
&pDirCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
(void *)&stPipeClose,
sizeof( AFSPipeOpenCloseRequestCB),
NULL,
// Remove the Ccb and de-allocate it
//
- ntStatus = AFSRemoveCcb( pCcb);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
-
- //
- // We can't actually fail a close operation so reset the status
- //
-
- ntStatus = STATUS_SUCCESS;
- }
-
- ASSERT( pDirCB->OpenReferenceCount > 0);
-
- InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (Share) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirCB->NameInformation.FileName,
- pDirCB,
- pCcb,
- pDirCB->OpenReferenceCount);
+ AFSRemoveCcb( pFcb,
+ pCcb);
//
// 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)
{
- InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (Share) Decrement child open ref count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ "AFSClose (Share) Decrement child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ lCount));
}
AFSReleaseResource( &pFcb->NPFcb->Resource);
- ASSERT( pFcb->OpenReferenceCount != 0);
-
- InterlockedDecrement( &pFcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSClose (Share) Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSClose (Share) Decrement count on Fcb %p Cnt %d\n",
pFcb,
- pFcb->OpenReferenceCount);
+ lCount));
+
+ ASSERT( lCount >= 0);
break;
}
default:
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSClose Processing unknown node type %d\n",
- pFcb->Header.NodeTypeCode);
+ pFcb->Header.NodeTypeCode));
break;
}
AFSCompleteRequest( Irp,
ntStatus);
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
- "EXCEPTION - AFSClose\n");
+ "EXCEPTION - AFSClose\n"));
+
+ AFSDumpTraceFilesFnc();
+ }
+
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
}
return ntStatus;