Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matt-wu/Ext3Fsd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wu <matt@ext2fsd.com>2011-02-10 11:00:46 +0300
committerMatt Wu <matt@ext2fsd.com>2011-02-10 11:00:46 +0300
commit108bfd4776f30a50dd1593756826003d7b2bf7de (patch)
tree518fb87506db3d489481deda8e8d8895905e2d4b
parentf9baec236f557cd62e7d44df408cc184ffd07324 (diff)
Ext3Fsd Version 0.50aExt3Fsd-0.50a
1, FIXME: dead-lock hang in fastio when copying big files ( > 4G )
-rw-r--r--Ext3Fsd/fastio.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/Ext3Fsd/fastio.c b/Ext3Fsd/fastio.c
index 7ee59ad..9026f9c 100644
--- a/Ext3Fsd/fastio.c
+++ b/Ext3Fsd/fastio.c
@@ -195,45 +195,48 @@ Ext2FastIoWrite (
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
- PEXT2_FCB Fcb;
- BOOLEAN Status = TRUE;
+ PEXT2_FCB Fcb = NULL;
+ BOOLEAN Status = FALSE;
BOOLEAN Locked = FALSE;
Fcb = (PEXT2_FCB) FileObject->FsContext;
- if (Fcb == NULL) {
+ if (Fcb == NULL)
return FALSE;
- }
- ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
- (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
+ __try {
- if (IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY)) {
- return FALSE;
- }
+ FsRtlEnterFileSystem();
- ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
- Locked = TRUE;
+ ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
+ (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
- if (IsEndOfFile(*FileOffset) || (Fcb->Inode->i_size <=
- (loff_t)FileOffset->QuadPart + Length) ) {
- } else {
- ExReleaseResourceLite(&Fcb->MainResource);
- Locked = FALSE;
- }
+ if (IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY)) {
+ __leave;
+ }
+
+ ExAcquireResourceSharedLite(&Fcb->MainResource, TRUE);
+ Locked = TRUE;
+
+ if (IsEndOfFile(*FileOffset) || ((LONGLONG)(Fcb->Inode->i_size) <
+ (FileOffset->QuadPart + Length)) ) {
+ } else {
+ ExReleaseResourceLite(&Fcb->MainResource);
+ Locked = FALSE;
+ Status = FsRtlCopyWrite(FileObject, FileOffset, Length, Wait,
+ LockKey, Buffer, IoStatus, DeviceObject);
+ }
- Status = FsRtlCopyWrite(FileObject, FileOffset, Length, Wait,
- LockKey, Buffer, IoStatus, DeviceObject);
+ } __finally {
- if (Locked) {
- if (Status) {
- Fcb->Inode->i_size = Fcb->Header.FileSize.QuadPart;
- Ext2SaveInode(NULL, Fcb->Vcb, Fcb->Inode);
+ if (Locked) {
+ ExReleaseResourceLite(&Fcb->MainResource);
}
- ExReleaseResourceLite(&Fcb->MainResource);
+
+ FsRtlExitFileSystem();
}
DEBUG(DL_IO, ("Ext2FastIoWrite: %wZ Offset: %I64xh Length: %xh Key: %xh Status=%d\n",
- &Fcb->Mcb->ShortName, FileOffset->QuadPart, Length, LockKey, Status));
+ &Fcb->Mcb->ShortName, FileOffset->QuadPart, Length, LockKey, Status));
return Status;
}