From aed1493e906921b6b0b786286c01ada9d0d6dede Mon Sep 17 00:00:00 2001 From: Olga Kornievskaia Date: Wed, 7 Dec 2011 18:10:09 -0500 Subject: [PATCH] adding writethru mount option for large writes it is beneficial to turnoff write buffering and allow large write buffer sizes than 1M (for win 7). --- sys/nfs41_driver.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c index b776120..24e2658 100644 --- a/sys/nfs41_driver.c +++ b/sys/nfs41_driver.c @@ -318,6 +318,7 @@ typedef struct _NFS41_MOUNT_CONFIG { DWORD ReadSize; DWORD WriteSize; BOOLEAN ReadOnly; + BOOLEAN write_thru; WCHAR srv_buffer[SERVER_NAME_BUFFER_SIZE]; UNICODE_STRING SrvName; WCHAR mntpt_buffer[MAX_PATH]; @@ -350,6 +351,7 @@ typedef struct _NFS41_V_NET_ROOT_EXTENSION { LONG FsAttrsLen; DWORD sec_flavor; BOOLEAN read_only; + BOOLEAN write_thru; #define STORE_MOUNT_SEC_CONTEXT #ifdef STORE_MOUNT_SEC_CONTEXT SECURITY_CLIENT_CONTEXT mount_sec_ctx; @@ -2409,6 +2411,7 @@ void nfs41_MountConfig_InitDefaults( Config->ReadSize = MOUNT_CONFIG_RW_SIZE_DEFAULT; Config->WriteSize = MOUNT_CONFIG_RW_SIZE_DEFAULT; Config->ReadOnly = FALSE; + Config->write_thru = FALSE; Config->SrvName.Length = 0; Config->SrvName.MaximumLength = SERVER_NAME_BUFFER_SIZE; Config->SrvName.Buffer = Config->srv_buffer; @@ -2500,6 +2503,11 @@ NTSTATUS nfs41_MountConfig_ParseOptions( status = nfs41_MountConfig_ParseBoolean(Option, &usValue, &Config->ReadOnly); } + else if (wcsncmp(L"writethru", Name, NameLen) == 0) + { + status = nfs41_MountConfig_ParseBoolean(Option, &usValue, + &Config->write_thru); + } else if (wcsncmp(L"rsize", Name, NameLen) == 0) { status = nfs41_MountConfig_ParseDword(Option, &usValue, @@ -2698,7 +2706,8 @@ NTSTATUS nfs41_CreateVNetRoot( &Config); if (status != STATUS_SUCCESS) goto out; - pVNetRootContext->read_only = Config.ReadOnly; + pVNetRootContext->read_only = Config.ReadOnly; + pVNetRootContext->write_thru = Config.write_thru; } else { /* use the SRV_CALL name (without leading \) as the hostname */ Config.SrvName.Buffer = pSrvCall->pSrvCallName->Buffer + 1; @@ -3335,7 +3344,8 @@ NTSTATUS nfs41_Create( // the file was opened read-only. if (/*(params.DesiredAccess & FILE_READ_DATA) && */ (params.DesiredAccess & FILE_WRITE_DATA || - params.DesiredAccess & FILE_APPEND_DATA)) + params.DesiredAccess & FILE_APPEND_DATA) && + !pVNetRootContext->write_thru) SrvOpen->BufferingFlags |= (FCB_STATE_WRITECACHING_ENABLED | FCB_STATE_WRITEBUFFERING_ENABLED); #endif @@ -5084,6 +5094,7 @@ NTSTATUS nfs41_Write ( LOWIO_READWRITEFLAG_PAGING_IO) && (SrvOpen->DesiredAccess & FILE_WRITE_DATA) && (SrvOpen->DesiredAccess & FILE_READ_DATA) && + !pVNetRootContext->write_thru && !(SrvOpen->BufferingFlags & (FCB_STATE_WRITEBUFFERING_ENABLED | FCB_STATE_WRITECACHING_ENABLED))) enable_caching(SrvOpen);