[FASTFAT] Fix size checking in VfatGetFileNameInformation()
[reactos.git] / drivers / filesystems / fastfat / close.c
index 78f016f..b4e5fda 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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)
  */
@@ -25,10 +25,11 @@ VfatCloseFile(
 {
     PVFATFCB pFcb;
     PVFATCCB pCcb;
+    BOOLEAN IsVolume;
     NTSTATUS Status = STATUS_SUCCESS;
 
     DPRINT("VfatCloseFile(DeviceExt %p, FileObject %p)\n",
-           DeviceExt, FileObject);
+            DeviceExt, FileObject);
 
     /* FIXME : update entry in directory? */
     pCcb = (PVFATCCB) (FileObject->FsContext2);
@@ -39,26 +40,14 @@ VfatCloseFile(
         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->Flags & FCB_DELETE_PENDING)
-            {
-                VfatDelEntry(DeviceExt, pFcb);
-            }
-            else
-            {
-                Status = STATUS_DELETE_PENDING;
-            }
-        }
-
         vfatReleaseFCB(DeviceExt, pFcb);
     }
 
@@ -71,6 +60,13 @@ VfatCloseFile(
         vfatDestroyCCB(pCcb);
     }
 
+#ifdef ENABLE_SWAPOUT
+    if (IsVolume && DeviceExt->OpenHandleCount == 0)
+    {
+        VfatCheckForDismount(DeviceExt, FALSE);
+    }
+#endif
+
     return Status;
 }
 
@@ -88,28 +84,18 @@ VfatClose(
     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;
 }