adding nocache mount options
This commit is contained in:
parent
aed1493e90
commit
6292181f8d
1 changed files with 28 additions and 13 deletions
|
|
@ -319,6 +319,7 @@ typedef struct _NFS41_MOUNT_CONFIG {
|
||||||
DWORD WriteSize;
|
DWORD WriteSize;
|
||||||
BOOLEAN ReadOnly;
|
BOOLEAN ReadOnly;
|
||||||
BOOLEAN write_thru;
|
BOOLEAN write_thru;
|
||||||
|
BOOLEAN nocache;
|
||||||
WCHAR srv_buffer[SERVER_NAME_BUFFER_SIZE];
|
WCHAR srv_buffer[SERVER_NAME_BUFFER_SIZE];
|
||||||
UNICODE_STRING SrvName;
|
UNICODE_STRING SrvName;
|
||||||
WCHAR mntpt_buffer[MAX_PATH];
|
WCHAR mntpt_buffer[MAX_PATH];
|
||||||
|
|
@ -352,6 +353,7 @@ typedef struct _NFS41_V_NET_ROOT_EXTENSION {
|
||||||
DWORD sec_flavor;
|
DWORD sec_flavor;
|
||||||
BOOLEAN read_only;
|
BOOLEAN read_only;
|
||||||
BOOLEAN write_thru;
|
BOOLEAN write_thru;
|
||||||
|
BOOLEAN nocache;
|
||||||
#define STORE_MOUNT_SEC_CONTEXT
|
#define STORE_MOUNT_SEC_CONTEXT
|
||||||
#ifdef STORE_MOUNT_SEC_CONTEXT
|
#ifdef STORE_MOUNT_SEC_CONTEXT
|
||||||
SECURITY_CLIENT_CONTEXT mount_sec_ctx;
|
SECURITY_CLIENT_CONTEXT mount_sec_ctx;
|
||||||
|
|
@ -2412,6 +2414,7 @@ void nfs41_MountConfig_InitDefaults(
|
||||||
Config->WriteSize = MOUNT_CONFIG_RW_SIZE_DEFAULT;
|
Config->WriteSize = MOUNT_CONFIG_RW_SIZE_DEFAULT;
|
||||||
Config->ReadOnly = FALSE;
|
Config->ReadOnly = FALSE;
|
||||||
Config->write_thru = FALSE;
|
Config->write_thru = FALSE;
|
||||||
|
Config->nocache = FALSE;
|
||||||
Config->SrvName.Length = 0;
|
Config->SrvName.Length = 0;
|
||||||
Config->SrvName.MaximumLength = SERVER_NAME_BUFFER_SIZE;
|
Config->SrvName.MaximumLength = SERVER_NAME_BUFFER_SIZE;
|
||||||
Config->SrvName.Buffer = Config->srv_buffer;
|
Config->SrvName.Buffer = Config->srv_buffer;
|
||||||
|
|
@ -2508,6 +2511,11 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
|
||||||
status = nfs41_MountConfig_ParseBoolean(Option, &usValue,
|
status = nfs41_MountConfig_ParseBoolean(Option, &usValue,
|
||||||
&Config->write_thru);
|
&Config->write_thru);
|
||||||
}
|
}
|
||||||
|
else if (wcsncmp(L"nocache", Name, NameLen) == 0)
|
||||||
|
{
|
||||||
|
status = nfs41_MountConfig_ParseBoolean(Option, &usValue,
|
||||||
|
&Config->nocache);
|
||||||
|
}
|
||||||
else if (wcsncmp(L"rsize", Name, NameLen) == 0)
|
else if (wcsncmp(L"rsize", Name, NameLen) == 0)
|
||||||
{
|
{
|
||||||
status = nfs41_MountConfig_ParseDword(Option, &usValue,
|
status = nfs41_MountConfig_ParseDword(Option, &usValue,
|
||||||
|
|
@ -2708,6 +2716,7 @@ NTSTATUS nfs41_CreateVNetRoot(
|
||||||
goto out;
|
goto out;
|
||||||
pVNetRootContext->read_only = Config.ReadOnly;
|
pVNetRootContext->read_only = Config.ReadOnly;
|
||||||
pVNetRootContext->write_thru = Config.write_thru;
|
pVNetRootContext->write_thru = Config.write_thru;
|
||||||
|
pVNetRootContext->nocache = Config.nocache;
|
||||||
} else {
|
} else {
|
||||||
/* use the SRV_CALL name (without leading \) as the hostname */
|
/* use the SRV_CALL name (without leading \) as the hostname */
|
||||||
Config.SrvName.Buffer = pSrvCall->pSrvCallName->Buffer + 1;
|
Config.SrvName.Buffer = pSrvCall->pSrvCallName->Buffer + 1;
|
||||||
|
|
@ -3335,19 +3344,23 @@ NTSTATUS nfs41_Create(
|
||||||
SrvOpen->BufferingFlags |= FCB_STATE_DISABLE_LOCAL_BUFFERING;
|
SrvOpen->BufferingFlags |= FCB_STATE_DISABLE_LOCAL_BUFFERING;
|
||||||
#else
|
#else
|
||||||
// turn on read caching
|
// turn on read caching
|
||||||
if (params.DesiredAccess & FILE_READ_DATA)
|
if (pVNetRootContext->nocache)
|
||||||
SrvOpen->BufferingFlags |=
|
SrvOpen->BufferingFlags = FCB_STATE_DISABLE_LOCAL_BUFFERING;
|
||||||
(FCB_STATE_READBUFFERING_ENABLED | FCB_STATE_READCACHING_ENABLED);
|
else {
|
||||||
// turn on write caching only if the file opened for both reading and writing
|
if (params.DesiredAccess & FILE_READ_DATA)
|
||||||
// we current CANT turn on write-only caching because RDBSS translates a write
|
SrvOpen->BufferingFlags |=
|
||||||
// into a read first which leads to a NFS4ERR_IO error from the server because
|
(FCB_STATE_READBUFFERING_ENABLED | FCB_STATE_READCACHING_ENABLED);
|
||||||
// the file was opened read-only.
|
// turn on write caching only if the file opened for both reading and writing
|
||||||
if (/*(params.DesiredAccess & FILE_READ_DATA) && */
|
// we current CANT turn on write-only caching because RDBSS translates a write
|
||||||
(params.DesiredAccess & FILE_WRITE_DATA ||
|
// into a read first which leads to a NFS4ERR_IO error from the server because
|
||||||
params.DesiredAccess & FILE_APPEND_DATA) &&
|
// the file was opened read-only.
|
||||||
!pVNetRootContext->write_thru)
|
if (/*(params.DesiredAccess & FILE_READ_DATA) && */
|
||||||
SrvOpen->BufferingFlags |=
|
(params.DesiredAccess & FILE_WRITE_DATA ||
|
||||||
(FCB_STATE_WRITECACHING_ENABLED | FCB_STATE_WRITEBUFFERING_ENABLED);
|
params.DesiredAccess & FILE_APPEND_DATA) &&
|
||||||
|
!pVNetRootContext->write_thru)
|
||||||
|
SrvOpen->BufferingFlags |=
|
||||||
|
(FCB_STATE_WRITECACHING_ENABLED | FCB_STATE_WRITEBUFFERING_ENABLED);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5002,6 +5015,7 @@ NTSTATUS nfs41_Read (
|
||||||
if (!BooleanFlagOn(LowIoContext->ParamsFor.ReadWrite.Flags,
|
if (!BooleanFlagOn(LowIoContext->ParamsFor.ReadWrite.Flags,
|
||||||
LOWIO_READWRITEFLAG_PAGING_IO) &&
|
LOWIO_READWRITEFLAG_PAGING_IO) &&
|
||||||
(SrvOpen->DesiredAccess & FILE_READ_DATA) &&
|
(SrvOpen->DesiredAccess & FILE_READ_DATA) &&
|
||||||
|
!pVNetRootContext->nocache &&
|
||||||
!(SrvOpen->BufferingFlags &
|
!(SrvOpen->BufferingFlags &
|
||||||
(FCB_STATE_READBUFFERING_ENABLED | FCB_STATE_READCACHING_ENABLED)))
|
(FCB_STATE_READBUFFERING_ENABLED | FCB_STATE_READCACHING_ENABLED)))
|
||||||
enable_caching(SrvOpen);
|
enable_caching(SrvOpen);
|
||||||
|
|
@ -5095,6 +5109,7 @@ NTSTATUS nfs41_Write (
|
||||||
(SrvOpen->DesiredAccess & FILE_WRITE_DATA) &&
|
(SrvOpen->DesiredAccess & FILE_WRITE_DATA) &&
|
||||||
(SrvOpen->DesiredAccess & FILE_READ_DATA) &&
|
(SrvOpen->DesiredAccess & FILE_READ_DATA) &&
|
||||||
!pVNetRootContext->write_thru &&
|
!pVNetRootContext->write_thru &&
|
||||||
|
!pVNetRootContext->nocache &&
|
||||||
!(SrvOpen->BufferingFlags &
|
!(SrvOpen->BufferingFlags &
|
||||||
(FCB_STATE_WRITEBUFFERING_ENABLED | FCB_STATE_WRITECACHING_ENABLED)))
|
(FCB_STATE_WRITEBUFFERING_ENABLED | FCB_STATE_WRITECACHING_ENABLED)))
|
||||||
enable_caching(SrvOpen);
|
enable_caching(SrvOpen);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue