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 *****************************************************************/
14 /* FUNCTIONS ****************************************************************/
16 static NTSTATUS
VfatFlushFile(PDEVICE_EXTENSION DeviceExt
, PVFATFCB Fcb
)
18 IO_STATUS_BLOCK IoStatus
;
21 DPRINT("VfatFlushFile(DeviceExt %p, Fcb %p) for '%wZ'\n", DeviceExt
, Fcb
, &Fcb
->PathNameU
);
23 CcFlushCache(&Fcb
->SectionObjectPointers
, NULL
, 0, &IoStatus
);
24 if (IoStatus
.Status
== STATUS_INVALID_PARAMETER
)
26 /* FIXME: Caching was possible not initialized */
27 IoStatus
.Status
= STATUS_SUCCESS
;
29 if (Fcb
->Flags
& FCB_IS_DIRTY
)
31 Status
= VfatUpdateEntry(Fcb
);
32 if (!NT_SUCCESS(Status
))
34 IoStatus
.Status
= Status
;
37 return IoStatus
.Status
;
40 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
)
42 PLIST_ENTRY ListEntry
;
44 NTSTATUS Status
, ReturnStatus
= STATUS_SUCCESS
;
46 DPRINT("VfatFlushVolume(DeviceExt %p, FatFcb %p)\n", DeviceExt
, VolumeFcb
);
48 ListEntry
= DeviceExt
->FcbListHead
.Flink
;
49 while (ListEntry
!= &DeviceExt
->FcbListHead
)
51 Fcb
= CONTAINING_RECORD(ListEntry
, VFATFCB
, FcbListEntry
);
52 ListEntry
= ListEntry
->Flink
;
53 if (!vfatFCBIsDirectory(Fcb
))
55 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
56 Status
= VfatFlushFile(DeviceExt
, Fcb
);
57 ExReleaseResourceLite (&Fcb
->MainResource
);
58 if (!NT_SUCCESS(Status
))
60 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
61 ReturnStatus
= Status
;
64 /* FIXME: Stop flushing if this is a removable media and the media was removed */
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 Fcb
= (PVFATFCB
) DeviceExt
->FATFileObject
->FsContext
;
87 ExAcquireResourceExclusiveLite(&DeviceExt
->FatResource
, TRUE
);
88 Status
= VfatFlushFile(DeviceExt
, Fcb
);
89 ExReleaseResourceLite(&DeviceExt
->FatResource
);
91 /* FIXME: Flush the buffers from storage device */
93 if (!NT_SUCCESS(Status
))
95 DPRINT1("VfatFlushFile failed, status = %x\n", Status
);
96 ReturnStatus
= Status
;
102 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
)
107 * This request is not allowed on the main device object.
109 if (IrpContext
->DeviceObject
== VfatGlobalData
->DeviceObject
)
111 Status
= STATUS_INVALID_DEVICE_REQUEST
;
115 Fcb
= (PVFATFCB
)IrpContext
->FileObject
->FsContext
;
118 if (Fcb
->Flags
& FCB_IS_VOLUME
)
120 ExAcquireResourceExclusiveLite(&IrpContext
->DeviceExt
->DirResource
, TRUE
);
121 Status
= VfatFlushVolume(IrpContext
->DeviceExt
, Fcb
);
122 ExReleaseResourceLite(&IrpContext
->DeviceExt
->DirResource
);
126 ExAcquireResourceExclusiveLite(&Fcb
->MainResource
, TRUE
);
127 Status
= VfatFlushFile(IrpContext
->DeviceExt
, Fcb
);
128 ExReleaseResourceLite (&Fcb
->MainResource
);
132 IrpContext
->Irp
->IoStatus
.Status
= Status
;
133 IrpContext
->Irp
->IoStatus
.Information
= 0;
134 IoCompleteRequest (IrpContext
->Irp
, IO_NO_INCREMENT
);
135 VfatFreeIrpContext(IrpContext
);