[CDFS]
[reactos.git] / reactos / drivers / filesystems / cdfs / cleanup.c
index 26cb0fb..5ee39b1 100644 (file)
 /* FUNCTIONS ****************************************************************/
 
 static NTSTATUS
-CdfsCleanupFile(PDEVICE_EXTENSION DeviceExt,
+CdfsCleanupFile(PCDFS_IRP_CONTEXT IrpContext,
                 PFILE_OBJECT FileObject)
                 /*
                 * FUNCTION: Cleans up after a file has been closed.
                 */
 {
+    PDEVICE_EXTENSION DeviceExt;
     PFCB Fcb;
 
-    DPRINT("CdfsCleanupFile(DeviceExt %p, FileObject %p)\n",
-        DeviceExt,
+    DPRINT("CdfsCleanupFile(IrpContext %p, FileObject %p)\n",
+        IrpContext,
         FileObject);
 
+    DeviceExt = IrpContext->DeviceObject->DeviceExtension;
     Fcb = FileObject->FsContext;
     if (!Fcb)
     {
@@ -58,6 +60,15 @@ CdfsCleanupFile(PDEVICE_EXTENSION DeviceExt,
                        &(DeviceExt->NotifyList),
                        FileObject->FsContext2);
 
+   if (!CdfsFCBIsDirectory(Fcb) &&
+       FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
+    {
+        FsRtlFastUnlockAll(&Fcb->FileLock,
+                           FileObject,
+                           IoGetRequestorProcess(IrpContext->Irp),
+                           NULL);
+    }
+
     /* Uninitialize file cache if initialized for this file object. */
     if (FileObject->SectionObjectPointer && FileObject->SectionObjectPointer->SharedCacheMap)
     {
@@ -86,7 +97,7 @@ CdfsCleanup(
     DeviceObject = IrpContext->DeviceObject;
     Stack = IrpContext->Stack;
 
-    if (DeviceObject == CdfsGlobalData->DeviceObject)
+    if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject == CdfsGlobalData->HddFsDeviceObject)
     {
         DPRINT("Closing file system\n");
         Status = STATUS_SUCCESS;
@@ -99,7 +110,7 @@ CdfsCleanup(
     KeEnterCriticalRegion();
     ExAcquireResourceExclusiveLite(&DeviceExtension->DirResource, TRUE);
 
-    Status = CdfsCleanupFile(DeviceExtension, FileObject);
+    Status = CdfsCleanupFile(IrpContext, FileObject);
 
     ExReleaseResourceLite(&DeviceExtension->DirResource);
     KeLeaveCriticalRegion();