branch update for HEAD-2003021201
[reactos.git] / drivers / fs / vfat / rw.c
index cd63a63..cce9f96 100644 (file)
@@ -672,6 +672,17 @@ VfatRead(PVFAT_IRP_CONTEXT IrpContext)
       Status = STATUS_PENDING;
       goto ByeBye;
    }
+
+   if (!(IrpContext->Irp->Flags & IRP_PAGING_IO) &&
+      FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
+   {
+      if (!FsRtlCheckLockForReadAccess(&Fcb->FileLock, IrpContext->Irp)) 
+      {
+         Status = STATUS_FILE_LOCK_CONFLICT;
+         goto ByeBye;
+      }
+   }
+
    if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) &&
      !(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME)))
    {
@@ -918,6 +929,16 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext)
       }
    }
 
+   if (!(IrpContext->Irp->Flags & IRP_PAGING_IO) &&
+      FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
+   {
+      if (!FsRtlCheckLockForWriteAccess(&Fcb->FileLock, IrpContext->Irp)) 
+      {
+         Status = STATUS_FILE_LOCK_CONFLICT;
+         goto ByeBye;
+       }
+    }
+
    if (!(IrpContext->Flags & IRPCONTEXT_CANWAIT) && !(Fcb->Flags & FCB_IS_VOLUME))
    {
       if (ByteOffset.u.LowPart + Length > Fcb->RFCB.AllocationSize.u.LowPart)
@@ -945,10 +966,6 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext)
       }
    }
 
-   if (ByteOffset.QuadPart > OldFileSize.QuadPart)
-   {
-      CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
-   }
 
    if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) &&
       !(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME)))
@@ -973,6 +990,10 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext)
          }
          CcRosInitializeFileCache(IrpContext->FileObject, &Fcb->RFCB.Bcb, CacheSize);
       }
+      if (ByteOffset.QuadPart > OldFileSize.QuadPart)
+      {
+          CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
+      }
       if (CcCopyWrite(IrpContext->FileObject, &ByteOffset, Length,
                       1 /*IrpContext->Flags & IRPCONTEXT_CANWAIT*/, Buffer))
       {
@@ -990,6 +1011,10 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext)
       // non cached write
       CHECKPOINT;
 
+      if (ByteOffset.QuadPart > OldFileSize.QuadPart)
+      {
+         CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
+      }
       Buffer = VfatGetUserBuffer(IrpContext->Irp);
       if (!Buffer)
       {
@@ -1017,13 +1042,7 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext)
                                   &Fcb->entry.UpdateTime);
          Fcb->entry.AccessDate = Fcb->entry.UpdateDate;
          // update dates/times and length
-        if (OldAllocationSize != Fcb->RFCB.AllocationSize.u.LowPart)
-        {
-           VfatUpdateEntry (IrpContext->DeviceExt, IrpContext->FileObject);
-           Fcb->Flags &= ~FCB_UPDATE_DIRENTRY;
-        }
-        else
-           Fcb->Flags |= FCB_UPDATE_DIRENTRY;
+         VfatUpdateEntry (IrpContext->DeviceExt, IrpContext->FileObject);
       }
    }