static
NTSTATUS
+AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN LARGE_INTEGER StartingByte,
+ IN ULONG ByteCount);
+
+static
+NTSTATUS
AFSExtendingWrite( IN AFSFcb *Fcb,
IN PFILE_OBJECT FileObject,
IN LONGLONG NewLength);
IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
__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 bPagingIo = FALSE;
BOOLEAN bNonCachedIo = FALSE;
BOOLEAN bReleaseMain = FALSE;
+ BOOLEAN bReleaseSectionObject = FALSE;
BOOLEAN bReleasePaging = FALSE;
BOOLEAN bExtendingWrite = FALSE;
+ BOOLEAN bSynchronousFo = FALSE;
BOOLEAN bCompleteIrp = TRUE;
+ BOOLEAN bForceFlush = FALSE;
BOOLEAN bLockOK;
- BOOLEAN bMapped = TRUE;
HANDLE hCallingUser = OnBehalfOf;
- ULONG ulExtensionLength = 0;
- BOOLEAN bRetry = FALSE;
ULONGLONG ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
pIrpSp = IoGetCurrentIrpStackLocation( Irp);
__Enter
{
+ Irp->IoStatus.Information = 0;
+
pFileObject = pIrpSp->FileObject;
//
if( pFcb == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite Attempted write (%08lX) when pFcb == NULL\n",
- Irp);
+ "AFSCommonWrite Attempted write (%p) when pFcb == NULL\n",
+ Irp));
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
}
if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSCommonWrite (%08lX) Open request after shutdown\n",
- Irp);
+ "AFSCommonWrite (%p) Open request after shutdown\n",
+ Irp));
try_return( ntStatus = STATUS_TOO_LATE);
}
bPagingIo = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
bNonCachedIo = BooleanFlagOn( Irp->Flags, IRP_NOCACHE);
ulByteCount = pIrpSp->Parameters.Write.Length;
+ bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
if( pFcb->Header.NodeTypeCode != AFS_IOCTL_FCB &&
pFcb->Header.NodeTypeCode != AFS_FILE_FCB &&
pFcb->Header.NodeTypeCode != AFS_SPECIAL_SHARE_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite Attempted write (%08lX) on an invalid node type %08lX\n",
+ "AFSCommonWrite Attempted write (%p) on an invalid node type %08lX\n",
Irp,
- pFcb->Header.NodeTypeCode);
+ pFcb->Header.NodeTypeCode));
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
}
if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) Processing file (PIOCTL) Offset %I64X Length %08lX Irp Flags %08lX\n",
+ "AFSCommonWrite (%p) Processing file (PIOCTL) Offset %0I64X Length %08lX Irp Flags %08lX\n",
Irp,
liStartingByte.QuadPart,
ulByteCount,
- Irp->Flags);
+ Irp->Flags));
ntStatus = AFSIOCtlWrite( DeviceObject,
Irp);
else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) Processing file (SHARE) Offset %I64X Length %08lX Irp Flags %08lX\n",
+ "AFSCommonWrite (%p) Processing file (SHARE) Offset %0I64X Length %08lX Irp Flags %08lX\n",
Irp,
liStartingByte.QuadPart,
ulByteCount,
- Irp->Flags);
+ Irp->Flags));
ntStatus = AFSShareWrite( DeviceObject,
Irp);
// Is the Cache not there yet? Exit.
//
if( !BooleanFlagOn( AFSLibControlFlags, AFS_REDIR_LIB_FLAGS_NONPERSISTENT_CACHE) &&
+ !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_REDIR_INIT_PERFORM_SERVICE_IO) &&
NULL == pDeviceExt->Specific.RDR.CacheFileObject)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Request failed due to AFS cache closed\n",
- Irp);
+ "AFSCommonWrite (%p) Request failed due to AFS cache closed\n",
+ Irp));
try_return( ntStatus = STATUS_TOO_LATE );
}
if( pFcb->ObjectInformation->VolumeCB != NULL &&
- BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+ BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Request failed due to read only volume\n",
- Irp);
+ "AFSCommonWrite (%p) Request failed due to read only volume\n",
+ Irp));
try_return( ntStatus = STATUS_ACCESS_DENIED);
}
if( ulByteCount == 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) Request completed due to zero length\n",
- Irp);
+ "AFSCommonWrite (%p) Request completed due to zero length\n",
+ Irp));
try_return( ntStatus);
}
if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Failing request due to INVALID fcb\n",
- Irp);
-
- Irp->IoStatus.Information = 0;
+ "AFSCommonWrite (%p) Failing request due to INVALID fcb\n",
+ Irp));
try_return( ntStatus = STATUS_FILE_DELETED);
}
BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Request failed due to file deleted\n",
- Irp);
+ "AFSCommonWrite (%p) Request failed due to file deleted\n",
+ Irp));
try_return( ntStatus = STATUS_FILE_DELETED);
}
if( FlagOn( pIrpSp->MinorFunction, IRP_MN_COMPLETE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) IRP_MN_COMPLETE being processed\n",
- Irp);
+ "AFSCommonWrite (%p) IRP_MN_COMPLETE being processed\n",
+ Irp));
CcMdlWriteComplete(pFileObject, &pIrpSp->Parameters.Write.ByteOffset, Irp->MdlAddress);
if( NULL != pFileObject->SectionObjectPointer->DataSectionObject && !bPagingIo && bNonCachedIo)
{
bNonCachedIo = FALSE;
+ bForceFlush = TRUE;
}
- if( (!bPagingIo && !bNonCachedIo))
+ if ( !bNonCachedIo && !bPagingIo)
{
if( pFileObject->PrivateCacheMap == NULL)
{
+ AFSDbgTrace(( 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_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Initialize caching on Fcb %08lX FileObject %08lX\n",
+ "AFSCommonWrite Initialize caching on Fcb %p FileObject %p\n",
pFcb,
- pFileObject);
+ pFileObject));
CcInitializeCacheMap( pFileObject,
(PCC_FILE_SIZES)&pFcb->Header.AllocationSize,
pDeviceExt->Specific.RDR.MaximumRPCLength);
CcSetDirtyPageThreshold( pFileObject,
- AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength);
+ AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
}
__except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Exception thrown while initializing cache map Status %08lX\n",
+ "AFSCommonWrite (%p) Exception thrown while initializing cache map Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonWrite Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pNPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pNPFcb->SectionObjectResource);
+
+ bReleaseSectionObject = FALSE;
+
if( !NT_SUCCESS( ntStatus))
{
try_return( ntStatus);
}
}
- }
- while (!bNonCachedIo && !CcCanIWrite( pFileObject,
- ulByteCount,
- FALSE,
- bRetry))
- {
- static const LONGLONG llWriteDelay = (LONGLONG)-100000;
- bRetry = TRUE;
- KeDelayExecutionThread(KernelMode, FALSE, (PLARGE_INTEGER)&llWriteDelay);
+ if (!CcCanIWrite( pFileObject,
+ ulByteCount,
+ FALSE,
+ bRetry))
+ {
+
+ AFSDbgTrace(( 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 ( STATUS_PENDING == ntStatus)
+ {
+
+ bCompleteIrp = FALSE;
+ }
+ else
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCommonWrite (FO: %p) AFSDeferWrite failure Status %08lX\n",
+ pFileObject,
+ ntStatus));
+ }
+
+ try_return( ntStatus);
+ }
}
//
if( ullProcessId == (ULONGLONG)AFSSysProcess)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"%s Setting LastWriterExtentProcessId to system process for Fcb %p\n",
__FUNCTION__,
- pFcb);
- }
- }
-
- //
- // We should be ready to go. So first of all ask for the extents
- // Provoke a get of the extents - if we need to.
- //
-
- /*
- if( !bPagingIo && !bNonCachedIo)
- {
-
- ntStatus = AFSRequestExtentsAsync( pFcb, pCcb, &liStartingByte, ulByteCount);
-
- if (!NT_SUCCESS(ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Failed to request extents Status %08lX\n",
- Irp,
- ntStatus);
-
- try_return( ntStatus );
+ pFcb));
}
}
- */
-
- //
- // If they are not mapped and we are the Lazy Writer then just
- // say "not now"
- //
- if (!bMapped && pFcb->Specific.File.LazyWriterThread == PsGetCurrentThread())
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) Failing lazy writer for unmapped request\n",
- Irp);
-
- try_return ( ntStatus = STATUS_FILE_LOCK_CONFLICT);
- }
//
// Take locks
//
- // - if Paging then we need to nothing (the precalls will
+ // - if Paging then we need to do nothing (the precalls will
// have acquired the paging resource), for clarity we will collect
// the paging resource
// - If extending Write then take the fileresource EX (EOF will change, Allocation will only move out)
do
{
- if( !bPagingIo)
- {
-
- bExtendingWrite = (((liStartingByte.QuadPart + ulByteCount) >=
- pFcb->Header.FileSize.QuadPart) ||
- (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
- liStartingByte.HighPart == -1)) ;
- }
-
if( bPagingIo)
{
//ASSERT( NULL != OnBehalfOf || ExIsResourceAcquiredLite( &pNPFcb->Resource ));
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Acquiring Fcb PagingIo lock %08lX SHARED %08lX\n",
+ "AFSCommonWrite Acquiring Fcb PagingIo lock %p SHARED %08lX\n",
&pNPFcb->PagingResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pNPFcb->PagingResource,
TRUE);
//
bLockOK = TRUE;
}
- else if( bExtendingWrite)
+ else
{
- //
- // Check for lock inversion
- //
- ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
+ bExtendingWrite = (((liStartingByte.QuadPart + ulByteCount) >=
+ pFcb->Header.FileSize.QuadPart) ||
+ (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
+ liStartingByte.HighPart == -1)) ;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Acquiring Fcb lock %08lX EXCL %08lX\n",
- &pNPFcb->Resource,
- PsGetCurrentThread());
+ if( bExtendingWrite || bNonCachedIo)
+ {
+ //
+ // Check for lock inversion
+ //
- AFSAcquireExcl( &pNPFcb->Resource,
- TRUE);
+ ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
- if (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
- liStartingByte.HighPart == -1)
- {
- if (pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
- {
- liStartingByte = pFcb->Header.ValidDataLength;
- }
- else
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonWrite Acquiring Fcb lock %p EXCL %08lX\n",
+ &pNPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pNPFcb->Resource,
+ TRUE);
+
+ bReleaseMain = TRUE;
+
+ AFSDbgTrace(( 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;
+
+ if (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
+ liStartingByte.HighPart == -1)
{
- liStartingByte = pFcb->Header.FileSize;
+ if (pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
+ {
+ liStartingByte = pFcb->Header.ValidDataLength;
+ }
+ else
+ {
+ liStartingByte = pFcb->Header.FileSize;
+ }
}
+
+ //
+ // We have the correct lock - even if we don't end up truncating
+ //
+ bLockOK = TRUE;
}
- bReleaseMain = TRUE;
+ else
+ {
+ ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
- //
- // We have the correct lock - even if we don't end up truncating
- //
- bLockOK = TRUE;
- }
- else
- {
- ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonWrite Acquiring Fcb lock %p SHARED %08lX\n",
+ &pNPFcb->Resource,
+ PsGetCurrentThread()));
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite Acquiring Fcb lock %08lX SHARED %08lX\n",
- &pNPFcb->Resource,
- PsGetCurrentThread());
+ AFSAcquireShared( &pNPFcb->Resource,
+ TRUE);
- AFSAcquireShared( &pNPFcb->Resource,
- TRUE);
+ bReleaseMain = TRUE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonWrite Acquiring Fcb SectionObject lock %p SHARED %08lX\n",
+ &pNPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- bReleaseMain = TRUE;
+ AFSAcquireShared( &pNPFcb->SectionObjectResource,
+ TRUE);
- //
- // Have things moved? Are we extending? If so, the the lock isn't OK
- //
- bLockOK = (liStartingByte.QuadPart + ulByteCount) < pFcb->Header.FileSize.QuadPart;
+ bReleaseSectionObject = TRUE;
- if (!bLockOK)
- {
- AFSReleaseResource( &pNPFcb->Resource);
- bReleaseMain = FALSE;
+ //
+ // Have things moved? Are we extending? If so, the the lock isn't OK
+ //
+ bLockOK = (liStartingByte.QuadPart + ulByteCount) < pFcb->Header.FileSize.QuadPart;
+
+ if (!bLockOK)
+ {
+ AFSReleaseResource( &pNPFcb->Resource);
+
+ bReleaseMain = FALSE;
+ }
}
}
}
while (!bLockOK);
- //
- // Check the BR locks on the file.
- //
-
- if( !bPagingIo &&
- !FsRtlCheckLockForWriteAccess( &pFcb->Specific.File.FileLock,
- Irp))
+ if( !bPagingIo)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Request failed due to lock conflict\n",
- Irp);
+ //
+ // Check the BR locks on the file.
+ //
- try_return( ntStatus = STATUS_FILE_LOCK_CONFLICT);
- }
+ if ( !FsRtlCheckLockForWriteAccess( &pFcb->Specific.File.FileLock,
+ Irp))
+ {
- if( bExtendingWrite)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCommonWrite (%p) Request failed due to lock conflict\n",
+ Irp));
- ntStatus = AFSExtendingWrite( pFcb, pFileObject, (liStartingByte.QuadPart + ulByteCount));
+ try_return( ntStatus = STATUS_FILE_LOCK_CONFLICT);
+ }
- if( !NT_SUCCESS(ntStatus))
+ if( bExtendingWrite)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSCommonWrite (%08lX) Failed extending write request Status %08lX\n",
- Irp,
- ntStatus);
+ ntStatus = AFSExtendingWrite( pFcb, pFileObject, (liStartingByte.QuadPart + ulByteCount));
+
+ if( !NT_SUCCESS(ntStatus))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCommonWrite (%p) Failed extending write request Status %08lX\n",
+ Irp,
+ ntStatus));
- try_return( ntStatus );
+ try_return( ntStatus );
+ }
}
}
!bNonCachedIo)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ //
+ // Main and SectionObject resources held Shared
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) Processing CACHED request Offset %I64X Len %08lX\n",
+ "AFSCommonWrite (%p) Processing CACHED request Offset %0I64X Len %08lX%s\n",
Irp,
liStartingByte.QuadPart,
- ulByteCount);
-
- ntStatus = AFSCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount, TRUE);
+ ulByteCount,
+ bRetry ? " RETRY" : ""));
+ ntStatus = AFSCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount, bForceFlush);
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) 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" : ""));
+
+ if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- ntStatus = AFSNonCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount);
+ ntStatus = AFSNonCachedWriteDirect( DeviceObject, Irp, liStartingByte, ulByteCount);
+ }
+ else
+ {
+ ntStatus = AFSNonCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount);
+ }
}
try_exit:
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonWrite (%08lX) Process complete Status %08lX\n",
+ "AFSCommonWrite (%p) Process complete Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
+
+ if ( NT_SUCCESS( ntStatus))
+ {
+ if ( !bPagingIo)
+ {
+
+ if( bSynchronousFo)
+ {
+
+ pFileObject->CurrentByteOffset.QuadPart = liStartingByte.QuadPart + ulByteCount;
+ }
+
+ //
+ // If this extended the Vdl, then update it accordingly
+ //
+
+ if( liStartingByte.QuadPart + ulByteCount > pFcb->Header.ValidDataLength.QuadPart)
+ {
+
+ pFcb->Header.ValidDataLength.QuadPart = liStartingByte.QuadPart + ulByteCount;
+ }
+
+ if( !BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME))
+ {
+
+ SetFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_WRITE_TIME);
+
+ KeQuerySystemTime( &pFcb->ObjectInformation->LastWriteTime);
+ }
+ }
+ }
ObDereferenceObject(pFileObject);
- if( bReleaseMain)
+ if( bReleaseSectionObject)
{
- AFSReleaseResource( &pNPFcb->Resource);
+ AFSReleaseResource( &pNPFcb->SectionObjectResource);
}
if( bReleasePaging)
AFSReleaseResource( &pNPFcb->PagingResource);
}
+ if( bReleaseMain)
+ {
+
+ AFSReleaseResource( &pNPFcb->Resource);
+ }
+
if( bCompleteIrp)
{
IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(DeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSPIOCtlIORequestCB stIORequestCB;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
__Enter
{
+ Irp->IoStatus.Information = 0;
+
RtlZeroMemory( &stIORequestCB,
sizeof( AFSPIOCtlIORequestCB));
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSIOCtlWrite Acquiring Fcb lock %08lX SHARED %08lX\n",
+ "AFSIOCtlWrite Acquiring Fcb lock %p SHARED %08lX\n",
&pFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pFcb->NPFcb->Resource,
TRUE);
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,
BOOLEAN bPagingIo = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
BOOLEAN bLocked = FALSE;
BOOLEAN bCompleteIrp = TRUE;
- BOOLEAN bExtentsMapped = FALSE;
AFSGatherIo *pGatherIo = NULL;
AFSIoRun *pIoRuns = NULL;
AFSIoRun stIoRuns[AFS_MAX_STACK_IO_RUNS];
AFSCcb *pCcb = (AFSCcb *)pFileObject->FsContext2;
BOOLEAN bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
AFSDeviceExt *pDevExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
- ULONG ulRequestCount = 0;
LARGE_INTEGER liCurrentTime, liLastRequestTime;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
PFILE_OBJECT pCacheFileObject = NULL;
__Enter
{
- Irp->IoStatus.Information = 0;
+
+ AFSDbgTrace(( 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,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Request %08lX Actual %08lX larger than MaxIO %I64X\n",
+ "AFSNonCachedWrite (%p) Request %08lX Actual %08lX larger than MaxIO %I64X\n",
Irp,
ByteCount,
pIrpSp->Parameters.Write.Length,
- pDevExt->Specific.RDR.MaxIo.QuadPart);
+ pDevExt->Specific.RDR.MaxIo.QuadPart));
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
if( pSystemBuffer == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to map system buffer\n",
- Irp);
+ "AFSNonCachedWrite (%p) Failed to map system buffer\n",
+ Irp));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
// Provoke a get of the extents - if we need to.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Requesting extents for fid %08lX-%08lX-%08lX-%08lX Offset %I64X Length %08lX\n",
+ "AFSNonCachedWrite Requesting extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Volume,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
StartingByte.QuadPart,
- ByteCount);
+ ByteCount));
ntStatus = AFSRequestExtentsAsync( pFcb,
pCcb,
if (!NT_SUCCESS(ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to request extents Status %08lX\n",
+ "AFSNonCachedWrite (%p) Failed to request extents Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
while (TRUE)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Acquiring Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Acquiring Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
ASSERT( !ExIsResourceAcquiredLite( &pFcb->NPFcb->Specific.File.ExtentsResource ));
KeClearEvent( &pFcb->NPFcb->Specific.File.ExtentsRequestComplete );
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Releasing(1) Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Releasing(1) Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
bLocked= FALSE;
if( liCurrentTime.QuadPart - liLastRequestTime.QuadPart >= pControlDevExt->Specific.Control.ExtentRequestTimeCount.QuadPart)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Requesting extents, again, for fid %08lX-%08lX-%08lX-%08lX Offset %I64X Length %08lX\n",
+ "AFSNonCachedWrite Requesting extents, again, for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Volume,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
StartingByte.QuadPart,
- ByteCount);
+ ByteCount));
ntStatus = AFSRequestExtentsAsync( pFcb,
pCcb,
if (!NT_SUCCESS(ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to request extents Status %08lX\n",
+ "AFSNonCachedWrite (%p) Failed to request extents Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Waiting for extents for fid %08lX-%08lX-%08lX-%08lX Offset %I64X Length %08lX\n",
+ "AFSNonCachedWrite Waiting for extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Volume,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
StartingByte.QuadPart,
- ByteCount);
+ ByteCount));
//
// Wait for it
if (!NT_SUCCESS(ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite Failed wait for extents for fid %08lX-%08lX-%08lX-%08lX Offset %I64X Length %08lX Status %08lX\n",
+ "AFSNonCachedWrite Failed wait for extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX Status %08lX\n",
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Volume,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
StartingByte.QuadPart,
ByteCount,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
// As per the read path -
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Extents located for fid %08lX-%08lX-%08lX-%08lX Offset %I64X Length %08lX\n",
+ "AFSNonCachedWrite Extents located for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Volume,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
StartingByte.QuadPart,
- ByteCount);
+ ByteCount));
ntStatus = AFSGetExtents( pFcb,
&StartingByte,
if (!NT_SUCCESS(ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to retrieve mapped extents Status %08lX\n",
+ "AFSNonCachedWrite (%p) Failed to retrieve mapped extents Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
try_return( ntStatus );
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite (%08lX) 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);
+ runCount));
if( BooleanFlagOn( AFSLibControlFlags, AFS_REDIR_LIB_FLAGS_NONPERSISTENT_CACHE))
{
if (!NT_SUCCESS(ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to process extent run for non-persistent cache Status %08lX\n",
+ "AFSNonCachedWrite (%p) Failed to process extent run for non-persistent cache Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
}
try_return( ntStatus);
ntStatus = STATUS_DEVICE_NOT_READY;
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite Failed to retrieve cache fileobject for fid %08lX-%08lX-%08lX-%08lX Offset %I64X Length %08lX Status %08lX\n",
+ "AFSNonCachedWrite Failed to retrieve cache fileobject for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX Status %08lX\n",
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Volume,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
StartingByte.QuadPart,
ByteCount,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
if (NULL == pIoRuns)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to allocate IO run block\n",
- Irp);
+ "AFSNonCachedWrite (%p) Failed to allocate IO run block\n",
+ Irp));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES );
}
if (!NT_SUCCESS(ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to initialize IO run block Status %08lX\n",
+ "AFSNonCachedWrite (%p) Failed to initialize IO run block Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
try_return( ntStatus );
}
bDerefExtents = TRUE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Releasing(2) Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Releasing(2) Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
bLocked = FALSE;
if (NULL == pGatherIo)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNonCachedWrite (%08lX) Failed to allocate IO gather block\n",
- Irp);
+ "AFSNonCachedWrite (%p) Failed to allocate IO gather block\n",
+ Irp));
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Acquiring(1) Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Acquiring(1) Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
TRUE);
runCount,
pGatherIo);
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite (%08lX) AFSStartIos completed Status %08lX\n",
+ "AFSNonCachedWrite (%p) AFSStartIos completed Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Acquiring(2) Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Acquiring(2) Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
TRUE);
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Acquiring(3) Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Acquiring(3) Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
TRUE);
Irp->IoStatus.Information > 0)
{
+ if ( !bLocked)
+ {
+
+ AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
+ bLocked = TRUE;
+ }
+
//
// Since this is dirty we can mark the extents dirty now.
// AFSMarkDirty will dereference the extents. Do not call
AFSReleaseCacheFileObject( pCacheFileObject);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite (%08lX) Completed request Status %08lX\n",
- Irp,
- ntStatus);
+ "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX Status %08lX\n",
+ pFileObject,
+ StartingByte.HighPart,
+ StartingByte.LowPart,
+ ByteCount,
+ ntStatus));
if (NT_SUCCESS(ntStatus) &&
!bPagingIo &&
if( bLocked)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Releasing Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSNonCachedWrite Releasing Fcb extents lock %p SHARED %08lX\n",
&pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
}
if( bCompleteIrp)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNonCachedWrite Completing Irp %08lX Status %08lX Info %08lX\n",
+ "AFSNonCachedWrite Completing Irp %p Status %08lX Info %08lX\n",
Irp,
ntStatus,
- Irp->IoStatus.Information);
+ Irp->IoStatus.Information));
AFSCompleteRequest( Irp, ntStatus);
}
static
NTSTATUS
+AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN LARGE_INTEGER StartingByte,
+ IN ULONG ByteCount)
+{
+ NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
+ VOID *pSystemBuffer = NULL;
+ BOOLEAN bPagingIo = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
+ IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
+ PFILE_OBJECT pFileObject = pIrpSp->FileObject;
+ AFSFcb *pFcb = (AFSFcb *)pFileObject->FsContext;
+ AFSCcb *pCcb = (AFSCcb *)pFileObject->FsContext2;
+ BOOLEAN bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
+ BOOLEAN bNoIntermediateBuffering = BooleanFlagOn( pFileObject->Flags, FO_NO_INTERMEDIATE_BUFFERING);
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
+ AFSFileIOCB stFileIORequest;
+ AFSFileIOResultCB stFileIOResult;
+ ULONG ulResultLen = 0;
+ ULONG ulFlags;
+
+ __Enter
+ {
+ Irp->IoStatus.Information = 0;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNonCachedWriteDirect (FO: %p) StartingByte %08lX:%08lX Length %08lX\n",
+ pFileObject,
+ StartingByte.HighPart,
+ StartingByte.LowPart,
+ ByteCount));
+
+ if (ByteCount > pDevExt->Specific.RDR.MaxIo.QuadPart)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSNonCachedWriteDirect (%p) Request %08lX Actual %08lX larger than MaxIO %I64X\n",
+ Irp,
+ ByteCount,
+ pIrpSp->Parameters.Write.Length,
+ pDevExt->Specific.RDR.MaxIo.QuadPart));
+
+ try_return( ntStatus = STATUS_UNSUCCESSFUL);
+ }
+
+ //
+ // Get the mapping for the buffer
+ //
+ pSystemBuffer = AFSLockSystemBuffer( Irp,
+ ByteCount);
+
+ if( pSystemBuffer == NULL)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSNonCachedWriteDirect (%p) Failed to map system buffer\n",
+ Irp));
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ //
+ // Issue the request at the service for processing
+ //
+
+ ulResultLen = sizeof( AFSFileIOResultCB);
+
+ RtlZeroMemory( &stFileIORequest,
+ sizeof( AFSFileIOCB));
+
+ RtlZeroMemory( &stFileIOResult,
+ sizeof( AFSFileIOResultCB));
+
+ stFileIORequest.SystemIOBuffer = pSystemBuffer;
+
+ stFileIORequest.SystemIOBufferMdl = Irp->MdlAddress;
+
+ stFileIORequest.IOLength = ByteCount;
+
+ stFileIORequest.IOOffset = StartingByte;
+
+ ulFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+
+ if ( bNoIntermediateBuffering)
+ {
+
+ ulFlags |= AFS_REQUEST_FLAG_CACHE_BYPASS;
+ }
+
+ //
+ // Update file metadata
+ //
+
+ stFileIORequest.EndOfFile = pFcb->ObjectInformation->EndOfFile;
+
+ stFileIORequest.CreateTime = pFcb->ObjectInformation->CreationTime;
+
+ stFileIORequest.ChangeTime = pFcb->ObjectInformation->ChangeTime;
+
+ stFileIORequest.LastAccessTime = pFcb->ObjectInformation->LastAccessTime;
+
+ stFileIORequest.LastWriteTime = pFcb->ObjectInformation->LastWriteTime;
+
+ //
+ // Write the data to the service
+ //
+
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PROCESS_WRITE_FILE,
+ ulFlags,
+ &pCcb->AuthGroup,
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ &pFcb->ObjectInformation->FileId,
+ pFcb->ObjectInformation->VolumeCB->VolumeInformation.Cell,
+ pFcb->ObjectInformation->VolumeCB->VolumeInformation.CellLength,
+ &stFileIORequest,
+ sizeof( AFSFileIOCB),
+ &stFileIOResult,
+ &ulResultLen);
+
+ if( NT_SUCCESS( ntStatus))
+ {
+
+ Irp->IoStatus.Information = (ULONG_PTR)stFileIOResult.Length;
+ }
+ else
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSNonCachedWriteDirect (%p) Failed to send write to service Status %08lX\n",
+ Irp,
+ ntStatus));
+ }
+
+try_exit:
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNonCachedWriteDirect (FO: %p) StartingByte %08lX:%08lX Length %08lX Status %08lX\n",
+ pFileObject,
+ StartingByte.HighPart,
+ StartingByte.LowPart,
+ ByteCount,
+ ntStatus));
+
+ if (NT_SUCCESS(ntStatus) &&
+ !bPagingIo &&
+ bSynchronousFo)
+ {
+
+ pFileObject->CurrentByteOffset.QuadPart = StartingByte.QuadPart + ByteCount;
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNonCachedWriteDirect Completing Irp %p Status %08lX Info %08lX\n",
+ Irp,
+ ntStatus,
+ Irp->IoStatus.Information));
+
+ AFSCompleteRequest( Irp, ntStatus);
+ }
+
+ return ntStatus;
+}
+
+static
+NTSTATUS
AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN LARGE_INTEGER StartingByte,
IN ULONG ByteCount,
IN BOOLEAN ForceFlush)
{
+ UNREFERENCED_PARAMETER(DeviceObject);
PVOID pSystemBuffer = NULL;
NTSTATUS ntStatus = STATUS_SUCCESS;
IO_STATUS_BLOCK iosbFlush;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PFILE_OBJECT pFileObject = pIrpSp->FileObject;
AFSFcb *pFcb = (AFSFcb *)pFileObject->FsContext;
- AFSCcb *pCcb = (AFSCcb *)pFileObject->FsContext2;
BOOLEAN bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
- BOOLEAN bMapped = FALSE;
ULONG ulCurrentIO = 0, ulTotalLen = ByteCount;
PMDL pCurrentMdl = Irp->MdlAddress;
LARGE_INTEGER liCurrentOffset;
{
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCachedWrite (%08lX) Exception thrown while preparing mdl write Status %08lX\n",
+ "AFSCachedWrite (%p) Exception thrown while preparing mdl write Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
}
if( !NT_SUCCESS( ntStatus))
Irp->MdlAddress = NULL;
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCachedWrite (%08lX) Failed to process MDL write Status %08lX\n",
+ "AFSCachedWrite (%p) Failed to process MDL write Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
}
try_return( ntStatus);
if( pSystemBuffer == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCachedWrite (%08lX) Failed to lock system buffer\n",
- Irp);
+ "AFSCachedWrite (%p) Failed to lock system buffer\n",
+ Irp));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
// Failed to process request.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCachedWrite (%08lX) Failed to issue CcCopyWrite %wZ @ %0I64X Status %08lX\n",
+ "AFSCachedWrite (%p) Failed to issue CcCopyWrite %wZ @ %0I64X Status %08lX\n",
Irp,
&pFileObject->FileName,
liCurrentOffset.QuadPart,
- Irp->IoStatus.Status);
+ Irp->IoStatus.Status));
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCachedWrite (%08lX) CcCopyWrite Threw exception %wZ @ %0I64X Status %08lX\n",
+ "AFSCachedWrite (%p) CcCopyWrite Threw exception %wZ @ %0I64X Status %08lX\n",
Irp,
&pFileObject->FileName,
liCurrentOffset.QuadPart,
- ntStatus);
+ ntStatus));
}
if( !NT_SUCCESS( ntStatus))
try_return( ntStatus);
}
- if( ForceFlush)
+ if( ForceFlush ||
+ BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
{
//
if( !NT_SUCCESS( iosbFlush.Status))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCachedWrite (%08lX) CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ "AFSCachedWrite (%p) CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
Irp,
&pFileObject->FileName,
pFcb->ObjectInformation->FileId.Cell,
pFcb->ObjectInformation->FileId.Vnode,
pFcb->ObjectInformation->FileId.Unique,
iosbFlush.Status,
- iosbFlush.Information);
+ iosbFlush.Information));
try_return( ntStatus = iosbFlush.Status);
}
Irp->IoStatus.Information = ByteCount;
- if( bSynchronousFo)
- {
-
- pFileObject->CurrentByteOffset.QuadPart = StartingByte.QuadPart + ByteCount;
- }
-
- //
- // If this extended the Vdl, then update it accordingly
- //
-
- if( StartingByte.QuadPart + ByteCount > pFcb->Header.ValidDataLength.QuadPart)
- {
-
- pFcb->Header.ValidDataLength.QuadPart = StartingByte.QuadPart + ByteCount;
- }
-
- if (BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
+ if ( ForceFlush ||
+ BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
{
//
// Write through asked for... Set things so that we get
//
pFcb->Specific.File.LastServerFlush.QuadPart = 0;
}
-
- if( !BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME))
- {
-
- SetFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_WRITE_TIME);
-
- KeQuerySystemTime( &pFcb->ObjectInformation->LastWriteTime);
- }
}
AFSCompleteRequest( Irp,
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)
{
// Tell the server
//
- ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentObjectInformation->FileId,
+ ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentFileId,
Fcb->ObjectInformation,
&pCcb->AuthGroup);
Fcb->Header.AllocationSize = liSaveAllocation;
}
- AFSReleaseResource( &Fcb->NPFcb->PagingResource);
-
//
// DownConvert file resource to shared
//
IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(DeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSPIOCtlIORequestCB stIORequestCB;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSShareWrite On pipe %wZ Length %08lX\n",
&pCcb->DirectoryCB->NameInformation.FileName,
- pIrpSp->Parameters.Write.Length);
+ pIrpSp->Parameters.Write.Length));
if( pIrpSp->Parameters.Write.Length == 0)
{
if( pBuffer == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSShareWrite Failed to map buffer on pipe %wZ\n",
- &pCcb->DirectoryCB->NameInformation.FileName);
+ &pCcb->DirectoryCB->NameInformation.FileName));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
&pCcb->AuthGroup,
&pCcb->DirectoryCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
pIoRequest,
sizeof( AFSPipeIORequestCB) +
pIrpSp->Parameters.Write.Length,
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSShareWrite (%08lX) Failed service write Status %08lX\n",
+ "AFSShareWrite (%p) Failed service write Status %08lX\n",
Irp,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSShareWrite Completed on pipe %wZ Length read %08lX\n",
&pCcb->DirectoryCB->NameInformation.FileName,
- stIoResult.BytesProcessed);
+ stIoResult.BytesProcessed));
Irp->IoStatus.Information = stIoResult.BytesProcessed;