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
--;
42 if (pFcb
->OpenHandleCount
!= 0)
44 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
49 if(!ExAcquireResourceExclusiveLite(&pFcb
->MainResource
,
50 BooleanFlagOn(IrpContext
->Flags
, IRPCONTEXT_CANWAIT
)))
52 return STATUS_PENDING
;
54 if(!ExAcquireResourceExclusiveLite(&pFcb
->PagingIoResource
,
55 BooleanFlagOn(IrpContext
->Flags
, IRPCONTEXT_CANWAIT
)))
57 ExReleaseResourceLite(&pFcb
->MainResource
);
58 return STATUS_PENDING
;
61 /* Notify about the cleanup */
62 FsRtlNotifyCleanup(IrpContext
->DeviceExt
->NotifySync
,
63 &(IrpContext
->DeviceExt
->NotifyList
),
64 FileObject
->FsContext2
);
66 pFcb
->OpenHandleCount
--;
67 DeviceExt
->OpenHandleCount
--;
69 if (!(*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
) &&
70 FsRtlAreThereCurrentFileLocks(&pFcb
->FileLock
))
72 /* remove all locks this process have on this file */
73 FsRtlFastUnlockAll(&pFcb
->FileLock
,
75 IoGetRequestorProcess(IrpContext
->Irp
),
79 if (pFcb
->Flags
& FCB_IS_DIRTY
)
81 VfatUpdateEntry (pFcb
);
84 if (pFcb
->Flags
& FCB_DELETE_PENDING
&&
85 pFcb
->OpenHandleCount
== 0)
87 PFILE_OBJECT tmpFileObject
;
88 tmpFileObject
= pFcb
->FileObject
;
89 if (tmpFileObject
!= NULL
)
91 pFcb
->FileObject
= NULL
;
92 CcUninitializeCacheMap(tmpFileObject
, NULL
, NULL
);
93 ObDereferenceObject(tmpFileObject
);
96 pFcb
->RFCB
.ValidDataLength
.QuadPart
= 0;
97 pFcb
->RFCB
.FileSize
.QuadPart
= 0;
98 pFcb
->RFCB
.AllocationSize
.QuadPart
= 0;
101 /* Uninitialize the cache (should be done even if caching was never initialized) */
102 CcUninitializeCacheMap(FileObject
, &pFcb
->RFCB
.FileSize
, NULL
);
104 if (pFcb
->Flags
& FCB_DELETE_PENDING
&&
105 pFcb
->OpenHandleCount
== 0)
107 VfatDelEntry(DeviceExt
, pFcb
, NULL
);
109 FsRtlNotifyFullReportChange(DeviceExt
->NotifySync
,
110 &(DeviceExt
->NotifyList
),
111 (PSTRING
)&pFcb
->PathNameU
,
112 pFcb
->PathNameU
.Length
- pFcb
->LongNameU
.Length
,
115 ((*pFcb
->Attributes
& FILE_ATTRIBUTE_DIRECTORY
) ?
116 FILE_NOTIFY_CHANGE_DIR_NAME
: FILE_NOTIFY_CHANGE_FILE_NAME
),
121 if (pFcb
->OpenHandleCount
!= 0)
123 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
126 FileObject
->Flags
|= FO_CLEANUP_COMPLETE
;
128 ExReleaseResourceLite(&pFcb
->PagingIoResource
);
129 ExReleaseResourceLite(&pFcb
->MainResource
);
132 #ifdef ENABLE_SWAPOUT
133 if (DeviceExt
->Flags
& VCB_DISMOUNT_PENDING
)
135 VfatCheckForDismount(DeviceExt
, FALSE
);
139 return STATUS_SUCCESS
;
143 * FUNCTION: Cleans up after a file has been closed.
147 PVFAT_IRP_CONTEXT IrpContext
)
151 DPRINT("VfatCleanup(DeviceObject %p, Irp %p)\n", IrpContext
->DeviceObject
, IrpContext
->Irp
);
153 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
155 IrpContext
->Irp
->IoStatus
.Information
= 0;
156 return STATUS_SUCCESS
;
159 if (!ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
,
160 BooleanFlagOn(IrpContext
->Flags
, IRPCONTEXT_CANWAIT
)))
162 return VfatMarkIrpContextForQueue(IrpContext
);
165 Status
= VfatCleanupFile(IrpContext
);
167 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
169 if (Status
== STATUS_PENDING
)
171 return VfatMarkIrpContextForQueue(IrpContext
);
174 IrpContext
->Irp
->IoStatus
.Information
= 0;