/*
* 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)
*/
/* INCLUDES *****************************************************************/
-#define NDEBUG
#include "vfat.h"
+#define NDEBUG
+#include <debug.h>
+
/* FUNCTIONS ****************************************************************/
-NTSTATUS
-VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
/*
* FUNCTION: Closes a file
*/
+NTSTATUS
+VfatCloseFile(
+ PDEVICE_EXTENSION DeviceExt,
+ PFILE_OBJECT FileObject)
{
- PVFATFCB pFcb;
- PVFATCCB pCcb;
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT ("VfatCloseFile(DeviceExt %p, FileObject %p)\n",
- DeviceExt, FileObject);
-
- /* FIXME : update entry in directory? */
- pCcb = (PVFATCCB) (FileObject->FsContext2);
- pFcb = (PVFATFCB) (FileObject->FsContext);
-
- if (pFcb == NULL)
- {
- return STATUS_SUCCESS;
- }
-
- if (pFcb->Flags & FCB_IS_VOLUME)
- {
- DPRINT1("Volume\n");
- pFcb->RefCount--;
- FileObject->FsContext2 = NULL;
- }
- else
- {
- if (FileObject->DeletePending)
+ PVFATFCB pFcb;
+ PVFATCCB pCcb;
+ BOOLEAN IsVolume;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT("VfatCloseFile(DeviceExt %p, FileObject %p)\n",
+ DeviceExt, FileObject);
+
+ /* FIXME : update entry in directory? */
+ pCcb = (PVFATCCB) (FileObject->FsContext2);
+ pFcb = (PVFATFCB) (FileObject->FsContext);
+
+ if (pFcb == NULL)
+ {
+ return STATUS_SUCCESS;
+ }
+
+ IsVolume = BooleanFlagOn(pFcb->Flags, FCB_IS_VOLUME);
+ if (IsVolume)
+ {
+ DPRINT("Volume\n");
+ FileObject->FsContext2 = NULL;
+ }
+ else
{
- if (pFcb->Flags & FCB_DELETE_PENDING)
- {
- VfatDelEntry (DeviceExt, pFcb);
- }
- else
- {
- Status = STATUS_DELETE_PENDING;
- }
+ if (pFcb->OpenHandleCount == 0 && BooleanFlagOn(pFcb->Flags, FCB_CACHE_INITIALIZED))
+ {
+ PFILE_OBJECT tmpFileObject;
+ tmpFileObject = pFcb->FileObject;
+ if (tmpFileObject != NULL)
+ {
+ 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);
}
- vfatReleaseFCB (DeviceExt, pFcb);
- }
- FileObject->FsContext2 = NULL;
- FileObject->FsContext = NULL;
- FileObject->SectionObjectPointer = NULL;
+ FileObject->FsContext2 = NULL;
+ FileObject->FsContext = NULL;
+ FileObject->SectionObjectPointer = NULL;
+
+ if (pCcb)
+ {
+ vfatDestroyCCB(pCcb);
+ }
- if (pCcb)
- {
- vfatDestroyCCB(pCcb);
- }
+#ifdef ENABLE_SWAPOUT
+ if (IsVolume && DeviceExt->OpenHandleCount == 0)
+ {
+ VfatCheckForDismount(DeviceExt, FALSE);
+ }
+#endif
- return Status;
+ return Status;
}
-NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext)
/*
* FUNCTION: Closes a file
*/
+NTSTATUS
+VfatClose(
+ PVFAT_IRP_CONTEXT IrpContext)
{
- NTSTATUS Status;
+ NTSTATUS Status;
- DPRINT ("VfatClose(DeviceObject %p, Irp %p)\n", IrpContext->DeviceObject, IrpContext->Irp);
+ DPRINT("VfatClose(DeviceObject %p, Irp %p)\n", IrpContext->DeviceObject, IrpContext->Irp);
- if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
+ if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
{
- DPRINT("Closing file system\n");
- Status = STATUS_SUCCESS;
- goto ByeBye;
+ DPRINT("Closing file system\n");
+ IrpContext->Irp->IoStatus.Information = 0;
+ return STATUS_SUCCESS;
+ }
+ if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
+ {
+ return VfatMarkIrpContextForQueue(IrpContext);
}
-#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
- {
- return VfatQueueRequest (IrpContext);
- }
- Status = VfatCloseFile (IrpContext->DeviceExt, IrpContext->FileObject);
- ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
+ 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);
+ IrpContext->Irp->IoStatus.Information = 0;
- return (Status);
+ return Status;
}
/* EOF */