/*
* Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
BOOLEAN bReleasePaging = FALSE;
BOOLEAN bExtendingWrite = FALSE;
BOOLEAN bSynchronousFo = FALSE;
+ BOOLEAN bWriteToEndOfFile = FALSE;
+ BOOLEAN bWait = FALSE;
BOOLEAN bCompleteIrp = TRUE;
BOOLEAN bForceFlush = FALSE;
BOOLEAN bLockOK;
liStartingByte = pIrpSp->Parameters.Write.ByteOffset;
bPagingIo = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
bNonCachedIo = BooleanFlagOn( Irp->Flags, IRP_NOCACHE);
+ bWait = IoIsOperationSynchronous( Irp);
ulByteCount = pIrpSp->Parameters.Write.Length;
bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
"AFSCommonWrite (%p) Request failed due to read only volume\n",
Irp));
- try_return( ntStatus = STATUS_ACCESS_DENIED);
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
}
//
CcSetDirtyPageThreshold( pFileObject,
AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
while (!CcCanIWrite( pFileObject,
ulByteCount,
- FALSE,
+ bWait && !bRetry,
bRetry))
{
static const LONGLONG llWriteDelay = (LONGLONG)-100000;
if (!CcCanIWrite( pFileObject,
ulByteCount,
- FALSE,
+ bWait && !bRetry,
bRetry))
{
else
{
- bExtendingWrite = (((liStartingByte.QuadPart + ulByteCount) >=
- pFcb->Header.FileSize.QuadPart) ||
- (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
- liStartingByte.HighPart == -1)) ;
+ bWriteToEndOfFile = liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
+ liStartingByte.HighPart == -1;
+
+ bExtendingWrite = ( bWriteToEndOfFile ||
+ ((liStartingByte.QuadPart + ulByteCount) >=
+ pFcb->Header.FileSize.QuadPart));
if( bExtendingWrite || bNonCachedIo)
{
bReleaseSectionObject = TRUE;
- 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
- {
- liStartingByte = pFcb->Header.FileSize;
- }
- }
+ if ( bWriteToEndOfFile)
+ {
- //
+ if (pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
+ {
+
+ liStartingByte = pFcb->Header.ValidDataLength;
+ }
+ else
+ {
+
+ liStartingByte = pFcb->Header.FileSize;
+ }
+
+ pIrpSp->Parameters.Write.ByteOffset = liStartingByte;
+ }
+
+ //
// We have the correct lock - even if we don't end up truncating
//
bLockOK = TRUE;
Irp,
ntStatus));
- if ( NT_SUCCESS( ntStatus))
+ if ( NT_SUCCESS( ntStatus) &&
+ ntStatus != STATUS_PENDING)
{
if ( !bPagingIo)
{
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);
- }
+ //
+ // Register the File Object as having modified the file.
+ //
+ SetFlag( pFileObject->Flags, FO_FILE_MODIFIED);
}
}
- if ( !bPagingIo && bNonCachedIo && CcIsFileCached( pFileObject) &&
+ if ( ntStatus != STATUS_PENDING &&
+ !bPagingIo && bNonCachedIo && CcIsFileCached( pFileObject) &&
pNPFcb->SectionObjectPointers.DataSectionObject != NULL &&
bReleaseSectionObject)
{
SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
DWORD ntStatus2 = GetExceptionCode();
ntStatus = Irp->IoStatus.Status;
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
try_return( ntStatus = iosbFlush.Status);
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
__Enter
{
- pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
-
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+
AFSAcquireShared( &pFcb->NPFcb->Resource,
TRUE);