respecting FILE_WRITE_THROUGH flag on open

This commit is contained in:
Olga Kornievskaia 2012-02-15 16:15:26 -05:00 committed by unknown
parent 0285d46a26
commit 73294dff68

View file

@ -417,6 +417,7 @@ typedef struct _NFS41_FOBX {
DWORD acl_len; DWORD acl_len;
LARGE_INTEGER time; LARGE_INTEGER time;
DWORD deleg_type; DWORD deleg_type;
BOOLEAN write_thru;
} NFS41_FOBX, *PNFS41_FOBX; } NFS41_FOBX, *PNFS41_FOBX;
#define NFS41GetFobxExtension(pFobx) \ #define NFS41GetFobxExtension(pFobx) \
(((pFobx) == NULL) ? NULL : (PNFS41_FOBX)((pFobx)->Context)) (((pFobx) == NULL) ? NULL : (PNFS41_FOBX)((pFobx)->Context))
@ -3548,7 +3549,9 @@ NTSTATUS nfs41_Create(
SrvOpen->BufferingFlags |= SrvOpen->BufferingFlags |=
(FCB_STATE_WRITECACHING_ENABLED | (FCB_STATE_WRITECACHING_ENABLED |
FCB_STATE_WRITEBUFFERING_ENABLED); FCB_STATE_WRITEBUFFERING_ENABLED);
} } else if (params.CreateOptions & FILE_WRITE_THROUGH ||
pVNetRootContext->write_thru)
nfs41_fobx->write_thru = TRUE;
if (entry->u.Open.deleg_type >= 1 || if (entry->u.Open.deleg_type >= 1 ||
params.DesiredAccess & FILE_READ_DATA) { params.DesiredAccess & FILE_READ_DATA) {
#ifdef DEBUG_OPEN #ifdef DEBUG_OPEN
@ -5147,10 +5150,12 @@ void enable_caching(
if (SrvOpen->DesiredAccess & FILE_READ_DATA) if (SrvOpen->DesiredAccess & FILE_READ_DATA)
flag = ENABLE_READ_CACHING; flag = ENABLE_READ_CACHING;
if (SrvOpen->DesiredAccess & FILE_WRITE_DATA) if ((SrvOpen->DesiredAccess & FILE_WRITE_DATA) &&
!nfs41_fobx->write_thru)
flag = ENABLE_WRITE_CACHING; flag = ENABLE_WRITE_CACHING;
if ((SrvOpen->DesiredAccess & FILE_READ_DATA) && if ((SrvOpen->DesiredAccess & FILE_READ_DATA) &&
(SrvOpen->DesiredAccess & FILE_WRITE_DATA)) (SrvOpen->DesiredAccess & FILE_WRITE_DATA) &&
!nfs41_fobx->write_thru)
flag = ENABLE_READWRITE_CACHING; flag = ENABLE_READWRITE_CACHING;
#if defined(DEBUG_TIME_BASED_COHERENCY) || \ #if defined(DEBUG_TIME_BASED_COHERENCY) || \
@ -5383,14 +5388,15 @@ NTSTATUS nfs41_Write(
nfs41_fcb->changeattr = entry->u.ReadWrite.ChangeTime; nfs41_fcb->changeattr = entry->u.ReadWrite.ChangeTime;
//re-enable write buffering //re-enable write buffering
if ((!BooleanFlagOn(LowIoContext->ParamsFor.ReadWrite.Flags, if (!BooleanFlagOn(LowIoContext->ParamsFor.ReadWrite.Flags,
LOWIO_READWRITEFLAG_PAGING_IO) && LOWIO_READWRITEFLAG_PAGING_IO) &&
(SrvOpen->DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) && (SrvOpen->DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) &&
!pVNetRootContext->write_thru && !pVNetRootContext->write_thru &&
!pVNetRootContext->nocache && !pVNetRootContext->nocache &&
!nfs41_fobx->write_thru &&
!(SrvOpen->BufferingFlags & !(SrvOpen->BufferingFlags &
(FCB_STATE_WRITEBUFFERING_ENABLED | (FCB_STATE_WRITEBUFFERING_ENABLED |
FCB_STATE_WRITECACHING_ENABLED)))) { FCB_STATE_WRITECACHING_ENABLED))) {
enable_caching(SrvOpen, nfs41_fobx, nfs41_fcb->changeattr, enable_caching(SrvOpen, nfs41_fobx, nfs41_fcb->changeattr,
pVNetRootContext->session); pVNetRootContext->session);
} else if (!nfs41_fobx->deleg_type) } else if (!nfs41_fobx->deleg_type)