SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_DELETED);
+ ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+
pParentObjectInfo = pObjectInfo->ParentObjectInformation;
ASSERT( pParentObjectInfo != NULL);
AFSFlushExtents( pFcb,
&pCcb->AuthGroup);
+
+ ulNotificationFlags |= AFS_REQUEST_FLAG_FLUSH_FILE;
}
if( pFcb->OpenHandleCount == 1)
AFSWaitOnQueuedFlushes( pFcb);
- ulNotificationFlags |= AFS_REQUEST_FLAG_FLUSH_FILE;
-
AFSTearDownFcbExtents( pFcb,
&pCcb->AuthGroup);
}
stFileCleanup.FileAccess = pCcb->FileAccess;
//
+ // Remove the share access at this time since we may not get the close for sometime on this FO.
+ //
+
+ IoRemoveShareAccess( pFileObject,
+ &pFcb->ShareAccess);
+
+
+ //
+ // We don't need the name array after the user closes the handle on the file
+ //
+
+ if( pCcb->NameArray != NULL)
+ {
+
+ AFSFreeNameArray( pCcb->NameArray);
+
+ pCcb->NameArray = NULL;
+ }
+
+ //
+ // Release the Fcb Resource across the call to the service
+ // which may block for quite a while if flushing of the
+ // data is required.
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
+ //
// Push the request to the service
//
pResultCB,
&ulResultLen);
+ //
+ // Regain exclusive access to the Fcb
+ //
+
+ AFSAcquireExcl( &pFcb->NPFcb->Resource,
+ TRUE);
+
if ( NT_SUCCESS( ntStatus))
{
}
//
- // Remove the share access at this time since we may not get the close for sometime on this FO.
- //
-
- IoRemoveShareAccess( pFileObject,
- &pFcb->ShareAccess);
-
- //
- // We don't need the name array after the user closes the handle on the file
- //
-
- if( pCcb->NameArray != NULL)
- {
-
- AFSFreeNameArray( pCcb->NameArray);
-
- pCcb->NameArray = NULL;
- }
-
- //
// Decrement the open child handle count
//
lCount);
}
- AFSReleaseResource( &pFcb->NPFcb->Resource);
+
+ lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanup (File) Decrement handle count on Fcb %08lX Cnt %d\n",
+ pFcb,
+ lCount);
if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE))
{
ClearFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
AFSPerformObjectInvalidate( pObjectInfo,
AFS_INVALIDATE_DATA_VERSION);
}
+ else
+ {
- lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanup (File) Decrement handle count on Fcb %08lX Cnt %d\n",
- pFcb,
- lCount);
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+ }
break;
}
SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_DELETED);
+ ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+
pParentObjectInfo = pObjectInfo->ParentObjectInformation;
ASSERT( pParentObjectInfo != NULL);
SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_DELETED);
+ ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+
pParentObjectInfo = pObjectInfo->ParentObjectInformation;
ASSERT( pParentObjectInfo != NULL);