// with an invalidation call from the service during AFSCleanupFcb
//
- AFSAcquireShared( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock,
- TRUE);
+ lCount = AFSObjectInfoIncrement( pCurrentChildObject);
- if( pCurrentChildObject->ObjectReferenceCount <= 0 &&
+ if( lCount == 1 &&
pCurrentChildObject->Fcb != NULL &&
pCurrentChildObject->FileType == AFS_FILE_TYPE_FILE)
{
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
//
+ // Cannot hold a TreeLock across an AFSCleanupFcb call
+ // as it can deadlock with an invalidation ioctl initiated
+ // from the service.
+ //
// Dropping the TreeLock permits the
// pCurrentObject->ObjectReferenceCount to change
//
TRUE);
}
- AFSReleaseResource( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock);
+ lCount = AFSObjectInfoDecrement( pCurrentChildObject);
AFSAcquireExcl( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock,
TRUE);
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
- if( pCurrentObject->Fcb != NULL)
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
+
+ if( lCount == 0 &&
+ pCurrentObject->Fcb != NULL)
{
//
}
}
+ lCount = AFSObjectInfoDecrement( pCurrentObject);
+
if( !AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
FALSE))
{