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)
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS ****************************************************************/
19 * FUNCTION: Cleans up after a file has been closed.
24 PVFAT_IRP_CONTEXT IrpContext
)
27 PDEVICE_EXTENSION DeviceExt
= IrpContext
->DeviceExt
;
28 PFILE_OBJECT FileObject
= IrpContext
->FileObject
;
30 DPRINT("VfatCleanupFile(DeviceExt %p, FileObject %p)\n",
31 IrpContext
->DeviceExt
, FileObject
);
33 /* FIXME: handle file/directory deletion here */
34 pFcb
= (PVFATFCB
)FileObject
->FsContext
;
36 return STATUS_SUCCESS
;
38 if (pFcb
->Flags
& FCB_IS_VOLUME
)
40 pFcb
->OpenHandleCount
--;
41 DeviceExt
->OpenHandleCount
--;
43 if (pFcb
->OpenHandleCount
!= 0)
45 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
50 if(!ExAcquireResourceExclusiveLite(&pFcb
->MainResource
,
51 (BOOLEAN
)(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
)))
53 return STATUS_PENDING
;
55 if(!ExAcquireResourceExclusiveLite(&pFcb
->PagingIoResource
,
56 (BOOLEAN
)(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
)))
58 ExReleaseResourceLite(&pFcb
->MainResource
);
59 return STATUS_PENDING
;
62 /* Notify about the cleanup */
63 FsRtlNotifyCleanup(IrpContext
->DeviceExt
->NotifySync
,
64 &(IrpContext
->DeviceExt
->NotifyList
),
65 FileObject
->FsContext2
);
67 pFcb
->OpenHandleCount
--;
68 DeviceExt
->OpenHandleCount
--;
70 if (!(*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
) &&
71 FsRtlAreThereCurrentFileLocks(&pFcb
->FileLock
))
73 /* remove all locks this process have on this file */
74 FsRtlFastUnlockAll(&pFcb
->FileLock
,
76 IoGetRequestorProcess(IrpContext
->Irp
),
80 if (pFcb
->Flags
& FCB_IS_DIRTY
)
82 VfatUpdateEntry (pFcb
);
85 if (pFcb
->Flags
& FCB_DELETE_PENDING
&&
86 pFcb
->OpenHandleCount
== 0)
88 PFILE_OBJECT tmpFileObject
;
89 tmpFileObject
= pFcb
->FileObject
;
90 if (tmpFileObject
!= NULL
)
92 pFcb
->FileObject
= NULL
;
93 CcUninitializeCacheMap(tmpFileObject
, NULL
, NULL
);
94 ObDereferenceObject(tmpFileObject
);
95 vfatReleaseFCB(IrpContext
->DeviceExt
, pFcb
);
98 CcPurgeCacheSection(FileObject
->SectionObjectPointer
, NULL
, 0, FALSE
);
101 /* Uninitialize the cache (should be done even if caching was never initialized) */
102 CcUninitializeCacheMap(FileObject
, &pFcb
->RFCB
.FileSize
, NULL
);
104 if (pFcb
->OpenHandleCount
!= 0)
106 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
109 FileObject
->Flags
|= FO_CLEANUP_COMPLETE
;
111 ExReleaseResourceLite(&pFcb
->PagingIoResource
);
112 ExReleaseResourceLite(&pFcb
->MainResource
);
115 return STATUS_SUCCESS
;
119 * FUNCTION: Cleans up after a file has been closed.
123 PVFAT_IRP_CONTEXT IrpContext
)
127 DPRINT("VfatCleanup(DeviceObject %p, Irp %p)\n", IrpContext
->DeviceObject
, IrpContext
->Irp
);
129 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
131 Status
= STATUS_SUCCESS
;
135 if (!ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
,
136 (BOOLEAN
)(IrpContext
->Flags
& IRPCONTEXT_CANWAIT
)))
138 return VfatQueueRequest(IrpContext
);
141 Status
= VfatCleanupFile(IrpContext
);
143 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
145 if (Status
== STATUS_PENDING
)
147 return VfatQueueRequest(IrpContext
);
151 IrpContext
->Irp
->IoStatus
.Status
= Status
;
152 IrpContext
->Irp
->IoStatus
.Information
= 0;
154 IoCompleteRequest(IrpContext
->Irp
, IO_NO_INCREMENT
);
155 VfatFreeIrpContext(IrpContext
);