Windows: Pin write position prior to defer
authorRod Widdowson <rdw@your-file-system.com>
Mon, 14 Apr 2014 20:50:36 +0000 (16:50 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Wed, 16 Apr 2014 13:05:48 +0000 (06:05 -0700)
If we extend the file prior to defrring the write *and* the write
is set up FILE_WRITE_TO_END_OF_FILE then we have to convert the
FILE_WRITE_TO_END_OF_FILE to an absolute position since we have
already moved the FCB->Header.FileSize.

Change-Id: Ibe1a5d616490a3db152818cbd6bb24d5af251c5f
Reviewed-on: http://gerrit.openafs.org/11069
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Rod Widdowson <rdw@steadingsoftware.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp

index 3fcdbbd..eb3adaf 100644 (file)
@@ -591,18 +591,23 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                     bReleaseSectionObject = TRUE;
 
                    if ( bWriteToEndOfFile)
-                    {
-                        if (pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
-                        {
-                            liStartingByte = pFcb->Header.ValidDataLength;
-                        }
-                        else
-                        {
-                            liStartingByte = pFcb->Header.FileSize;
-                        }
-                    }
+                   {
 
-                    //
+                       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;