Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

163 lines
3.4 KiB

/*++
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 (
IN PRX_CONTEXT RxContext,
IN PIRP Irp
)
/*++
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;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
PFCB Fcb;
PFOBX Fobx;
NODE_TYPE_CODE TypeOfOpen;
PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
BOOLEAN FcbAcquired = FALSE;
PAGED_CODE();
TypeOfOpen = RxDecodeFileObject( IrpSp->FileObject, &Fcb, &Fobx );
RxDbgTrace( +1, Dbg, ("RxCommonFlush...IrpC %08lx, Fobx %08lx, Fcb %08lx\n",
RxContext, Fobx, Fcb ));
RxLog(( "%s %lx %lx %lx\n","slF", RxContext, Fcb, Fobx ));
RxWmiLog( LOG,
RxCommonFlushBuffers,
LOGPTR( RxContext )
LOGPTR( Fcb )
LOGPTR( Fobx ) );
//
// 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, Fcb );
if (Status != STATUS_SUCCESS) break;
FcbAcquired = TRUE;
//
// If the file is cached then flush its cache
//
Status = RxFlushFcbInSystemCache( Fcb, TRUE );
if (!NT_SUCCESS( Status )) break;
MINIRDR_CALL( Status, RxContext, Fcb->MRxDispatch, MRxFlush, (RxContext) );
break;
case RDBSS_NTC_SPOOLFILE:
RxDbgTrace(0, Dbg, ("Flush Sppol File\n", 0));
Status = RxAcquireExclusiveFcb( RxContext, Fcb );
if (Status != STATUS_SUCCESS) break;
FcbAcquired = TRUE;
MINIRDR_CALL( Status, RxContext, Fcb->MRxDispatch, MRxFlush, (RxContext) );
break;
default:
Status = STATUS_INVALID_DEVICE_REQUEST;
}
} finally {
DebugUnwind( RxCommonFlushBuffers );
if (FcbAcquired) {
RxReleaseFcb( RxContext, Fcb );
}
}
RxDbgTrace(-1, Dbg, ("RxCommonFlushBuffers -> %08lx\n", Status));
return Status;
}