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>2016-08-13 07:08:58 +0300
committerMatt Wu <matt@ext2fsd.com>2016-08-13 07:08:58 +0300
commitc78e0d19384ee893db6e2faee4ddbaf1685f21b7 (patch)
treef104e0255871c03bdca534462460478f13a59bfd /Ext3Fsd
parent121c893761b9cf21d643454108f55e598498dabd (diff)
FIXME: do nothing for to-be-deleted files
Diffstat (limited to 'Ext3Fsd')
-rw-r--r--Ext3Fsd/dirctl.c6
-rwxr-xr-xExt3Fsd/fastio.c5
-rw-r--r--Ext3Fsd/flush.c78
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)