HANDLE hCallingUser = OnBehalfOf;
ULONG ulExtensionLength = 0;
BOOLEAN bRetry = FALSE;
+ ULONGLONG ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
pIrpSp = IoGetCurrentIrpStackLocation( Irp);
if( !bPagingIo &&
( pFcb->Specific.File.ExtentRequestProcessId == 0 ||
- ( PsGetCurrentProcessId() != AFSSysProcess &&
- pFcb->Specific.File.ExtentRequestProcessId != (ULONGLONG)PsGetCurrentProcessId())))
+ ( ullProcessId != (ULONGLONG)AFSSysProcess &&
+ pFcb->Specific.File.ExtentRequestProcessId != ullProcessId)))
{
- pFcb->Specific.File.ExtentRequestProcessId = (ULONGLONG)PsGetCurrentProcessId();
+ pFcb->Specific.File.ExtentRequestProcessId = ullProcessId;
- if( pFcb->Specific.File.ExtentRequestProcessId == (ULONGLONG)AFSSysProcess)
+ if( ullProcessId == (ULONGLONG)AFSSysProcess)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
__FUNCTION__,
pFcb);
}
-
- pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
}
//
LARGE_INTEGER liCurrentTime, liLastRequestTime;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
PFILE_OBJECT pCacheFileObject = NULL;
+ BOOLEAN bDerefExtents = FALSE;
__Enter
{
bLocked= FALSE;
//
- // We will re-request the extents after 10 seconds of waiting for them
+ // We will re-request the extents after waiting for them
//
KeQueryTickCount( &liCurrentTime);
// Wait for it
//
- ntStatus = AFSWaitForExtentMapping ( pFcb );
+ ntStatus = AFSWaitForExtentMapping ( pFcb, pCcb);
if (!NT_SUCCESS(ntStatus))
{
AFSReferenceActiveExtents( pStartExtent,
extentsCount);
+ bDerefExtents = TRUE;
+
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNonCachedWrite Releasing(2) Fcb extents lock %08lX SHARED %08lX\n",
try_return( ntStatus);
}
- //
- // Since this is dirty we can mark the extents dirty now.
- // AFSMarkDirty will dereference the extents. Do not call
- // AFSDereferenceActiveExtents() in this code path.
- //
-
- AFSMarkDirty( pFcb,
- pStartExtent,
- extentsCount,
- &StartingByte);
+try_exit:
- if (!bPagingIo)
+ if( NT_SUCCESS( ntStatus) &&
+ pStartExtent != NULL &&
+ Irp->IoStatus.Information > 0)
{
+
//
- // This was an uncached user write - tell the server to do
- // the flush when the worker thread next wakes up
+ // Since this is dirty we can mark the extents dirty now.
+ // AFSMarkDirty will dereference the extents. Do not call
+ // AFSDereferenceActiveExtents() in this code path.
//
- pFcb->Specific.File.LastServerFlush.QuadPart = 0;
- }
- //
- // All done
- //
+ AFSMarkDirty( pFcb,
+ pStartExtent,
+ extentsCount,
+ &StartingByte,
+ bDerefExtents);
-try_exit:
+ if (!bPagingIo)
+ {
+ //
+ // This was an uncached user write - tell the server to do
+ // the flush when the worker thread next wakes up
+ //
+ pFcb->Specific.File.LastServerFlush.QuadPart = 0;
+ }
+ }
if( pCacheFileObject != NULL)
{
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)
{
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))
{
Fcb->Header.AllocationSize = liSaveAllocation;
}
+ AFSReleaseResource( &Fcb->NPFcb->PagingResource);
+
//
// DownConvert file resource to shared
//