2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/fs/vfat/flush.c
5 * PURPOSE: VFAT Filesystem
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS ****************************************************************/
21 PDEVICE_EXTENSION DeviceExt
,
24 IO_STATUS_BLOCK IoStatus
;
27 DPRINT("VfatFlushFile(DeviceExt %p, Fcb %p) for '%wZ'\n", DeviceExt
, Fcb
, &Fcb
->PathNameU
);
29 CcFlushCache(&Fcb
->SectionObjectPointers
, NULL
, 0, &IoStatus
);
30 if (IoStatus
.Status
== STATUS_INVALID_PARAMETER
)
32 /* FIXME: Caching was possible not initialized */
33 IoStatus
.Status
= STATUS_SUCCESS
;
36 ExAcquireResourceExclusiveLite(&DeviceExt
->DirResource
, TRUE
);
37 if (BooleanFlagOn(Fcb
->Flags
, FCB_IS_DIRTY
))
39 Status
= VfatUpdateEntry(DeviceExt
, Fcb
);
40 if (!NT_SUCCESS(Status
))
42 IoStatus
.Status
= Status
;
45 ExReleaseResourceLite(&DeviceExt
->DirResource
);
47 return IoStatus
.Status
;
52 PDEVICE_EXTENSION DeviceExt
,
55 PLIST_ENTRY ListEntry
;
57 NTSTATUS Status
, ReturnStatus
= STATUS_SUCCESS
;
60 IO_STATUS_BLOCK IoStatusBlock
;
62 DPRINT("VfatFlushVolume(DeviceExt %p, VolumeFcb %p)\n", DeviceExt
, VolumeFcb
);
64 ASSERT(VolumeFcb
== DeviceExt
->VolumeFcb
);
66 ListEntry
= DeviceExt
->FcbListHead
.Flink
;
67 while (ListEntry
!= &DeviceExt
->FcbListHead
)
69 Fcb
= CONTAINING_RECORD(ListEntry
, VFATFCB
, FcbListEntry
);
70 ListEntry
= ListEntry
->Flink
;
71 if (!vfatFCBIsDirectory(Fcb
))
73 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
74 Status
= VfatFlushFile(DeviceExt
, Fcb
);
75 ExReleaseResourceLite (&Fcb
->MainResource
);
76 if (!NT_SUCCESS(Status
))
78 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
79 ReturnStatus
= Status
;
82 /* FIXME: Stop flushing if this is a removable media and the media was removed */
85 ListEntry
= DeviceExt
->FcbListHead
.Flink
;
86 while (ListEntry
!= &DeviceExt
->FcbListHead
)
88 Fcb
= CONTAINING_RECORD(ListEntry
, VFATFCB
, FcbListEntry
);
89 ListEntry
= ListEntry
->Flink
;
90 if (vfatFCBIsDirectory(Fcb
))
92 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
93 Status
= VfatFlushFile(DeviceExt
, Fcb
);
94 ExReleaseResourceLite (&Fcb
->MainResource
);
95 if (!NT_SUCCESS(Status
))
97 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
98 ReturnStatus
= Status
;
101 /* FIXME: Stop flushing if this is a removable media and the media was removed */
104 Fcb
= (PVFATFCB
) DeviceExt
->FATFileObject
->FsContext
;
106 ExAcquireResourceExclusiveLite(&DeviceExt
->FatResource
, TRUE
);
107 Status
= VfatFlushFile(DeviceExt
, Fcb
);
108 ExReleaseResourceLite(&DeviceExt
->FatResource
);
110 /* Prepare an IRP to flush device buffers */
111 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_FLUSH_BUFFERS
,
112 DeviceExt
->StorageDevice
,
113 NULL
, 0, NULL
, &Event
,
117 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
119 Status
= IoCallDriver(DeviceExt
->StorageDevice
, Irp
);
120 if (Status
== STATUS_PENDING
)
122 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
123 Status
= IoStatusBlock
.Status
;
126 /* Ignore device not supporting flush operation */
127 if (Status
== STATUS_INVALID_DEVICE_REQUEST
)
129 DPRINT1("Flush not supported, ignored\n");
130 Status
= STATUS_SUCCESS
;
136 Status
= STATUS_INSUFFICIENT_RESOURCES
;
139 if (!NT_SUCCESS(Status
))
141 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
142 ReturnStatus
= Status
;
150 PVFAT_IRP_CONTEXT IrpContext
)
155 /* This request is not allowed on the main device object. */
156 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
158 IrpContext
->Irp
->IoStatus
.Information
= 0;
159 return STATUS_INVALID_DEVICE_REQUEST
;
162 Fcb
= (PVFATFCB
)IrpContext
->FileObject
->FsContext
;
165 if (BooleanFlagOn(Fcb
->Flags
, FCB_IS_VOLUME
))
167 ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
, TRUE
);
168 Status
= VfatFlushVolume(IrpContext
->DeviceExt
, Fcb
);
169 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
173 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
174 Status
= VfatFlushFile(IrpContext
->DeviceExt
, Fcb
);
175 ExReleaseResourceLite (&Fcb
->MainResource
);
178 IrpContext
->Irp
->IoStatus
.Information
= 0;