ReactOS 0.4.17-dev-1190-g4c812f4
flush.c File Reference
#include "ntfs.h"
#include <debug.h>
Include dependency graph for flush.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

static NTSTATUS NTAPI NtfsFlushFileCache (_In_ PNTFS_FCB Fcb)
 
static NTSTATUS NTAPI NtfsFlushVolumeFiles (_In_ PDEVICE_EXTENSION DeviceExt)
 
NtfsFlushBuffers

@implemented

Handles IRP_MJ_FLUSH_BUFFERS.

Parameters
IrpContextPoints to an NTFS_IRP_CONTEXT which describes the request
Returns
STATUS_SUCCESS if everything reached the media, otherwise the status the storage stack returned.
NTSTATUS NtfsFlushBuffers (PNTFS_IRP_CONTEXT IrpContext)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 7 of file flush.c.

Function Documentation

◆ NtfsFlushBuffers()

NTSTATUS NtfsFlushBuffers ( PNTFS_IRP_CONTEXT  IrpContext)

Definition at line 107 of file flush.c.

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}
LONG NTSTATUS
Definition: precomp.h:26
_In_ PFCB Fcb
Definition: cdprocs.h:159
#define NULL
Definition: types.h:112
#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 FCB_IS_VOLUME
Definition: ntfs.h:585
#define NTFS_TYPE_FCB
Definition: ntfs.h:89
Status
Definition: gdiplustypes.h:24
if(dx< 0)
Definition: linetemp.h:194
NTSTATUS NtfsFlushDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: blockdev.c:964
BOOLEAN NTAPI NtfsIsRegularFileObject(_In_ PFILE_OBJECT FileObject)
Definition: fcb.c:153
static NTSTATUS NTAPI NtfsFlushVolumeFiles(_In_ PDEVICE_EXTENSION DeviceExt)
Definition: flush.c:36
static NTSTATUS NTAPI NtfsFlushFileCache(_In_ PNTFS_FCB Fcb)
Definition: flush.c:16
#define STATUS_VOLUME_DISMOUNTED
Definition: ntstatus.h:869
#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
NTFSIDENTIFIER Identifier
Definition: ntfs.h:595
IO_STATUS_BLOCK IoStatus

Referenced by NtfsDispatch().

◆ NtfsFlushFileCache()

static NTSTATUS NTAPI NtfsFlushFileCache ( _In_ PNTFS_FCB  Fcb)
static

Definition at line 16 of file flush.c.

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}
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
#define TRUE
Definition: types.h:120
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
SECTION_OBJECT_POINTERS SectionObjectPointers
Definition: ntfs.h:597
ERESOURCE MainResource
Definition: ntfs.h:607

Referenced by NtfsFlushBuffers(), and NtfsFlushVolumeFiles().

◆ NtfsFlushVolumeFiles()

static NTSTATUS NTAPI NtfsFlushVolumeFiles ( _In_ PDEVICE_EXTENSION  DeviceExt)
static

Definition at line 36 of file flush.c.

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}
#define TAG_NTFS
Definition: ntfs.h:12
#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 NonPagedPool
Definition: env_spec_w32.h:307
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
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
int Count
Definition: noreturn.cpp:7
VOID NtfsReleaseFCB(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
Definition: fcb.c:209
Entry
Definition: section.c:5216
LONG RefCount
Definition: ntfs.h:617
Definition: typedefs.h:120
#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

Referenced by NtfsFlushBuffers().