diff options
author | Matt Wu <matt@ext2fsd.com> | 2016-08-13 07:08:58 +0300 |
---|---|---|
committer | Matt Wu <matt@ext2fsd.com> | 2016-08-13 07:08:58 +0300 |
commit | c78e0d19384ee893db6e2faee4ddbaf1685f21b7 (patch) | |
tree | f104e0255871c03bdca534462460478f13a59bfd /Ext3Fsd | |
parent | 121c893761b9cf21d643454108f55e598498dabd (diff) |
FIXME: do nothing for to-be-deleted files
Diffstat (limited to 'Ext3Fsd')
-rw-r--r-- | Ext3Fsd/dirctl.c | 6 | ||||
-rwxr-xr-x | Ext3Fsd/fastio.c | 5 | ||||
-rw-r--r-- | Ext3Fsd/flush.c | 78 |
3 files changed, 53 insertions, 36 deletions
diff --git a/Ext3Fsd/dirctl.c b/Ext3Fsd/dirctl.c index c8ae073..1e0ddec 100644 --- a/Ext3Fsd/dirctl.c +++ b/Ext3Fsd/dirctl.c @@ -1083,6 +1083,12 @@ Ext2NotifyChangeDirectory ( ASSERT((Ccb->Identifier.Type == EXT2CCB) && (Ccb->Identifier.Size == sizeof(EXT2_CCB))); + /* do nothing if target fie was deleted */ + if (FlagOn(Fcb->Flags, FCB_DELETE_PENDING)) { + Status = STATUS_FILE_DELETED; + __leave; + } + if (!IsDirectory(Fcb)) { DbgBreak(); Status = STATUS_INVALID_PARAMETER; diff --git a/Ext3Fsd/fastio.c b/Ext3Fsd/fastio.c index f3be1b9..ca0d765 100755 --- a/Ext3Fsd/fastio.c +++ b/Ext3Fsd/fastio.c @@ -93,6 +93,11 @@ Ext2FastIoCheckIfPossible ( ASSERT((Fcb->Identifier.Type == EXT2FCB) && (Fcb->Identifier.Size == sizeof(EXT2_FCB))); + /* do nothing if target fie was deleted */ + if (FlagOn(Fcb->Flags, FCB_DELETE_PENDING)) { + __leave; + } + if (IsDirectory(Fcb)) { __leave; } diff --git a/Ext3Fsd/flush.c b/Ext3Fsd/flush.c index d8ec0d7..65d6bf5 100644 --- a/Ext3Fsd/flush.c +++ b/Ext3Fsd/flush.c @@ -36,41 +36,6 @@ Ext2FlushCompletionRoutine ( } NTSTATUS -Ext2FlushFiles( - IN PEXT2_IRP_CONTEXT IrpContext, - IN PEXT2_VCB Vcb, - IN BOOLEAN bShutDown -) -{ - IO_STATUS_BLOCK IoStatus; - - PEXT2_FCB Fcb; - PLIST_ENTRY ListEntry; - - if (IsVcbReadOnly(Vcb)) { - return STATUS_SUCCESS; - } - - IoStatus.Status = STATUS_SUCCESS; - - DEBUG(DL_INF, ( "Flushing Files ...\n")); - - // Flush all Fcbs in Vcb list queue. - for (ListEntry = Vcb->FcbList.Flink; - ListEntry != &Vcb->FcbList; - ListEntry = ListEntry->Flink ) { - - Fcb = CONTAINING_RECORD(ListEntry, EXT2_FCB, Next); - ExAcquireResourceExclusiveLite( - &Fcb->MainResource, TRUE); - IoStatus.Status = Ext2FlushFile(IrpContext, Fcb, NULL); - ExReleaseResourceLite(&Fcb->MainResource); - } - - return IoStatus.Status; -} - -NTSTATUS Ext2FlushVolume ( IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, @@ -92,7 +57,7 @@ Ext2FlushFile ( IN PEXT2_CCB Ccb ) { - IO_STATUS_BLOCK IoStatus; + IO_STATUS_BLOCK IoStatus = {0}; ASSERT(Fcb != NULL); ASSERT((Fcb->Identifier.Type == EXT2FCB) && @@ -100,6 +65,12 @@ Ext2FlushFile ( __try { + /* do nothing if target fie was deleted */ + if (FlagOn(Fcb->Flags, FCB_DELETE_PENDING)) { + IoStatus.Status = STATUS_FILE_DELETED; + __leave; + } + /* update timestamp and achieve attribute */ if (Ccb != NULL) { @@ -133,6 +104,41 @@ Ext2FlushFile ( return IoStatus.Status; } +NTSTATUS +Ext2FlushFiles( + IN PEXT2_IRP_CONTEXT IrpContext, + IN PEXT2_VCB Vcb, + IN BOOLEAN bShutDown +) +{ + IO_STATUS_BLOCK IoStatus; + + PEXT2_FCB Fcb; + PLIST_ENTRY ListEntry; + + if (IsVcbReadOnly(Vcb)) { + return STATUS_SUCCESS; + } + + IoStatus.Status = STATUS_SUCCESS; + + DEBUG(DL_INF, ( "Flushing Files ...\n")); + + // Flush all Fcbs in Vcb list queue. + for (ListEntry = Vcb->FcbList.Flink; + ListEntry != &Vcb->FcbList; + ListEntry = ListEntry->Flink ) { + + Fcb = CONTAINING_RECORD(ListEntry, EXT2_FCB, Next); + ExAcquireResourceExclusiveLite( + &Fcb->MainResource, TRUE); + Ext2FlushFile(IrpContext, Fcb, NULL); + ExReleaseResourceLite(&Fcb->MainResource); + } + + return IoStatus.Status; +} + NTSTATUS Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext) |