AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
IN PIRP Irp)
{
-
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
IO_STACK_LOCATION *pIrpSp;
FILE_OBJECT *pFileObject = NULL;
NOTHING;
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
"EXCEPTION - AFSCreate\n");
ntStatus = STATUS_ACCESS_DENIED;
+
+ AFSDumpTraceFilesFnc();
}
//
AFSDeviceExt *pDeviceExt = NULL;
BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
PACCESS_MASK pDesiredAccess = NULL;
- UNICODE_STRING uniComponentName, uniPathName, uniRootFileName, uniParsedFileName;
+ UNICODE_STRING uniComponentName, uniRootFileName, uniParsedFileName;
UNICODE_STRING uniSubstitutedPathName;
UNICODE_STRING uniRelativeName;
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
ULONG ulParseFlags = 0;
- GUID stAuthGroup;
+ GUID stAuthGroup = {0};
ULONG ulNameProcessingFlags = 0;
BOOLEAN bOpenedReparsePoint = FALSE;
+ LONG lCount;
__Enter
{
(ULONGLONG)PsGetCurrentThreadId(),
&stAuthGroup);
+ //
+ // If we are in shutdown mode then fail the request
+ //
+
+ if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSCommonCreate (%08lX) Open request after shutdown\n",
+ Irp);
+
+ try_return( ntStatus = STATUS_TOO_LATE);
+ }
+
if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
{
}
//
- // If we are in shutdown mode then fail the request
- //
-
- if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSCommonCreate (%08lX) Open request after shutdown\n",
- Irp);
-
- try_return( ntStatus = STATUS_TOO_LATE);
- }
-
- //
// Go and parse the name for processing.
// If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
// then we are responsible for releasing the uniRootFileName.Buffer.
"AFSCommonCreate Failed to open root Status %08lX\n",
ntStatus);
- InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
&AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
AFSGlobalRoot->DirectoryCB,
NULL,
- AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
try_return( ntStatus);
}
//
- // We have our root node shared
+ // We have a reference on the root volume
//
bReleaseVolume = TRUE;
// Perform in this order to prevent thrashing
//
- InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirectoryCB->NameInformation.FileName,
pParentDirectoryCB,
NULL,
- pParentDirectoryCB->OpenReferenceCount);
+ lCount);
//
// Do NOT decrement the reference count on the pDirectoryCB yet.
//
// It is now safe to drop the Reference Count
//
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
if( !NT_SUCCESS( ntStatus))
// Decrement the reference on the parent
//
- InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirectoryCB->NameInformation.FileName,
pParentDirectoryCB,
NULL,
- pParentDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
try_return( ntStatus);
// fail with collision
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
- &pDirectoryCB->NameInformation.FileName,
- ntStatus);
-
if( pDirectoryCB != NULL)
{
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
+ &pDirectoryCB->NameInformation.FileName,
+ ntStatus);
+
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
else
{
- InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Object name collision on create Status %08lX\n",
+ ntStatus);
+
+ lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirectoryCB->NameInformation.FileName,
pParentDirectoryCB,
NULL,
- pParentDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
// Dereference the parent entry
//
- InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
&pParentDirectoryCB->NameInformation.FileName,
pParentDirectoryCB,
NULL,
- pParentDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
try_return( ntStatus);
}
if( pDirectoryCB != NULL)
{
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
else
{
- InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirectoryCB->NameInformation.FileName,
pParentDirectoryCB,
NULL,
- pParentDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
}
"AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
Irp);
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
try_return( ntStatus = STATUS_CANNOT_DELETE);
}
"AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
Irp);
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
try_return( ntStatus = STATUS_INVALID_PARAMETER);
}
pVolumeCB->ObjectInformation.FileId.Volume,
ntStatus);
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
try_return( ntStatus);
&pDirectoryCB->NameInformation.FileName,
ntStatus);
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
try_return( ntStatus);
&pDirectoryCB->NameInformation.FileName,
ntStatus);
- InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
&pDirectoryCB->NameInformation.FileName,
pDirectoryCB,
NULL,
- pDirectoryCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
}
try_exit:
if( pCcb != NULL)
{
+ AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+ TRUE);
+
+ RtlCopyMemory( &pCcb->AuthGroup,
+ &stAuthGroup,
+ sizeof( GUID));
+
//
// If we have a substitute name, then use it
//
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
+ "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
&pCcb->DirectoryCB->NameInformation.FileName,
pCcb->DirectoryCB,
pCcb,
- pCcb->DirectoryCB->OpenReferenceCount);
+ lCount = pCcb->DirectoryCB->DirOpenReferenceCount);
- ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
+ ASSERT( lCount >= 0);
pCcb->CurrentDirIndex = 0;
pCcb->NameArray = pNameArray;
pNameArray = NULL;
+
+ AFSReleaseResource( &pCcb->NPCcb->CcbLock);
}
//
ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
- RtlCopyMemory( &pFcb->AuthGroup,
- &stAuthGroup,
- sizeof( GUID));
-
//
// For files perform additional processing
//
- if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+ switch( pFcb->Header.NodeTypeCode)
{
- pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+
+ case AFS_FILE_FCB:
+ case AFS_IOCTL_FCB:
+ {
+
+ pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+ }
}
//
//
KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
+
+ if( pCcb != NULL)
+ {
+ AFSInsertCcb( pFcb,
+ pCcb);
+ }
}
else
{
if( uniSubstitutedPathName.Buffer != NULL)
{
- AFSExFreePool( uniSubstitutedPathName.Buffer);
+ AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
}
if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
{
- AFSExFreePool( uniRootFileName.Buffer);
+ AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
}
if( bReleaseVolume)
{
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
-
- AFSReleaseResource( pVolumeCB->VolumeLock);
+ lCount);
}
//
}
NTSTATUS
-AFSOpenRedirector( IN PIRP Irp,
- IN AFSFcb **Fcb,
- IN AFSCcb **Ccb)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- __Enter
- {
-
- //
- // Initialize the Ccb for the file.
- //
-
- ntStatus = AFSInitCcb( Ccb);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRedirector (%08lX) Failed to allocate Ccb\n",
- Irp);
-
- try_return( ntStatus);
- }
-
- //
- // Setup the Ccb
- //
-
- (*Ccb)->DirectoryCB = AFSRedirectorRoot->DirectoryCB;
-
- //
- // Increment the open count on this Fcb
- //
-
- InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenRedirector Increment count on Fcb %08lX Cnt %d\n",
- AFSRedirectorRoot->RootFcb,
- AFSRedirectorRoot->RootFcb->OpenReferenceCount);
-
- InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenHandleCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenRedirector Increment handle count on Fcb %08lX Cnt %d\n",
- AFSRedirectorRoot->RootFcb,
- AFSRedirectorRoot->RootFcb->OpenHandleCount);
-
- *Fcb = AFSRedirectorRoot->RootFcb;
-
- InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
-
- //
- // Return the open result for this file
- //
-
- Irp->IoStatus.Information = FILE_OPENED;
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
AFSOpenAFSRoot( IN PIRP Irp,
IN AFSFcb **Fcb,
IN AFSCcb **Ccb)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ LONG lCount;
__Enter
{
// Increment the open count on this Fcb
//
- InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
+ lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
AFSGlobalRoot->RootFcb,
- AFSGlobalRoot->RootFcb->OpenReferenceCount);
+ lCount);
- InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
+ lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
AFSGlobalRoot->RootFcb,
- AFSGlobalRoot->RootFcb->OpenHandleCount);
+ lCount);
*Fcb = AFSGlobalRoot->RootFcb;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
+ ULONG ulOptions;
BOOLEAN bAllocatedCcb = FALSE;
BOOLEAN bReleaseFcb = FALSE;
AFSFileOpenCB stOpenCB;
AFSFileOpenResultCB stOpenResultCB;
ULONG ulResultLen = 0;
+ LONG lCount;
__Enter
{
pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
+ ulOptions = pIrpSp->Parameters.Create.Options;
pFileObject = pIrpSp->FileObject;
+ if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
+ {
+
+ ntStatus = STATUS_FILE_IS_A_DIRECTORY;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSOpenRoot (%08lX) Attempt to open root as file Status %08lX\n",
+ Irp,
+ ntStatus);
+
+ try_return( ntStatus);
+ }
+
//
// Check if we should go and retrieve updated information for the node
//
ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
AuthGroup,
- TRUE,
- FALSE);
+ FALSE,
+ TRUE);
if( !NT_SUCCESS( ntStatus))
{
{
RtlStringFromGUID( *AuthGroup,
&uniGUID);
- }
+ }
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
(*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
+ (*Ccb)->GrantedAccess = *pDesiredAccess;
+
//
// OK, update the share access on the fileobject
//
// Increment the open count on this Fcb
//
- InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
+ lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
VolumeCB->RootFcb,
- VolumeCB->RootFcb->OpenReferenceCount);
+ lCount);
- InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
+ lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
VolumeCB->RootFcb,
- VolumeCB->RootFcb->OpenHandleCount);
+ lCount);
//
// Indicate the object is held
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
+ AFSRemoveCcb( NULL,
+ *Ccb);
*Ccb = NULL;
}
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
ULONG ulOptions = 0;
- ULONG ulShareMode = 0;
- ULONG ulAccess = 0;
ULONG ulAttributes = 0;
- LARGE_INTEGER liAllocationSize = {0,0};
BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
- BOOLEAN bAllocatedFcb = FALSE;
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
AFSDirectoryCB *pDirEntry = NULL;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
__Enter
{
"AFSProcessCreate Request failed due to read only volume %wZ\n",
FullFileName);
- try_return( ntStatus = STATUS_ACCESS_DENIED);
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
}
pParentObjectInfo = ParentDirCB->ObjectInformation;
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
- Irp,
- &pDirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- ntStatus);
+ if ( ntStatus == STATUS_NOT_A_DIRECTORY)
+ {
+
+ if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) 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,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique,
+ ntStatus);
+ }
+ else if ( pObjectInfo->ParentObjectInformation == NULL)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) 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,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique,
+ ntStatus);
+ }
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pParentObjectInfo->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,
+ ntStatus);
+ }
+ }
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus);
+ }
try_return( ntStatus);
}
// We may have raced and the Fcb is already created
//
- if( pObjectInfo->Fcb != NULL)
- {
+ //
+ // Allocate and initialize the Fcb for the file.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
- Irp,
- FullFileName);
+ ntStatus = AFSInitFcb( pDirEntry);
- *Fcb = pObjectInfo->Fcb;
+ *Fcb = pObjectInfo->Fcb;
- AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
- TRUE);
- }
- else
+ if( !NT_SUCCESS( ntStatus))
{
- //
- // Allocate and initialize the Fcb for the file.
- //
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
+ Irp,
+ FullFileName,
+ ntStatus);
- ntStatus = AFSInitFcb( pDirEntry,
- Fcb);
+ try_return( ntStatus);
+ }
- if( !NT_SUCCESS( ntStatus))
- {
+ ntStatus = STATUS_SUCCESS;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
- Irp,
- FullFileName,
- ntStatus);
+ //
+ // Increment the open count on this Fcb
+ //
- try_return( ntStatus);
- }
+ lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
- bAllocatedFcb = TRUE;
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
+ *Fcb,
+ lCount);
bReleaseFcb = TRUE;
(*Ccb)->DirectoryCB = pDirEntry;
+ (*Ccb)->GrantedAccess = *pDesiredAccess;
+
//
// If this is a file, update the headers filesizes.
//
AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
*Ccb,
- (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
- (ULONG)FILE_ACTION_ADDED);
+ (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+ (ULONG)FILE_ACTION_ADDED);
(*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
}
AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
*Ccb,
- (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
- (ULONG)FILE_ACTION_ADDED);
+ (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
+ (ULONG)FILE_ACTION_ADDED);
}
else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
(*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
- (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
+ (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+ (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
{
//
AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
*Ccb,
- (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
- (ULONG)FILE_ACTION_ADDED);
+ (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
+ (ULONG)FILE_ACTION_ADDED);
}
//
pFileObject,
&(*Fcb)->ShareAccess);
- //
- // Increment the open count on this Fcb
- //
-
- InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
- *Fcb,
- (*Fcb)->OpenReferenceCount);
-
- InterlockedIncrement( &(*Fcb)->OpenHandleCount);
+ lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
(*Fcb),
- (*Fcb)->OpenHandleCount);
+ lCount);
//
// Increment the open reference and handle on the parent node
//
- InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount);
- InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount);
if( ulOptions & FILE_DELETE_ON_CLOSE)
{
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
+
+ lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Decrement count on Fcb %08lX Cnt %d\n",
+ *Fcb,
+ lCount);
+ }
+
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
+ AFSNotifyDelete( pDirEntry,
+ AuthGroup,
+ FALSE);
+
//
// Decrement the reference added during initialization of the DE
//
- InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
&pDirEntry->NameInformation.FileName,
pDirEntry,
- pDirEntry->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
//
// Pull the directory entry from the parent
pDirEntry,
FALSE); // Leave it in the enum list so the worker cleans it up
- AFSNotifyDelete( pDirEntry,
- FALSE);
-
//
// Tag the parent as needing verification
//
SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
+ AFSRemoveCcb( NULL,
+ *Ccb);
}
- if( bAllocatedFcb)
- {
-
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb)
{
-
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
BOOLEAN bAllocatedCcb = FALSE;
- BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
- AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
+ BOOLEAN bReleaseFcb = FALSE;
+ AFSObjectInfoCB *pParentObject = NULL;
UNICODE_STRING uniTargetName;
+ LONG lCount;
__Enter
{
//
// Make sure we have an Fcb for the access
+
+ //
+ // Allocate and initialize the Fcb for the file.
//
- if( pParentObject->Fcb != NULL)
- {
+ ntStatus = AFSInitFcb( ParentDirectoryCB);
- *Fcb = pParentObject->Fcb;
+ *Fcb = pParentObject->Fcb;
- AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
- TRUE);
- }
- else
+ if( !NT_SUCCESS( ntStatus))
{
- //
- // Allocate and initialize the Fcb for the file.
- //
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSOpenTargetDirectory (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
+ Irp,
+ &ParentDirectoryCB->NameInformation.FileName,
+ ntStatus);
- ntStatus = AFSInitFcb( ParentDirectoryCB,
- Fcb);
+ try_return( ntStatus);
+ }
- if( !NT_SUCCESS( ntStatus))
- {
+ ntStatus = STATUS_SUCCESS;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
- Irp,
- &ParentDirectoryCB->NameInformation.FileName,
- ntStatus);
+ //
+ // Increment the open count on this Fcb
+ //
- try_return( ntStatus);
- }
+ lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
- bAllocatedFcb = TRUE;
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
+ pParentObject->Fcb,
+ lCount);
bReleaseFcb = TRUE;
(*Ccb)->DirectoryCB = ParentDirectoryCB;
+ (*Ccb)->GrantedAccess = *pDesiredAccess;
+
if( TargetDirectoryCB != NULL &&
FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
TargetName,
&pParentObject->Fcb->ShareAccess);
}
- //
- // Increment the open count on this Fcb
- //
-
- InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
- pParentObject->Fcb,
- pParentObject->Fcb->OpenReferenceCount);
-
- InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
pParentObject->Fcb,
- pParentObject->Fcb->OpenHandleCount);
+ lCount);
//
// Increment the open reference and handle on the parent node
if( pParentObject->ParentObjectInformation != NULL)
{
- InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
pParentObject->ParentObjectInformation,
- pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount);
- InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
pParentObject->ParentObjectInformation,
- pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount);
}
try_exit:
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
+
+ lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Decrement count on Fcb %08lX Cnt %d\n",
+ pParentObject->Fcb,
+ lCount);
+ }
+
AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
}
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
+ AFSRemoveCcb( NULL,
+ *Ccb);
}
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- AFSRemoveFcb( pParentObject->Fcb);
-
- pParentObject->Fcb = NULL;
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb)
{
-
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
- BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
- ULONG ulAdditionalFlags = 0, ulOptions = 0;
+ BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
+ ULONG ulOptions = 0;
AFSFileOpenCB stOpenCB;
AFSFileOpenResultCB stOpenResultCB;
ULONG ulResultLen = 0;
AFSObjectInfoCB *pObjectInfo = NULL;
ULONG ulFileAccess = 0;
AFSFileAccessReleaseCB stReleaseFileAccess;
+ LONG lCount;
__Enter
{
ntStatus = AFSValidateEntry( DirectoryCB,
AuthGroup,
- TRUE,
- FALSE);
+ FALSE,
+ TRUE);
if( !NT_SUCCESS( ntStatus))
{
{
ntStatus = AFSNotifyDelete( DirectoryCB,
+ AuthGroup,
TRUE);
if( !NT_SUCCESS( ntStatus))
// Be sure we have an Fcb for the current object
//
- if( pObjectInfo->Fcb == NULL)
- {
-
- ntStatus = AFSInitFcb( DirectoryCB,
- &pObjectInfo->Fcb);
+ ntStatus = AFSInitFcb( DirectoryCB);
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
- Irp,
- &DirectoryCB->NameInformation.FileName,
- ntStatus);
+ if( !NT_SUCCESS( ntStatus))
+ {
- try_return( ntStatus);
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
+ Irp,
+ &DirectoryCB->NameInformation.FileName,
+ ntStatus);
- bAllocatedFcb = TRUE;
+ try_return( ntStatus);
}
- else
- {
- AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
- TRUE);
- }
+ ntStatus = STATUS_SUCCESS;
+
+ //
+ // AFSInitFcb returns the Fcb resource held
+ //
bReleaseFcb = TRUE;
//
- // Reference the Fcb so it won't go away while we call into the service for processing
+ // Increment the open count on this Fcb
//
- InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenReferenceCount);
+ lCount);
//
// Check access on the entry
BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
{
- if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- MmFlushForWrite))
+ BOOLEAN bMmFlushed;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOpen Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ MmFlushForWrite);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOpen Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ if ( !bMmFlushed)
{
ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
}
else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
- pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
+ pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+ pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
{
}
(*Ccb)->FileAccess = ulFileAccess;
+ (*Ccb)->GrantedAccess = *pDesiredAccess;
+
//
// Perform the access check on the target if this is a mount point or symlink
//
&pObjectInfo->Fcb->ShareAccess);
}
- //
- // Increment the open count on this Fcb
- //
-
- InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenReferenceCount);
-
- InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
+ lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenHandleCount);
+ lCount);
//
// Increment the open reference and handle on the parent node
//
- InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount);
- InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount);
if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
{
if( bReleaseFcb)
{
- //
- // Remove the reference we added initially
- //
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
- InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Decrement count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOpen Decrement2 count on Fcb %08lX Cnt %d\n",
+ pObjectInfo->Fcb,
+ lCount);
+ }
AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
}
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
+ AFSRemoveCcb( NULL,
+ *Ccb);
}
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb)
{
-
+ UNREFERENCED_PARAMETER(DeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PFILE_OBJECT pFileObject = NULL;
LARGE_INTEGER liZero = {0,0};
BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
ULONG ulAttributes = 0;
- LARGE_INTEGER liTime;
ULONG ulCreateDisposition = 0;
- BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
+ BOOLEAN bAllocatedCcb = FALSE;
+ BOOLEAN bUserMapped = FALSE;
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
+ LARGE_INTEGER liSaveSize;
+ LARGE_INTEGER liSaveVDL;
+ LARGE_INTEGER liSaveAlloc;
__Enter
{
pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
+
usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
pFileObject = pIrpSp->FileObject;
Irp,
&DirectoryCB->NameInformation.FileName);
- try_return( ntStatus = STATUS_ACCESS_DENIED);
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
}
pParentObjectInfo = ParentDirCB->ObjectInformation;
ntStatus = AFSValidateEntry( DirectoryCB,
AuthGroup,
- TRUE,
- FALSE);
+ FALSE,
+ TRUE);
if( !NT_SUCCESS( ntStatus))
{
// Be sure we have an Fcb for the object block
//
- if( pObjectInfo->Fcb == NULL)
- {
-
- ntStatus = AFSInitFcb( DirectoryCB,
- Fcb);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
- Irp,
- &DirectoryCB->NameInformation.FileName,
- ntStatus);
+ ntStatus = AFSInitFcb( DirectoryCB);
- try_return( ntStatus);
- }
+ *Fcb = pObjectInfo->Fcb;
- bAllocatedFcb = TRUE;
- }
- else
+ if( !NT_SUCCESS( ntStatus))
{
- AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
- TRUE);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
+ Irp,
+ &DirectoryCB->NameInformation.FileName,
+ ntStatus);
+
+ try_return( ntStatus);
}
- bReleaseFcb = TRUE;
+ ntStatus = STATUS_SUCCESS;
//
- // Reference the Fcb so it won't go away while processing the request
+ // Increment the open count on this Fcb.
//
- InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenReferenceCount);
+ lCount);
+
+ bReleaseFcb = TRUE;
//
// Check access on the entry
}
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
//
// Before we actually truncate, check to see if the purge
// is going to fail.
//
- if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &liZero))
+ bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &liZero);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ if( bUserMapped)
{
ntStatus = STATUS_USER_MAPPED_FILE;
(*Ccb)->DirectoryCB = DirectoryCB;
+ (*Ccb)->GrantedAccess = *pDesiredAccess;
+
//
- // Need to purge any data currently in the cache
+ // Set the file length to zero
//
- CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
+ TRUE);
+
+ bReleasePaging = TRUE;
+
+ liSaveSize = pObjectInfo->Fcb->Header.FileSize;
+ liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
+ liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
KeQuerySystemTime( &pObjectInfo->LastAccessTime);
- //KeQuerySystemTime( &pObjectInfo->CreationTime);
-
KeQuerySystemTime( &pObjectInfo->LastWriteTime);
+ //
+ // Set the update flag accordingly
+ //
+
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
+ AFS_FCB_FLAG_UPDATE_CREATE_TIME |
+ AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
+ AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
+ AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
pObjectInfo,
AuthGroup);
if( !NT_SUCCESS( ntStatus))
{
+ pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
+ pObjectInfo->Fcb->Header.FileSize = liSaveSize;
+ pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
+ pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
+ pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
try_return( ntStatus);
}
- AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
- TRUE);
-
- bReleasePaging = TRUE;
-
- pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
-
- pFileObject->FsContext = (void *)pObjectInfo->Fcb;
-
- pFileObject->FsContext2 = (void *)*Ccb;
-
- //
- // Set the update flag accordingly
- //
-
- SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
- AFS_FCB_FLAG_UPDATE_CREATE_TIME |
- AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
- AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
- AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
-
- CcSetFileSizes( pFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
-
- AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
-
- bReleasePaging = FALSE;
-
ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
if( ulCreateDisposition == FILE_SUPERSEDE)
Irp->IoStatus.Information = FILE_OVERWRITTEN;
}
- //
- // Increment the open count on this Fcb.
- //
-
- InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenReferenceCount);
-
- InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
+ lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenHandleCount);
+ lCount);
//
// Increment the open reference and handle on the parent node
//
- InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount);
- InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
pObjectInfo->ParentObjectInformation,
- pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount);
+
+ AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
+
+ bReleaseFcb = FALSE;
*Fcb = pObjectInfo->Fcb;
+ //
+ // Now that the Fcb->Resource has been dropped
+ // we can call CcSetFileSizes. We are still holding
+ // the PagingIoResource
+ //
+
+ pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
+
+ pFileObject->FsContext = (void *)pObjectInfo->Fcb;
+
+ pFileObject->FsContext2 = (void *)*Ccb;
+
+ CcSetFileSizes( pFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
try_exit:
if( bReleasePaging)
if( bReleaseFcb)
{
- //
- // Remove the reference we added above to prevent tear down
- //
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb.
+ //
- InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Decrement count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- pObjectInfo->Fcb->OpenReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOverwriteSupersede Decrement2 count on Fcb %08lX Cnt %d\n",
+ pObjectInfo->Fcb,
+ lCount);
+ }
AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
}
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
+ AFSRemoveCcb( NULL,
+ *Ccb);
}
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
__Enter
{
- //
- // For now, jsut let the open happen
- //
-
- Irp->IoStatus.Information = FILE_OPENED;
+ if ( KernelMode == Irp->RequestorMode) {
+ //
+ // For now, just let the open happen
+ //
+ Irp->IoStatus.Information = FILE_OPENED;
+ }
+ else
+ {
+ //
+ // Not from usermode, All access must be via
+ // the FS component (which will do the
+ // security check)
+ //
+ ntStatus = STATUS_ACCESS_DENIED;
+ }
}
return ntStatus;
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
- UNICODE_STRING uniFullFileName;
+ BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
AFSFileID stFileID;
AFSObjectInfoCB *pParentObjectInfo = NULL;
+ LONG lCount;
__Enter
{
}
}
- if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
- {
-
- //
- // Allocate and initialize the Fcb for the file.
- //
+ //
+ // Allocate and initialize the Fcb for the file.
+ //
- ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
- Fcb);
+ ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
- if( !NT_SUCCESS( ntStatus))
- {
+ *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
- Irp,
- ntStatus);
+ if( !NT_SUCCESS( ntStatus))
+ {
- try_return( ntStatus);
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
+ Irp,
+ ntStatus);
- bAllocatedFcb = TRUE;
+ try_return( ntStatus);
}
- else
- {
- *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
+ ntStatus = STATUS_SUCCESS;
- AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
- TRUE);
- }
+ //
+ // Increment the open reference and handle on the node
+ //
+
+ lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
bReleaseFcb = TRUE;
// Reference the directory entry
//
- InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
+ lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->DirOpenReferenceCount));
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
&(*Ccb)->DirectoryCB->NameInformation.FileName,
(*Ccb)->DirectoryCB,
(*Ccb),
- (*Ccb)->DirectoryCB->OpenReferenceCount);
+ lCount);
//
- // Increment the open reference and handle on the node
+ // Increment the handle on the node
//
- InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
- (*Fcb),
- (*Fcb)->OpenReferenceCount);
-
- InterlockedIncrement( &(*Fcb)->OpenHandleCount);
+ lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
(*Fcb),
- (*Fcb)->OpenHandleCount);
+ lCount);
//
// Increment the open reference and handle on the parent node
//
- InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
pParentObjectInfo,
- pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+ lCount);
- InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
pParentObjectInfo,
- pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+ lCount);
//
// Return the open result for this file
// is already referenced
//
- InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &ParentDirCB->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
&ParentDirCB->NameInformation.FileName,
ParentDirCB,
NULL,
- ParentDirCB->OpenReferenceCount);
+ lCount);
+
+ ASSERT( lCount >= 0);
//
// If we created the Fcb we need to release the resources
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open reference and handle on the node
+ //
+
+ lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenIOCtlFcb Decrement count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+ }
+
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
-
- *Ccb = NULL;
+ AFSRemoveCcb( NULL,
+ *Ccb);
}
- if( bAllocatedFcb)
- {
-
- //
- // Need to tear down this Fcb since it is not in the tree for the worker thread
- //
-
- AFSRemoveFcb( *Fcb);
+ *Ccb = NULL;
- pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
-
- *Ccb = NULL;
}
}
BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSPipeOpenCloseRequestCB stPipeOpen;
+ LONG lCount;
__Enter
{
// Allocate and initialize the Fcb for the file.
//
- ntStatus = AFSInitFcb( DirectoryCB,
- Fcb);
+ ntStatus = AFSInitFcb( DirectoryCB);
+
+ *Fcb = DirectoryCB->ObjectInformation->Fcb;
if( !NT_SUCCESS( ntStatus))
{
try_return( ntStatus);
}
- bAllocateFcb = TRUE;
+ if ( ntStatus != STATUS_REPARSE)
+ {
+
+ bAllocateFcb = TRUE;
+ }
+
+ ntStatus = STATUS_SUCCESS;
}
else
{
TRUE);
}
+ //
+ // Increment the open count on this Fcb
+ //
+
+ lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+
bReleaseFcb = TRUE;
//
try_return( ntStatus);
}
- //
- // Increment the open count on this Fcb
- //
-
- InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
- (*Fcb),
- (*Fcb)->OpenReferenceCount);
-
- InterlockedIncrement( &(*Fcb)->OpenHandleCount);
+ lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
(*Fcb),
- (*Fcb)->OpenHandleCount);
+ lCount);
//
// Increment the open reference and handle on the parent node
//
- InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
pParentObjectInfo,
- pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+ lCount);
- InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
pParentObjectInfo,
- pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+ lCount);
//
// Return the open result for this file
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
+
+ lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenSpecialShareFcb Decrement count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+ }
+
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
if( bAllocatedCcb)
{
- AFSRemoveCcb( *Ccb);
-
- *Ccb = NULL;
+ AFSRemoveCcb( NULL,
+ *Ccb);
}
+ *Ccb = NULL;
+
if( bAllocateFcb)
{
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
- AFSRemoveFcb( *Fcb);
+ AFSAcquireExcl( &DirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);
- DirectoryCB->ObjectInformation->Fcb = NULL;
+ AFSReleaseResource( &DirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
-
- *Ccb = NULL;
}
}