-/* $Id: close.c,v 1.1 2000/07/07 02:14:14 ekohl Exp $
+/* $Id: close.c,v 1.9 2001/11/02 22:44:34 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* FUNCTIONS ****************************************************************/
-NTSTATUS FsdCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
+NTSTATUS
+VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
/*
* FUNCTION: Closes a file
*/
{
- PVFATFCB pFcb;
- PVFATCCB pCcb;
- KIRQL oldIrql;
-
- DPRINT("FsdCloseFile(DeviceExt %x, FileObject %x)\n",
- DeviceExt,FileObject);
-
- //FIXME : update entry in directory ?
- pCcb = (PVFATCCB)(FileObject->FsContext2);
-
- DPRINT("pCcb %x\n",pCcb);
- if (pCcb == NULL)
- {
- return(STATUS_SUCCESS);
- }
-
- pFcb = pCcb->pFcb;
-
- pFcb->RefCount--;
- if(pFcb->RefCount<=0)
- {
- KeAcquireSpinLock(&DeviceExt->FcbListLock, &oldIrql);
- RemoveEntryList(&pFcb->FcbListEntry);
- KeReleaseSpinLock(&DeviceExt->FcbListLock, oldIrql);
- ExFreePool(pFcb);
- }
- ExFreePool(pCcb);
- return STATUS_SUCCESS;
+ PVFATFCB pFcb;
+ PVFATCCB pCcb;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT ("VfatCloseFile(DeviceExt %x, FileObject %x)\n",
+ DeviceExt, FileObject);
+
+ /* FIXME : update entry in directory? */
+ pCcb = (PVFATCCB) (FileObject->FsContext2);
+
+ DPRINT ("pCcb %x\n", pCcb);
+ if (pCcb == NULL)
+ {
+ return STATUS_SUCCESS;
+ }
+ if (FileObject->FileName.Buffer)
+ {
+ // This a FO, that was created outside from FSD.
+ // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
+ // This FO's haven't a FileName.
+ pFcb = pCcb->pFcb;
+ if (FileObject->DeletePending)
+ {
+ if (pFcb->Flags & FCB_DELETE_PENDING)
+ {
+ delEntry (DeviceExt, FileObject);
+ }
+ else
+ Status = STATUS_DELETE_PENDING;
+ }
+ FileObject->FsContext2 = NULL;
+ vfatReleaseFCB (DeviceExt, pFcb);
+ }
+ else
+ FileObject->FsContext2 = NULL;
+
+ ExFreePool (pCcb);
+
+ return Status;
}
-NTSTATUS FsdClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext)
/*
* FUNCTION: Closes a file
*/
{
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- PFILE_OBJECT FileObject = Stack->FileObject;
- PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
- NTSTATUS Status;
-
- DPRINT("FsdClose(DeviceObject %x, Irp %x)\n",DeviceObject, Irp);
-
- Status = FsdCloseFile(DeviceExtension,FileObject);
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
+ NTSTATUS Status;
+
+ DPRINT ("VfatClose(DeviceObject %x, Irp %x)\n", DeviceObject, Irp);
+
+ if (!ExAcquireResourceExclusiveLite (&IrpContext->DeviceExt->DirResource, IrpContext->Flags & IRPCONTEXT_CANWAIT))
+ {
+ return VfatQueueRequest (IrpContext);
+ }
+
+ Status = VfatCloseFile (IrpContext->DeviceExt, IrpContext->FileObject);
+ ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
+
+ IrpContext->Irp->IoStatus.Status = Status;
+ IrpContext->Irp->IoStatus.Information = 0;
+ IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
+ VfatFreeIrpContext(IrpContext);
+
+ return (Status);
}
/* EOF */