3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/fs/vfat/cleanup.c
6 * PURPOSE: VFAT Filesystem
7 * PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
11 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS ****************************************************************/
19 VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext
)
21 * FUNCTION: Cleans up after a file has been closed.
25 PFILE_OBJECT FileObject
= IrpContext
->FileObject
;
27 DPRINT("VfatCleanupFile(DeviceExt %x, FileObject %x)\n",
28 IrpContext
->DeviceExt
, FileObject
);
30 /* FIXME: handle file/directory deletion here */
31 pFcb
= (PVFATFCB
) FileObject
->FsContext
;
34 if (!(*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
) &&
35 FsRtlAreThereCurrentFileLocks(&pFcb
->FileLock
))
37 /* remove all locks this process have on this file */
38 FsRtlFastUnlockAll(&pFcb
->FileLock
,
40 IoGetRequestorProcess(IrpContext
->Irp
),
44 if (pFcb
->Flags
& FCB_IS_DIRTY
)
46 VfatUpdateEntry (pFcb
);
49 if (pFcb
->Flags
& FCB_DELETE_PENDING
&&
50 pFcb
->OpenHandleCount
== 1)
52 PFILE_OBJECT tmpFileObject
;
53 tmpFileObject
= pFcb
->FileObject
;
54 if (tmpFileObject
!= NULL
)
56 pFcb
->FileObject
= NULL
;
57 #ifdef USE_ROS_CC_AND_FS
58 CcRosReleaseFileCache(tmpFileObject
);
60 CcUninitializeCacheMap(tmpFileObject
, NULL
, NULL
);
62 ObDereferenceObject(tmpFileObject
);
67 * CcPurgeCacheSection is unimplemented.
69 CcPurgeCacheSection(FileObject
->SectionObjectPointer
, NULL
, 0, FALSE
);
72 /* Uninitialize file cache if. */
73 #ifdef USE_ROS_CC_AND_FS
74 CcRosReleaseFileCache (FileObject
);
76 CcUninitializeCacheMap (FileObject
, NULL
, NULL
);
78 pFcb
->OpenHandleCount
--;
79 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
81 return STATUS_SUCCESS
;
84 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
)
86 * FUNCTION: Cleans up after a file has been closed.
91 DPRINT("VfatCleanup(DeviceObject %x, Irp %x)\n", IrpContext
->DeviceObject
, IrpContext
->Irp
);
93 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
95 Status
= STATUS_SUCCESS
;
99 if (!ExAcquireResourceExclusiveLite (&IrpContext
->DeviceExt
->DirResource
,
100 (BOOLEAN
)(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
)))
102 return VfatQueueRequest (IrpContext
);
105 Status
= VfatCleanupFile(IrpContext
);
107 ExReleaseResourceLite (&IrpContext
->DeviceExt
->DirResource
);
110 IrpContext
->Irp
->IoStatus
.Status
= Status
;
111 IrpContext
->Irp
->IoStatus
.Information
= 0;
113 IoCompleteRequest (IrpContext
->Irp
, IO_NO_INCREMENT
);
114 VfatFreeIrpContext(IrpContext
);