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 if (Fcb
->Flags
& FCB_IS_DIRTY
)
38 Status
= VfatUpdateEntry(Fcb
);
39 if (!NT_SUCCESS(Status
))
41 IoStatus
.Status
= Status
;
44 return IoStatus
.Status
;
49 PDEVICE_EXTENSION DeviceExt
,
52 PLIST_ENTRY ListEntry
;
54 NTSTATUS Status
, ReturnStatus
= STATUS_SUCCESS
;
56 DPRINT("VfatFlushVolume(DeviceExt %p, FatFcb %p)\n", DeviceExt
, VolumeFcb
);
58 ListEntry
= DeviceExt
->FcbListHead
.Flink
;
59 while (ListEntry
!= &DeviceExt
->FcbListHead
)
61 Fcb
= CONTAINING_RECORD(ListEntry
, VFATFCB
, FcbListEntry
);
62 ListEntry
= ListEntry
->Flink
;
63 if (!vfatFCBIsDirectory(Fcb
))
65 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
66 Status
= VfatFlushFile(DeviceExt
, Fcb
);
67 ExReleaseResourceLite (&Fcb
->MainResource
);
68 if (!NT_SUCCESS(Status
))
70 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
71 ReturnStatus
= Status
;
74 /* FIXME: Stop flushing if this is a removable media and the media was removed */
77 ListEntry
= DeviceExt
->FcbListHead
.Flink
;
78 while (ListEntry
!= &DeviceExt
->FcbListHead
)
80 Fcb
= CONTAINING_RECORD(ListEntry
, VFATFCB
, FcbListEntry
);
81 ListEntry
= ListEntry
->Flink
;
82 if (vfatFCBIsDirectory(Fcb
))
84 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
85 Status
= VfatFlushFile(DeviceExt
, Fcb
);
86 ExReleaseResourceLite (&Fcb
->MainResource
);
87 if (!NT_SUCCESS(Status
))
89 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
90 ReturnStatus
= Status
;
93 /* FIXME: Stop flushing if this is a removable media and the media was removed */
96 Fcb
= (PVFATFCB
) DeviceExt
->FATFileObject
->FsContext
;
98 ExAcquireResourceExclusiveLite(&DeviceExt
->FatResource
, TRUE
);
99 Status
= VfatFlushFile(DeviceExt
, Fcb
);
100 ExReleaseResourceLite(&DeviceExt
->FatResource
);
102 /* FIXME: Flush the buffers from storage device */
104 if (!NT_SUCCESS(Status
))
106 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
107 ReturnStatus
= Status
;
115 PVFAT_IRP_CONTEXT IrpContext
)
120 /* This request is not allowed on the main device object. */
121 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
123 Status
= STATUS_INVALID_DEVICE_REQUEST
;
127 Fcb
= (PVFATFCB
)IrpContext
->FileObject
->FsContext
;
130 if (Fcb
->Flags
& FCB_IS_VOLUME
)
132 ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
, TRUE
);
133 Status
= VfatFlushVolume(IrpContext
->DeviceExt
, Fcb
);
134 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
138 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
139 Status
= VfatFlushFile(IrpContext
->DeviceExt
, Fcb
);
140 ExReleaseResourceLite (&Fcb
->MainResource
);
144 IrpContext
->Irp
->IoStatus
.Status
= Status
;
145 IrpContext
->Irp
->IoStatus
.Information
= 0;
146 IoCompleteRequest (IrpContext
->Irp
, IO_NO_INCREMENT
);
147 VfatFreeIrpContext(IrpContext
);