ReactOS 0.4.17-dev-1190-g4c812f4
flush.c
Go to the documentation of this file.
1
2
3/* INCLUDES *****************************************************************/
4
5#include "ntfs.h"
6
7#define NDEBUG
8#include <debug.h>
9
10/* FUNCTIONS ****************************************************************/
11
12/* Writes what the cache still holds for this file */
13static
18{
20
22 return STATUS_SUCCESS;
23
24 /* Keep cached writes out so the flush covers all of them */
28
29 return IoStatus.Status;
30}
31
32/* Flushes every file of the volume, as a flush of the volume handle asks for */
33static
37 _In_ PDEVICE_EXTENSION DeviceExt)
38{
39 PNTFS_FCB *Fcbs;
41 ULONG Count = 0, Taken = 0, i;
44
45 KeAcquireSpinLock(&DeviceExt->FcbListLock, &OldIrql);
46 for (Entry = DeviceExt->FcbListHead.Flink; Entry != &DeviceExt->FcbListHead; Entry = Entry->Flink)
47 Count++;
48 KeReleaseSpinLock(&DeviceExt->FcbListLock, OldIrql);
49
50 if (Count == 0)
51 return STATUS_SUCCESS;
52
53 /* Some slack for files opened meanwhile, the next flush gets the rest */
54 Count += 16;
55 Fcbs = ExAllocatePoolWithTag(NonPagedPool, Count * sizeof(*Fcbs), TAG_NTFS);
56 if (Fcbs == NULL)
58
59 /* Take references, a delete may take an FCB off the list while we flush.
60 * Unreferenced FCBs only linger for their section and have nothing cached
61 * to write; releasing one again would tear it down twice. */
62 KeAcquireSpinLock(&DeviceExt->FcbListLock, &OldIrql);
63 for (Entry = DeviceExt->FcbListHead.Flink;
64 Entry != &DeviceExt->FcbListHead && Taken < Count;
65 Entry = Entry->Flink)
66 {
68
69 if (Fcb->RefCount <= 0)
70 continue;
71
72 Fcb->RefCount++;
73 Fcbs[Taken++] = Fcb;
74 }
75 KeReleaseSpinLock(&DeviceExt->FcbListLock, OldIrql);
76
77 for (i = 0; i < Taken; i++)
78 {
79 NTSTATUS FlushStatus = NtfsFlushFileCache(Fcbs[i]);
80
81 if (!NT_SUCCESS(FlushStatus) && NT_SUCCESS(Status))
82 Status = FlushStatus;
83
84 NtfsReleaseFCB(DeviceExt, Fcbs[i]);
85 }
86
88
89 return Status;
90}
91
108{
109 PDEVICE_EXTENSION DeviceExt;
112 NTSTATUS DeviceStatus;
113
114 DPRINT("NtfsFlushBuffers(%p)\n", IrpContext);
115
116 IrpContext->Irp->IoStatus.Information = 0;
117
118 /* Nothing is mounted on the main device object */
119 if (IrpContext->DeviceObject == NtfsGlobalData->DeviceObject)
120 {
121 return STATUS_SUCCESS;
122 }
123
124 DeviceExt = IrpContext->DeviceObject->DeviceExtension;
125
126 if (DeviceExt->Flags & VCB_VOLUME_DISMOUNTED)
127 {
129 }
130
131 /* Flushing waits on the disk */
132 if (!(IrpContext->Flags & IRPCONTEXT_CANWAIT))
133 return NtfsMarkIrpContextForQueue(IrpContext);
134
135 /* Cached writes only reach the disk once the cache lets them go */
136 Fcb = (PNTFS_FCB)IrpContext->FileObject->FsContext;
139 else if (Fcb != NULL && Fcb->Identifier.Type == NTFS_TYPE_FCB && (Fcb->Flags & FCB_IS_VOLUME))
140 Status = NtfsFlushVolumeFiles(DeviceExt);
141 else
143
144 DeviceStatus = NtfsFlushDevice(DeviceExt->StorageDevice);
145
146 return NT_SUCCESS(Status) ? DeviceStatus : Status;
147}
148
149/* EOF */
LONG NTSTATUS
Definition: precomp.h:26
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
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
PNTFS_GLOBAL_DATA NtfsGlobalData
Definition: ntfs.c:36
FORCEINLINE NTSTATUS NtfsMarkIrpContextForQueue(PNTFS_IRP_CONTEXT IrpContext)
Definition: ntfs.h:652
#define VCB_VOLUME_DISMOUNTED
Definition: ntfs.h:148
#define IRPCONTEXT_CANWAIT
Definition: ntfs.h:505
struct _FCB * PNTFS_FCB
#define TAG_NTFS
Definition: ntfs.h:12
#define FCB_IS_VOLUME
Definition: ntfs.h:585
#define NTFS_TYPE_FCB
Definition: ntfs.h:89
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
#define NonPagedPool
Definition: env_spec_w32.h:307
Status
Definition: gdiplustypes.h:24
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
if(dx< 0)
Definition: linetemp.h:194
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
#define _In_
Definition: no_sal2.h:158
int Count
Definition: noreturn.cpp:7
NTSTATUS NtfsFlushDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: blockdev.c:964
BOOLEAN NTAPI NtfsIsRegularFileObject(_In_ PFILE_OBJECT FileObject)
Definition: fcb.c:153
VOID NtfsReleaseFCB(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
Definition: fcb.c:209
static NTSTATUS NTAPI NtfsFlushVolumeFiles(_In_ PDEVICE_EXTENSION DeviceExt)
Definition: flush.c:36
static NTSTATUS NTAPI NtfsFlushFileCache(_In_ PNTFS_FCB Fcb)
Definition: flush.c:16
NTSTATUS NtfsFlushBuffers(PNTFS_IRP_CONTEXT IrpContext)
Definition: flush.c:107
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
#define STATUS_VOLUME_DISMOUNTED
Definition: ntstatus.h:869
Entry
Definition: section.c:5216
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
ULONG Type
Definition: ntfs.h:96
PDEVICE_OBJECT DeviceObject
Definition: ntfs.h:175
PFILE_OBJECT FileObject
Definition: ntfs.h:564
ULONG Flags
Definition: ntfs.h:556
PDEVICE_OBJECT DeviceObject
Definition: ntfs.h:563
PVOID DeviceExtension
Definition: env_spec_w32.h:418
Definition: cdstruc.h:902
ULONG Flags
Definition: ntfs.h:618
LONG RefCount
Definition: ntfs.h:617
NTFSIDENTIFIER Identifier
Definition: ntfs.h:595
SECTION_OBJECT_POINTERS SectionObjectPointers
Definition: ntfs.h:597
ERESOURCE MainResource
Definition: ntfs.h:607
IO_STATUS_BLOCK IoStatus
Definition: typedefs.h:120
#define NTAPI
Definition: typedefs.h:36
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778