diff options
author | Matt Wu <matt@ext2fsd.com> | 2011-02-10 11:00:46 +0300 |
---|---|---|
committer | Matt Wu <matt@ext2fsd.com> | 2011-02-10 11:00:46 +0300 |
commit | 108bfd4776f30a50dd1593756826003d7b2bf7de (patch) | |
tree | 518fb87506db3d489481deda8e8d8895905e2d4b | |
parent | f9baec236f557cd62e7d44df408cc184ffd07324 (diff) |
Ext3Fsd Version 0.50aExt3Fsd-0.50a
1, FIXME: dead-lock hang in fastio when copying big files ( > 4G )
-rw-r--r-- | Ext3Fsd/fastio.c | 53 |
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; } |