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
)
29 PDEVICE_EXTENSION DeviceExt
= IrpContext
->DeviceExt
;
30 PFILE_OBJECT FileObject
= IrpContext
->FileObject
;
32 DPRINT("VfatCleanupFile(DeviceExt %p, FileObject %p)\n",
33 IrpContext
->DeviceExt
, FileObject
);
35 /* FIXME: handle file/directory deletion here */
36 pFcb
= (PVFATFCB
)FileObject
->FsContext
;
38 return STATUS_SUCCESS
;
40 IsVolume
= BooleanFlagOn(pFcb
->Flags
, FCB_IS_VOLUME
);
43 pFcb
->OpenHandleCount
--;
44 DeviceExt
->OpenHandleCount
--;
46 if (pFcb
->OpenHandleCount
!= 0)
48 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
53 if(!ExAcquireResourceExclusiveLite(&pFcb
->MainResource
,
54 BooleanFlagOn(IrpContext
->Flags
, IRPCONTEXT_CANWAIT
)))
56 return STATUS_PENDING
;
58 if(!ExAcquireResourceExclusiveLite(&pFcb
->PagingIoResource
,
59 BooleanFlagOn(IrpContext
->Flags
, IRPCONTEXT_CANWAIT
)))
61 ExReleaseResourceLite(&pFcb
->MainResource
);
62 return STATUS_PENDING
;
65 pCcb
= FileObject
->FsContext2
;
66 if (BooleanFlagOn(pCcb
->Flags
, CCB_DELETE_ON_CLOSE
))
68 pFcb
->Flags
|= FCB_DELETE_PENDING
;
71 /* Notify about the cleanup */
72 FsRtlNotifyCleanup(IrpContext
->DeviceExt
->NotifySync
,
73 &(IrpContext
->DeviceExt
->NotifyList
),
74 FileObject
->FsContext2
);
76 pFcb
->OpenHandleCount
--;
77 DeviceExt
->OpenHandleCount
--;
79 if (!vfatFCBIsDirectory(pFcb
) &&
80 FsRtlAreThereCurrentFileLocks(&pFcb
->FileLock
))
82 /* remove all locks this process have on this file */
83 FsRtlFastUnlockAll(&pFcb
->FileLock
,
85 IoGetRequestorProcess(IrpContext
->Irp
),
89 if (BooleanFlagOn(pFcb
->Flags
, FCB_IS_DIRTY
))
91 VfatUpdateEntry (pFcb
, vfatVolumeIsFatX(DeviceExt
));
94 if (BooleanFlagOn(pFcb
->Flags
, FCB_DELETE_PENDING
) &&
95 pFcb
->OpenHandleCount
== 0)
97 if (vfatFCBIsDirectory(pFcb
) &&
98 !VfatIsDirectoryEmpty(DeviceExt
, pFcb
))
100 pFcb
->Flags
&= ~FCB_DELETE_PENDING
;
104 PFILE_OBJECT tmpFileObject
;
105 tmpFileObject
= pFcb
->FileObject
;
106 if (tmpFileObject
!= NULL
)
108 pFcb
->FileObject
= NULL
;
109 CcUninitializeCacheMap(tmpFileObject
, NULL
, NULL
);
110 ClearFlag(pFcb
->Flags
, FCB_CACHE_INITIALIZED
);
111 ObDereferenceObject(tmpFileObject
);
114 pFcb
->RFCB
.ValidDataLength
.QuadPart
= 0;
115 pFcb
->RFCB
.FileSize
.QuadPart
= 0;
116 pFcb
->RFCB
.AllocationSize
.QuadPart
= 0;
120 /* Uninitialize the cache (should be done even if caching was never initialized) */
121 CcUninitializeCacheMap(FileObject
, &pFcb
->RFCB
.FileSize
, NULL
);
123 if (BooleanFlagOn(pFcb
->Flags
, FCB_DELETE_PENDING
) &&
124 pFcb
->OpenHandleCount
== 0)
126 VfatDelEntry(DeviceExt
, pFcb
, NULL
);
128 vfatReportChange(DeviceExt
,
130 (vfatFCBIsDirectory(pFcb
) ?
131 FILE_NOTIFY_CHANGE_DIR_NAME
: FILE_NOTIFY_CHANGE_FILE_NAME
),
132 FILE_ACTION_REMOVED
);
135 if (pFcb
->OpenHandleCount
!= 0)
137 IoRemoveShareAccess(FileObject
, &pFcb
->FCBShareAccess
);
140 FileObject
->Flags
|= FO_CLEANUP_COMPLETE
;
142 ExReleaseResourceLite(&pFcb
->PagingIoResource
);
143 ExReleaseResourceLite(&pFcb
->MainResource
);
146 #ifdef ENABLE_SWAPOUT
147 if (IsVolume
&& BooleanFlagOn(DeviceExt
->Flags
, VCB_DISMOUNT_PENDING
))
149 VfatCheckForDismount(DeviceExt
, FALSE
);
153 return STATUS_SUCCESS
;
157 * FUNCTION: Cleans up after a file has been closed.
161 PVFAT_IRP_CONTEXT IrpContext
)
165 DPRINT("VfatCleanup(DeviceObject %p, Irp %p)\n", IrpContext
->DeviceObject
, IrpContext
->Irp
);
167 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
169 IrpContext
->Irp
->IoStatus
.Information
= 0;
170 return STATUS_SUCCESS
;
173 if (!ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
,
174 BooleanFlagOn(IrpContext
->Flags
, IRPCONTEXT_CANWAIT
)))
176 return VfatMarkIrpContextForQueue(IrpContext
);
179 Status
= VfatCleanupFile(IrpContext
);
181 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
183 if (Status
== STATUS_PENDING
)
185 return VfatMarkIrpContextForQueue(IrpContext
);
188 IrpContext
->Irp
->IoStatus
.Information
= 0;