X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=drivers%2Ffs%2Fvfat%2Frw.c;h=cce9f962c7bd87e3bf71723718e6f3e8372392fd;hp=cd63a63879f076facc7fe7550112b3b853b516af;hb=03af8776dc14167b078911b0c7c5327d1bcdd128;hpb=f4077c1bf64ef89d74a8d4822d2d7aada3ba9927 diff --git a/drivers/fs/vfat/rw.c b/drivers/fs/vfat/rw.c index cd63a63..cce9f96 100644 --- a/drivers/fs/vfat/rw.c +++ b/drivers/fs/vfat/rw.c @@ -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); } }