/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: services/fs/cdfs/cleanup.c
+ * FILE: drivers/filesystems/cdfs/cleanup.c
* PURPOSE: CDROM (ISO 9660) filesystem driver
* PROGRAMMER:
* UPDATE HISTORY:
/* 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)
{
return STATUS_SUCCESS;
}
+ DeviceExt->OpenHandleCount--;
+
/* Notify about the cleanup */
FsRtlNotifyCleanup(DeviceExt->NotifySync,
&(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)
{
CcUninitializeCacheMap (FileObject, NULL, NULL);
}
+ /* Inform cleanup is complete */
+ FileObject->Flags |= FO_CLEANUP_COMPLETE;
+
return STATUS_SUCCESS;
}
NTSTATUS NTAPI
-CdfsCleanup(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+CdfsCleanup(
+ PCDFS_IRP_CONTEXT IrpContext)
{
+ PIRP Irp;
+ PDEVICE_OBJECT DeviceObject;
PDEVICE_EXTENSION DeviceExtension;
PIO_STACK_LOCATION Stack;
PFILE_OBJECT FileObject;
DPRINT("CdfsCleanup() called\n");
- if (DeviceObject == CdfsGlobalData->DeviceObject)
+ ASSERT(IrpContext);
+
+ Irp = IrpContext->Irp;
+ DeviceObject = IrpContext->DeviceObject;
+ Stack = IrpContext->Stack;
+
+ if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject == CdfsGlobalData->HddFsDeviceObject)
{
DPRINT("Closing file system\n");
Status = STATUS_SUCCESS;
goto ByeBye;
}
- Stack = IoGetCurrentIrpStackLocation(Irp);
FileObject = Stack->FileObject;
DeviceExtension = DeviceObject->DeviceExtension;
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&DeviceExtension->DirResource, TRUE);
- Status = CdfsCleanupFile(DeviceExtension, FileObject);
+ Status = CdfsCleanupFile(IrpContext, FileObject);
ExReleaseResourceLite(&DeviceExtension->DirResource);
KeLeaveCriticalRegion();
-
ByeBye:
- Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(Status);
}