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;
(*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->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)
pObjectInfo->ParentObjectInformation,
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)