/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: drivers/fs/vfat/close.c
+ * FILE: drivers/filesystems/fastfat/close.c
* PURPOSE: VFAT Filesystem
* PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
*/
{
PVFATFCB pFcb;
PVFATCCB pCcb;
+ BOOLEAN IsVolume;
NTSTATUS Status = STATUS_SUCCESS;
DPRINT("VfatCloseFile(DeviceExt %p, FileObject %p)\n",
return STATUS_SUCCESS;
}
- if (pFcb->Flags & FCB_IS_VOLUME)
+ IsVolume = BooleanFlagOn(pFcb->Flags, FCB_IS_VOLUME);
+ if (IsVolume)
{
- DPRINT1("Volume\n");
- pFcb->RefCount--;
+ DPRINT("Volume\n");
FileObject->FsContext2 = NULL;
}
else
{
- if (FileObject->DeletePending)
+ if (pFcb->OpenHandleCount == 0 && BooleanFlagOn(pFcb->Flags, FCB_CACHE_INITIALIZED))
{
- if (pFcb->Flags & FCB_DELETE_PENDING)
+ PFILE_OBJECT tmpFileObject;
+ tmpFileObject = pFcb->FileObject;
+ if (tmpFileObject != NULL)
{
- VfatDelEntry(DeviceExt, pFcb);
-
- FsRtlNotifyFullReportChange(DeviceExt->NotifySync,
- &(DeviceExt->NotifyList),
- (PSTRING)&pFcb->PathNameU,
- pFcb->PathNameU.Length - pFcb->LongNameU.Length,
- NULL,
- NULL,
- ((*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
- FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
- FILE_ACTION_REMOVED,
- NULL);
- }
- else
- {
- Status = STATUS_DELETE_PENDING;
+ pFcb->FileObject = NULL;
+ CcUninitializeCacheMap(tmpFileObject, NULL, NULL);
+ ClearFlag(pFcb->Flags, FCB_CACHE_INITIALIZED);
+ ObDereferenceObject(tmpFileObject);
}
}
+#ifdef KDBG
+ pFcb->Flags |= FCB_CLOSED;
+#endif
vfatReleaseFCB(DeviceExt, pFcb);
}
vfatDestroyCCB(pCcb);
}
+#ifdef ENABLE_SWAPOUT
+ if (IsVolume && DeviceExt->OpenHandleCount == 0)
+ {
+ VfatCheckForDismount(DeviceExt, FALSE);
+ }
+#endif
+
return Status;
}
if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
{
DPRINT("Closing file system\n");
- Status = STATUS_SUCCESS;
- goto ByeBye;
+ IrpContext->Irp->IoStatus.Information = 0;
+ return STATUS_SUCCESS;
}
-#if 0
- /* There occurs a dead look at the call to CcRosDeleteFileCache/ObDereferenceObject/VfatClose
- in CmLazyCloseThreadMain if VfatClose is execute asynchronous in a worker thread. */
- if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, IrpContext->Flags & IRPCONTEXT_CANWAIT))
-#else
- if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE))
-#endif
+ if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
- return VfatQueueRequest(IrpContext);
+ return VfatMarkIrpContextForQueue(IrpContext);
}
Status = VfatCloseFile(IrpContext->DeviceExt, IrpContext->FileObject);
ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource);
-ByeBye:
- IrpContext->Irp->IoStatus.Status = Status;
IrpContext->Irp->IoStatus.Information = 0;
- IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
- VfatFreeIrpContext(IrpContext);
return Status;
}