186 lines
4.1 KiB
C
186 lines
4.1 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Flush.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the File Flush buffers routine for Rx called by the
|
||
dispatch driver.
|
||
|
||
In a future version of the wrapper, it may be that flush will be routed thru lowio.
|
||
|
||
Author:
|
||
|
||
Joe Linn [JoeLinn] 15-dec-1994
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
//
|
||
// The local debug trace level
|
||
//
|
||
|
||
#define Dbg (DEBUG_TRACE_FLUSH)
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text(PAGE, RxCommonFlushBuffers)
|
||
#endif
|
||
|
||
|
||
|
||
NTSTATUS
|
||
RxCommonFlushBuffers ( RXCOMMON_SIGNATURE )
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This is the common routine for flushing file buffers.
|
||
|
||
Arguments:
|
||
|
||
Irp - Supplies the Irp to process
|
||
|
||
Return Value:
|
||
|
||
RXSTATUS - The return status for the operation
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
RxCaptureRequestPacket;
|
||
RxCaptureFcb; RxCaptureFobx; RxCaptureParamBlock; RxCaptureFileObject;
|
||
NODE_TYPE_CODE TypeOfOpen = NodeType(capFcb);
|
||
|
||
PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
|
||
|
||
|
||
BOOLEAN FcbAcquired = FALSE;
|
||
|
||
PAGED_CODE();
|
||
|
||
RxDbgTrace(+1, Dbg, ("RxCommonFlush...IrpC %08lx, Fobx %08lx, Fcb %08lx\n",
|
||
RxContext, capFobx, capFcb));
|
||
RxLog(("%s %lx %lx %lx\n","slF",RxContext,capFcb,capFobx));
|
||
RxWmiLog(LOG,
|
||
RxCommonFlushBuffers,
|
||
LOGPTR(RxContext)
|
||
LOGPTR(capFcb)
|
||
LOGPTR(capFobx));
|
||
|
||
//
|
||
// CcFlushCache is always synchronous, so if we can't wait enqueue
|
||
// the irp to the Fsp.
|
||
|
||
if ( !FlagOn(RxContext->Flags, RX_CONTEXT_FLAG_WAIT) ) {
|
||
|
||
Status = RxFsdPostRequest( RxContext );
|
||
|
||
RxDbgTrace(-1, Dbg, ("RxCommonFlushBuffers -> %08lx\n", Status ));
|
||
return Status;
|
||
}
|
||
|
||
Status = STATUS_SUCCESS;
|
||
|
||
try {
|
||
|
||
//
|
||
// Case on the type of open that we are trying to flush
|
||
//
|
||
|
||
switch (TypeOfOpen) {
|
||
|
||
case RDBSS_NTC_STORAGE_TYPE_FILE:
|
||
|
||
RxDbgTrace(0, Dbg, ("Flush User File Open\n", 0));
|
||
|
||
Status = RxAcquireExclusiveFcb( RxContext, capFcb );
|
||
|
||
if (Status != STATUS_SUCCESS) break;
|
||
|
||
FcbAcquired = TRUE;
|
||
|
||
//
|
||
// If the file is cached then flush its cache
|
||
//
|
||
|
||
Status = RxFlushFcbInSystemCache(capFcb, TRUE);
|
||
|
||
if (!NT_SUCCESS( Status )) break;
|
||
|
||
//rdrs don't do this.....only local FSs
|
||
////
|
||
//// Check if we should be changing the time or file size
|
||
//
|
||
//RxAdjustFileTimesAndSize(RXCOMMON_ARGUMENTS);
|
||
|
||
// if we make this lowio.........
|
||
////
|
||
//// Initialize LowIO_CONTEXT block in the RxContext and Calldown
|
||
//
|
||
//RxInitializeLowIoContext(LowIoContext,LOWIO_OP_FLUSH);
|
||
//
|
||
//Status = RxLowIoFlushShell(RxContext);
|
||
|
||
MINIRDR_CALL(Status,RxContext,capFcb->MRxDispatch,MRxFlush,(RxContext));
|
||
break;
|
||
|
||
case RDBSS_NTC_SPOOLFILE:
|
||
|
||
RxDbgTrace(0, Dbg, ("Flush Sppol File\n", 0));
|
||
|
||
Status = RxAcquireExclusiveFcb( RxContext, capFcb );
|
||
|
||
if (Status != STATUS_SUCCESS) break;
|
||
|
||
FcbAcquired = TRUE;
|
||
|
||
// should this be low io???
|
||
////
|
||
//// Initialize LowIO_CONTEXT block in the RxContext and Calldown
|
||
//
|
||
//RxInitializeLowIoContext(LowIoContext,LOWIO_OP_FLUSH);
|
||
//
|
||
//Status = RxLowIoFlushShell(RxContext);
|
||
|
||
MINIRDR_CALL(Status,RxContext,capFcb->MRxDispatch,MRxFlush,(RxContext));
|
||
break;
|
||
|
||
default:
|
||
|
||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||
}
|
||
|
||
|
||
} finally {
|
||
|
||
DebugUnwind( RxCommonFlushBuffers );
|
||
|
||
if (FcbAcquired) { RxReleaseFcb( RxContext, capFcb ); }
|
||
|
||
//
|
||
// If this is a normal termination then pass the request on
|
||
// to the target device object.
|
||
//
|
||
|
||
if (!AbnormalTermination()) {
|
||
|
||
NOTHING;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
RxDbgTrace(-1, Dbg, ("RxCommonFlushBuffers -> %08lx\n", Status));
|
||
return Status;
|
||
}
|
||
|