2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/fs/vfat/close.c
5 * PURPOSE: VFAT Filesystem
6 * PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS ****************************************************************/
19 * FUNCTION: Closes a file
23 PDEVICE_EXTENSION DeviceExt
,
24 PFILE_OBJECT FileObject
)
28 NTSTATUS Status
= STATUS_SUCCESS
;
30 DPRINT("VfatCloseFile(DeviceExt %p, FileObject %p)\n",
31 DeviceExt
, FileObject
);
33 /* FIXME : update entry in directory? */
34 pCcb
= (PVFATCCB
) (FileObject
->FsContext2
);
35 pFcb
= (PVFATFCB
) (FileObject
->FsContext
);
39 return STATUS_SUCCESS
;
42 if (pFcb
->Flags
& FCB_IS_VOLUME
)
46 FileObject
->FsContext2
= NULL
;
50 if (FileObject
->DeletePending
)
52 if (pFcb
->Flags
& FCB_DELETE_PENDING
)
54 VfatDelEntry(DeviceExt
, pFcb
);
56 FsRtlNotifyFullReportChange(DeviceExt
->NotifySync
,
57 &(DeviceExt
->NotifyList
),
58 (PSTRING
)&pFcb
->PathNameU
,
59 pFcb
->PathNameU
.Length
- pFcb
->LongNameU
.Length
,
62 ((*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
) ?
63 FILE_NOTIFY_CHANGE_DIR_NAME
: FILE_NOTIFY_CHANGE_FILE_NAME
),
69 Status
= STATUS_DELETE_PENDING
;
73 vfatReleaseFCB(DeviceExt
, pFcb
);
76 FileObject
->FsContext2
= NULL
;
77 FileObject
->FsContext
= NULL
;
78 FileObject
->SectionObjectPointer
= NULL
;
89 * FUNCTION: Closes a file
93 PVFAT_IRP_CONTEXT IrpContext
)
97 DPRINT("VfatClose(DeviceObject %p, Irp %p)\n", IrpContext
->DeviceObject
, IrpContext
->Irp
);
99 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
101 DPRINT("Closing file system\n");
102 Status
= STATUS_SUCCESS
;
106 /* There occurs a dead look at the call to CcRosDeleteFileCache/ObDereferenceObject/VfatClose
107 in CmLazyCloseThreadMain if VfatClose is execute asynchronous in a worker thread. */
108 if (!ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
, IrpContext
->Flags
& IRPCONTEXT_CANWAIT
))
110 if (!ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
, TRUE
))
113 return VfatQueueRequest(IrpContext
);
116 Status
= VfatCloseFile(IrpContext
->DeviceExt
, IrpContext
->FileObject
);
117 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
120 IrpContext
->Irp
->IoStatus
.Status
= Status
;
121 IrpContext
->Irp
->IoStatus
.Information
= 0;
122 IoCompleteRequest(IrpContext
->Irp
, IO_NO_INCREMENT
);
123 VfatFreeIrpContext(IrpContext
);