/*
* 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);
}
//
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)
{
}
}
- if ( !bPagingIo && bNonCachedIo && CcIsFileCached( pFileObject) &&
+ if ( ntStatus != STATUS_PENDING &&
+ !bPagingIo && bNonCachedIo && CcIsFileCached( pFileObject) &&
pNPFcb->SectionObjectPointers.DataSectionObject != NULL &&
bReleaseSectionObject)
{
__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);