ReactOS 0.4.15-dev-5895-g2687c1b
flush.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
4 * FILE: flush.c
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
7 * UPDATE HISTORY:
8 */
9
10/* INCLUDES *****************************************************************/
11
12#include "ext2fs.h"
13
14/* GLOBALS ***************************************************************/
15
17
18/* DEFINITIONS *************************************************************/
19
20
24 IN PIRP Irp,
26
27{
28 if (Irp->PendingReturned)
30
31
32 if (Irp->IoStatus.Status == STATUS_INVALID_DEVICE_REQUEST)
33 Irp->IoStatus.Status = STATUS_SUCCESS;
34
35 return STATUS_SUCCESS;
36}
37
40 IN PEXT2_IRP_CONTEXT IrpContext,
43)
44{
45 DEBUG(DL_INF, ( "Ext2FlushVolume: Flushing Vcb ...\n"));
46
47 ExAcquireSharedStarveExclusive(&Vcb->PagingIoResource, TRUE);
48 ExReleaseResourceLite(&Vcb->PagingIoResource);
49
50 return Ext2FlushVcb(Vcb);
51}
52
55 IN PEXT2_IRP_CONTEXT IrpContext,
58)
59{
61
62 ASSERT(Fcb != NULL);
64 (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
65
66 _SEH2_TRY {
67
68 /* do nothing if target fie was deleted */
72 }
73
74 /* update timestamp and achieve attribute */
75 if (Ccb != NULL) {
76
78
79 LARGE_INTEGER SysTime;
80 KeQuerySystemTime(&SysTime);
81
82 Fcb->Inode->i_mtime = Ext2LinuxTime(SysTime);
83 Fcb->Mcb->LastWriteTime = Ext2NtTime(Fcb->Inode->i_mtime);
84 Ext2SaveInode(IrpContext, Fcb->Vcb, Fcb->Inode);
85 }
86 }
87
88 if (IsDirectory(Fcb)) {
89 IoStatus.Status = STATUS_SUCCESS;
91 }
92
93 DEBUG(DL_INF, ( "Ext2FlushFile: Flushing File Inode=%xh %S ...\n",
94 Fcb->Inode->i_ino, Fcb->Mcb->ShortName.Buffer));
95
96 CcFlushCache(&(Fcb->SectionObject), NULL, 0, &IoStatus);
98
100
101 /* do cleanup here */
102 } _SEH2_END;
103
104 return IoStatus.Status;
105}
106
109 IN PEXT2_IRP_CONTEXT IrpContext,
112)
113{
115
117 PLIST_ENTRY ListEntry;
118
119 if (IsVcbReadOnly(Vcb)) {
120 return STATUS_SUCCESS;
121 }
122
123 IoStatus.Status = STATUS_SUCCESS;
124
125 DEBUG(DL_INF, ( "Flushing Files ...\n"));
126
127 // Flush all Fcbs in Vcb list queue.
128 for (ListEntry = Vcb->FcbList.Flink;
129 ListEntry != &Vcb->FcbList;
130 ListEntry = ListEntry->Flink ) {
131
132 Fcb = CONTAINING_RECORD(ListEntry, EXT2_FCB, Next);
135 Ext2FlushFile(IrpContext, Fcb, NULL);
137 }
138
139 return IoStatus.Status;
140}
141
142
145{
147
148 PIRP Irp = NULL;
150
153 PEXT2_FCBVCB FcbOrVcb = NULL;
156
158
159 BOOLEAN MainResourceAcquired = FALSE;
160
161 _SEH2_TRY {
162
163 ASSERT(IrpContext);
164
165 ASSERT((IrpContext->Identifier.Type == EXT2ICX) &&
166 (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT)));
167
168 DeviceObject = IrpContext->DeviceObject;
169
170 //
171 // This request is not allowed on the main device object
172 //
176 }
177
178 Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension;
179 ASSERT(Vcb != NULL);
180 ASSERT((Vcb->Identifier.Type == EXT2VCB) &&
181 (Vcb->Identifier.Size == sizeof(EXT2_VCB)));
182
184 if (IsVcbReadOnly(Vcb)) {
187 }
188
189 Irp = IrpContext->Irp;
191
192 FileObject = IrpContext->FileObject;
193 FcbOrVcb = (PEXT2_FCBVCB) FileObject->FsContext;
194 ASSERT(FcbOrVcb != NULL);
195
196 Ccb = (PEXT2_CCB) FileObject->FsContext2;
197 if (Ccb == NULL) {
200 }
201
202 MainResourceAcquired =
204 ASSERT(MainResourceAcquired);
205 DEBUG(DL_INF, ("Ext2Flush-pre: total mcb records=%u\n",
206 FsRtlNumberOfRunsInLargeMcb(&Vcb->Extents)));
207
208 if (FcbOrVcb->Identifier.Type == EXT2VCB) {
209
210 Ext2VerifyVcb(IrpContext, Vcb);
211 Status = Ext2FlushFiles(IrpContext, (PEXT2_VCB)(FcbOrVcb), FALSE);
212 if (NT_SUCCESS(Status)) {
214 }
215
216 Status = Ext2FlushVolume(IrpContext, (PEXT2_VCB)(FcbOrVcb), FALSE);
217
218 if (NT_SUCCESS(Status) && IsFlagOn(Vcb->Volume->Flags, FO_FILE_MODIFIED)) {
219 ClearFlag(Vcb->Volume->Flags, FO_FILE_MODIFIED);
220 }
221
222 } else if (FcbOrVcb->Identifier.Type == EXT2FCB) {
223
224 Fcb = (PEXT2_FCB)(FcbOrVcb);
225
226 Status = Ext2FlushFile(IrpContext, Fcb, Ccb);
227 if (NT_SUCCESS(Status)) {
228 if (IsFlagOn(FileObject->Flags, FO_FILE_MODIFIED)) {
229 Fcb->Mcb->FileAttr |= FILE_ATTRIBUTE_ARCHIVE;
231 }
232 }
233 }
234
235 DEBUG(DL_INF, ("Ext2Flush-post: total mcb records=%u\n",
236 FsRtlNumberOfRunsInLargeMcb(&Vcb->Extents)));
237
238
239 } _SEH2_FINALLY {
240
241 if (MainResourceAcquired) {
243 }
244
245 if (!IrpContext->ExceptionInProgress) {
246
247 if (Vcb && Irp && IrpSp && !IsVcbReadOnly(Vcb)) {
248
249 // Call the disk driver to flush the physial media.
250 NTSTATUS DriverStatus;
251 PIO_STACK_LOCATION NextIrpSp;
252
253 NextIrpSp = IoGetNextIrpStackLocation(Irp);
254
255 *NextIrpSp = *IrpSp;
256
259 NULL,
260 TRUE,
261 TRUE,
262 TRUE );
263
264 DriverStatus = IoCallDriver(Vcb->TargetDeviceObject, Irp);
265
266 Status = (DriverStatus == STATUS_INVALID_DEVICE_REQUEST) ?
267 Status : DriverStatus;
268
269 IrpContext->Irp = Irp = NULL;
270 }
271
272 Ext2CompleteIrpContext(IrpContext, Status);
273 }
274 } _SEH2_END;
275
276 return Status;
277}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DEBUG(args)
Definition: rdesktop.h:129
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
Definition: cachesub.c:222
_In_ PFCB Fcb
Definition: cdprocs.h:159
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
Definition: cdprocs.h:592
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
NTSTATUS Ext2Flush(IN PEXT2_IRP_CONTEXT IrpContext)
Definition: flush.c:144
NTSTATUS NTAPI Ext2FlushCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: flush.c:22
PEXT2_GLOBAL Ext2Global
Definition: init.c:16
NTSTATUS Ext2FlushFile(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_FCB Fcb, IN PEXT2_CCB Ccb)
Definition: flush.c:54
NTSTATUS Ext2FlushFiles(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN BOOLEAN bShutDown)
Definition: flush.c:108
NTSTATUS Ext2FlushVolume(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN BOOLEAN bShutDown)
Definition: flush.c:39
NTSTATUS Ext2FlushVcb(IN PEXT2_VCB Vcb)
Definition: generic.c:319
#define ClearFlag(_F, _SF)
Definition: ext2fs.h:191
#define FlagOn(_F, _SF)
Definition: ext2fs.h:179
@ EXT2FCB
Definition: ext2fs.h:458
@ EXT2ICX
Definition: ext2fs.h:460
@ EXT2VCB
Definition: ext2fs.h:457
#define IsDirectory(Fcb)
Definition: ext2fs.h:278
#define IsVcbReadOnly(Vcb)
Definition: ext2fs.h:805
#define IsMounted(Vcb)
Definition: ext2fs.h:803
LARGE_INTEGER Ext2NtTime(IN ULONG i_time)
Definition: misc.c:40
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
Definition: generic.c:548
#define IsExt2FsDevice(DO)
Definition: ext2fs.h:607
#define DL_INF
Definition: ext2fs.h:1399
#define FCB_FILE_MODIFIED
Definition: ext2fs.h:873
ULONG Ext2LinuxTime(IN LARGE_INTEGER SysTime)
Definition: misc.c:51
struct _EXT2_FCBVCB * PEXT2_FCBVCB
VOID Ext2VerifyVcb(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb)
Definition: fsctl.c:2277
#define FCB_DELETE_PENDING
Definition: ext2fs.h:879
struct _EXT2_VCB * PEXT2_VCB
struct _EXT2_CCB * PEXT2_CCB
#define CCB_LAST_WRITE_UPDATED
Definition: ext2fs.h:1024
struct _EXT2_FCB * PEXT2_FCB
NTSTATUS Ext2CompleteIrpContext(IN PEXT2_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
Definition: read.c:32
#define IsFlagOn(a, b)
Definition: ext2fs.h:177
#define _SEH2_FINALLY
Definition: filesup.c:21
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define _SEH2_LEAVE
Definition: filesup.c:20
Status
Definition: gdiplustypes.h:25
IoMarkIrpPending(Irp)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:498
ULONG NTAPI FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb)
Definition: largemcb.c:765
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
volatile BOOL bShutDown
Definition: ServiceMain.c:12
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
BOOLEAN NTAPI ExAcquireSharedStarveExclusive(IN PERESOURCE Resource, IN BOOLEAN Wait)
Definition: resource.c:1063
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1817
#define IoCallDriver
Definition: irp.c:1225
#define Vcb
Definition: cdprocs.h:1415
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG Type
Definition: ntfs.h:95
ULONG Size
Definition: ntfs.h:96
ERESOURCE MainResource
Definition: ext2fs.h:628
EXT2_IDENTIFIER Identifier
Definition: ext2fs.h:624
EXT2_IDENTIFIER_TYPE Type
Definition: ext2fs.h:472
ULONG Flags
Definition: ntfs.h:536
PVCB Vcb
Definition: cdstruc.h:933
CD_MCB Mcb
Definition: cdstruc.h:1016
NTFSIDENTIFIER Identifier
Definition: ntfs.h:515
ERESOURCE MainResource
Definition: ntfs.h:528
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_FILE_DELETED
Definition: udferr_usr.h:172
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
#define FO_FILE_MODIFIED
Definition: iotypes.h:1788
* PFILE_OBJECT
Definition: iotypes.h:1998