__try
{
- ntStatus = AFSCommonWrite( AFSRDRDeviceObject, Irp, NULL);
+ ntStatus = AFSCommonWrite( AFSRDRDeviceObject, Irp, NULL, FALSE);
}
__except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
NTSTATUS
AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
- IN HANDLE OnBehalfOf)
+ IN HANDLE OnBehalfOf,
+ IN BOOLEAN bRetry)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
BOOLEAN bCompleteIrp = TRUE;
BOOLEAN bLockOK;
HANDLE hCallingUser = OnBehalfOf;
- BOOLEAN bRetry = FALSE;
ULONGLONG ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
pIrpSp = IoGetCurrentIrpStackLocation( Irp);
bNonCachedIo = FALSE;
}
- if ( !bNonCachedIo) {
+ if ( !bNonCachedIo && !bPagingIo)
+ {
- if( !bPagingIo)
+ if( pFileObject->PrivateCacheMap == NULL)
{
- if( pFileObject->PrivateCacheMap == NULL)
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonWrite Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pNPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pNPFcb->SectionObjectResource,
+ TRUE);
+
+ bReleaseSectionObject = TRUE;
+
+ __try
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &pNPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ "AFSCommonWrite Initialize caching on Fcb %p FileObject %p\n",
+ pFcb,
+ pFileObject);
- AFSAcquireExcl( &pNPFcb->SectionObjectResource,
- TRUE);
+ CcInitializeCacheMap( pFileObject,
+ (PCC_FILE_SIZES)&pFcb->Header.AllocationSize,
+ FALSE,
+ AFSLibCacheManagerCallbacks,
+ pFcb);
- bReleaseSectionObject = TRUE;
+ CcSetReadAheadGranularity( pFileObject,
+ pDeviceExt->Specific.RDR.MaximumRPCLength);
- __try
- {
+ CcSetDirtyPageThreshold( pFileObject,
+ AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Initialize caching on Fcb %p FileObject %p\n",
- pFcb,
- pFileObject);
+ ntStatus = GetExceptionCode();
- CcInitializeCacheMap( pFileObject,
- (PCC_FILE_SIZES)&pFcb->Header.AllocationSize,
- FALSE,
- AFSLibCacheManagerCallbacks,
- pFcb);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCommonWrite (%p) Exception thrown while initializing cache map Status %08lX\n",
+ Irp,
+ ntStatus);
+ }
- CcSetReadAheadGranularity( pFileObject,
- pDeviceExt->Specific.RDR.MaximumRPCLength);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonWrite Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pNPFcb->SectionObjectResource,
+ PsGetCurrentThread());
- CcSetDirtyPageThreshold( pFileObject,
- AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength);
- }
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
+ AFSReleaseResource( &pNPFcb->SectionObjectResource);
- ntStatus = GetExceptionCode();
+ bReleaseSectionObject = FALSE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%p) Exception thrown while initializing cache map Status %08lX\n",
- Irp,
- ntStatus);
- }
+ if( !NT_SUCCESS( ntStatus))
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Releasing Fcb SectionObject lock %p EXCL %08lX\n",
- &pNPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ try_return( ntStatus);
+ }
+ }
- AFSReleaseResource( &pNPFcb->SectionObjectResource);
+ if (!CcCanIWrite( pFileObject,
+ ulByteCount,
+ FALSE,
+ bRetry))
+ {
- bReleaseSectionObject = FALSE;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSCommonWrite (FO: %p) CcCanIWrite says No room for Offset %0I64X Length %08lX bytes! Deferring%s\n",
+ pFileObject,
+ liStartingByte.QuadPart,
+ ulByteCount,
+ bRetry ? " RETRY" : "");
+ ntStatus = AFSDeferWrite( DeviceObject, pFileObject, hCallingUser, Irp, ulByteCount, bRetry);
- if( !NT_SUCCESS( ntStatus))
- {
+ if ( STATUS_PENDING == ntStatus)
+ {
- try_return( ntStatus);
- }
+ bCompleteIrp = FALSE;
}
- }
+ else
+ {
- while (!CcCanIWrite( pFileObject,
- ulByteCount,
- FALSE,
- bRetry))
- {
- static const LONGLONG llWriteDelay = (LONGLONG)-100000;
- bRetry = TRUE;
- KeDelayExecutionThread(KernelMode, FALSE, (PLARGE_INTEGER)&llWriteDelay);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCommonWrite (FO: %p) AFSDeferWrite failure Status %08lX\n",
+ pFileObject,
+ ntStatus);
+ }
+
+ try_return( ntStatus);
}
}
AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%p) Processing CACHED request Offset %I64X Len %08lX\n",
+ "AFSCommonWrite (%p) Processing CACHED request Offset %0I64X Len %08lX%s\n",
Irp,
liStartingByte.QuadPart,
- ulByteCount);
+ ulByteCount,
+ bRetry ? " RETRY" : "");
ntStatus = AFSCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount, TRUE);
AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%p) Processing NON-CACHED request Offset %I64X Len %08lX\n",
+ "AFSCommonWrite (%p) Processing NON-CACHED request Offset %0I64X Len %08lX%s\n",
Irp,
liStartingByte.QuadPart,
- ulByteCount);
+ ulByteCount,
+ bRetry ? " RETRY" : "");
ntStatus = AFSNonCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount);
}
RtlZeroMemory( &stParentFID,
sizeof( AFSFileID));
- if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
//
// The parent directory FID of the node
//
- stParentFID = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+ stParentFID = pFcb->ObjectInformation->ParentFileId;
}
//
&pCcb->AuthGroup,
NULL,
&stParentFID,
+ NULL,
+ 0,
(void *)&stIORequestCB,
sizeof( AFSPIOCtlIORequestCB),
&stIOResultCB,
{
Irp->IoStatus.Information = 0;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX\n",
+ pFileObject,
+ StartingByte.HighPart,
+ StartingByte.LowPart,
+ ByteCount);
+
if (ByteCount > pDevExt->Specific.RDR.MaxIo.QuadPart)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite (%p) Successfully retrieved map extents count %08lX run count %08lX\n",
+ "AFSNonCachedWrite (%p) Successfully retrieved map extents count %d run count %d\n",
Irp,
extentsCount,
runCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite (%p) Completed request Status %08lX\n",
- Irp,
+ "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX Status %08lX\n",
+ pFileObject,
+ StartingByte.HighPart,
+ StartingByte.LowPart,
+ ByteCount,
ntStatus);
if (NT_SUCCESS(ntStatus) &&
// Tell the server
//
- ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentObjectInformation->FileId,
+ ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentFileId,
Fcb->ObjectInformation,
&pCcb->AuthGroup);
&pCcb->AuthGroup,
&pCcb->DirectoryCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
pIoRequest,
sizeof( AFSPipeIORequestCB) +
pIrpSp->Parameters.Write.Length,