/*
- * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Kernel Drivers, LLC.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
- * notice,
- * this list of conditions and the following disclaimer in the
- * documentation
- * and/or other materials provided with the distribution.
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
* - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
* nor the names of their contributors may be used to endorse or promote
* products derived from this software without specific prior written
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);
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+ pIrpSp->FileObject->FsContext2 = NULL;
+
//
// Send the close to the CM
//
RtlZeroMemory( &stParentFileId,
sizeof( AFSFileID));
- stParentFileId = pObjectInfo->ParentObjectInformation->FileId;
+ stParentFileId = pObjectInfo->ParentFileId;
//
// Issue the close request to the service
&pCcb->AuthGroup,
NULL,
&stParentFileId,
+ NULL,
+ 0,
(void *)&stPIOCtlClose,
sizeof( AFSPIOCtlOpenCloseRequestCB),
NULL,
NULL);
- pDirCB = pCcb->DirectoryCB;
-
//
// Remove the Ccb and de-allocate it
//
- ntStatus = AFSRemoveCcb( pFcb,
- 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);
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ if( pParentObjectInfo != NULL &&
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
+ {
+
+ 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);
+ pIrpSp->FileObject->FsContext = NULL;
- 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;
+ pIrpSp->FileObject->FsContext2;
//
// Remove the Ccb and de-allocate it
//
- ntStatus = AFSRemoveCcb( pFcb,
- 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);
+ pIrpSp->FileObject->FsContext = NULL;
- 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;
}
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+ pIrpSp->FileObject->FsContext2 = NULL;
+
//
// 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);
+
+ if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ //
+ // 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);
+ }
+ }
+ else
+ {
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+ }
+
pDirCB = pCcb->DirectoryCB;
//
+ // Steal the DirOpenReferenceCount from the Ccb
+ //
+
+ pCcb->DirectoryCB = NULL;
+
+ //
+ // Object the Parent ObjectInformationCB
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId,
+ FALSE);
+ }
+
+ //
+ // Remove the Ccb and de-allocate it
+ //
+
+ AFSRemoveCcb( pFcb,
+ pCcb);
+
+ //
// If this entry is deleted then remove the object from the volume tree
//
// 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);
+ ASSERT( pParentObjectInfo != NULL);
- AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
- 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 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 &&
+ pDirCB->NameArrayReferenceCount <= 0)
+ {
- AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
- TRUE);
+ 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));
- if( pObjectInfo->ObjectReferenceCount <= 0)
- {
+ //
+ // Remove and delete the directory entry from the parent list
+ //
+
+ AFSDeleteDirEntry( pParentObjectInfo,
+ &pDirCB);
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ 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);
+ }
}
- }
- 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
{
- ASSERT( pDirCB->OpenReferenceCount > 0);
+ lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
- InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
- 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,
- &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);
+ "AFSClose Decrement child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount));
}
- 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);
- }
-
- //
- // Remove the Ccb and de-allocate it
- //
-
- ntStatus = AFSRemoveCcb( pFcb,
- 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;
- }
+ pIrpSp->FileObject->FsContext = NULL;
//
// 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;
+
+ pIrpSp->FileObject->FsContext2 = NULL;
+
+ //
+ // 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));
stPipeClose.RootId = pObjectInfo->VolumeCB->ObjectInformation.FileId;
//
- // Issue the open request to the service
- //
-
- /*
- AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_CLOSE,
- AFS_REQUEST_FLAG_SYNCHRONOUS,
- &pFcb->AuthGroup,
- &pDirCB->NameInformation.FileName,
- NULL,
- (void *)&stPipeClose,
- sizeof( AFSPipeOpenCloseRequestCB),
- NULL,
- NULL);
- */
-
- //
// Remove the Ccb and de-allocate it
//
- ntStatus = AFSRemoveCcb( pFcb,
- 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);
+ pIrpSp->FileObject->FsContext = NULL;
- 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;
+ }
}
try_exit:
__except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
- "EXCEPTION - AFSClose\n");
+ "EXCEPTION - AFSClose\n"));
AFSDumpTraceFilesFnc();
}
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
return ntStatus;
}