From fd161ec0e474485c6a1a43019b802e3b663098df Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 16 Apr 2012 14:47:38 -0400 Subject: [PATCH] Windows: Hold PagingResource across ExtendingWrite When the file allocation size changes the PagingResource must be held exclusively to prevent races. Change-Id: I6ff3a2061563dbb858bb284b463913f6d3b33e7a Reviewed-on: http://gerrit.openafs.org/7223 Reviewed-by: Peter Scott Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp index 5a94875f8..a9b5225fd 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp @@ -1657,6 +1657,15 @@ AFSExtendingWrite( IN AFSFcb *Fcb, NTSTATUS ntStatus = STATUS_SUCCESS; AFSCcb *pCcb = (AFSCcb *)FileObject->FsContext2; + AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSExtendingWrite Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n", + &Fcb->NPFcb->PagingResource, + PsGetCurrentThread()); + + AFSAcquireExcl( &Fcb->NPFcb->PagingResource, + TRUE); + if( NewLength > Fcb->Header.AllocationSize.QuadPart) { @@ -1681,12 +1690,6 @@ AFSExtendingWrite( IN AFSFcb *Fcb, Fcb->ObjectInformation, &pCcb->AuthGroup); - AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSExtendingWrite Acquiring Fcb lock %08lX EXCL %08lX\n", - &Fcb->NPFcb->Resource, - PsGetCurrentThread()); - if (NT_SUCCESS(ntStatus)) { @@ -1710,6 +1713,8 @@ AFSExtendingWrite( IN AFSFcb *Fcb, Fcb->Header.AllocationSize = liSaveAllocation; } + AFSReleaseResource( &Fcb->NPFcb->PagingResource); + // // DownConvert file resource to shared // -- 2.39.5