2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/fs/vfat/cleanup.c
5 * PURPOSE: VFAT Filesystem
6 * PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
10 /* INCLUDES *****************************************************************/
15 /* FUNCTIONS ****************************************************************/
18 VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext
)
20 * FUNCTION: Cleans up after a file has been closed.
24 PFILE_OBJECT FileObject
= IrpContext
->FileObject
;
26 DPRINT("VfatCleanupFile(DeviceExt %x, FileObject %x)\n",
27 IrpContext
->DeviceExt
, FileObject
);
29 /* FIXME: handle file/directory deletion here */
30 pFcb
= (PVFATFCB
) FileObject
->FsContext
;
33 if (!(*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
) &&
34 FsRtlAreThereCurrentFileLocks(&pFcb
->FileLock
))
36 /* remove all locks this process have on this file */
37 FsRtlFastUnlockAll(&pFcb
->FileLock
,
39 IoGetRequestorProcess(IrpContext
->Irp
),
43 if (pFcb
->Flags
& FCB_IS_DIRTY
)
45 VfatUpdateEntry (pFcb
);
48 if (pFcb
->Flags
& FCB_DELETE_PENDING
&&
49 pFcb
->OpenHandleCount
== 1)
51 PFILE_OBJECT tmpFileObject
;
52 tmpFileObject
= pFcb
->FileObject
;
53 if (tmpFileObject
!= NULL
)
55 pFcb
->FileObject
= NULL
;
56 #ifdef USE_ROS_CC_AND_FS
57 CcRosReleaseFileCache(tmpFileObject
);
59 CcUninitializeCacheMap(tmpFileObject
, NULL
, NULL
);
61 ObDereferenceObject(tmpFileObject
);
66 * CcPurgeCacheSection is unimplemented.
68 CcPurgeCacheSection(FileObject
->SectionObjectPointer
, NULL
, 0, FALSE
);
71 /* Uninitialize file cache if. */
72 #ifdef USE_ROS_CC_AND_FS
73 CcRosReleaseFileCache (FileObject
);
75 CcUninitializeCacheMap (FileObject
, NULL
, NULL
);
77 pFcb
->OpenHandleCount
--;
78 if (!(*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
))
80 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
83 return STATUS_SUCCESS
;
86 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
)
88 * FUNCTION: Cleans up after a file has been closed.
93 DPRINT("VfatCleanup(DeviceObject %x, Irp %x)\n", IrpContext
->DeviceObject
, IrpContext
->Irp
);
95 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
97 Status
= STATUS_SUCCESS
;
101 if (!ExAcquireResourceExclusiveLite (&IrpContext
->DeviceExt
->DirResource
,
102 (BOOLEAN
)(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
)))
104 return VfatQueueRequest (IrpContext
);
107 Status
= VfatCleanupFile(IrpContext
);
109 ExReleaseResourceLite (&IrpContext
->DeviceExt
->DirResource
);
112 IrpContext
->Irp
->IoStatus
.Status
= Status
;
113 IrpContext
->Irp
->IoStatus
.Information
= 0;
115 IoCompleteRequest (IrpContext
->Irp
, IO_NO_INCREMENT
);
116 VfatFreeIrpContext(IrpContext
);