- From 5953cc4ec0b3aba12c5374f41ada6fc72d55a67c Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 8 Nov 2025 16:17:41 +0100
- Subject: [PATCH 1/5] sys: |nfs41_SetFileInformationAtCleanup()| should filter
- out |FileEndOfFileInformation|
- |nfs41_SetFileInformationAtCleanup()| should filter out
- |FileEndOfFileInformation|.
- The NFS server is in charge of managing the file size. Since
- |nfs41_SetFileInformationAtCleanup()| is never used to truncate
- a file we just make this a NO-OP
- Note:
- |FileEndOfFileInformation| at cleanup must be handled with care
- in cases multiple machines access a file in a { lock-whole-file,
- append, unlock-whole-file } manner, doing a set-file-size outside
- the file lock causes data corruption in such cases.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- sys/nfs41sys_fileinfo.c | 32 +++++++++++++++++++++++++++++++-
- 1 file changed, 31 insertions(+), 1 deletion(-)
- diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
- index 7fc38bf..f0b1bc8 100644
- --- a/sys/nfs41sys_fileinfo.c
- +++ b/sys/nfs41sys_fileinfo.c
- @@ -851,7 +851,37 @@ NTSTATUS nfs41_SetFileInformationAtCleanup(
- {
- NTSTATUS status;
- DbgEn();
- - status = nfs41_SetFileInformation(RxContext);
- +
- + FILE_INFORMATION_CLASS InfoClass = RxContext->Info.FileInformationClass;
- + switch (InfoClass) {
- + case FileEndOfFileInformation:
- + /*
- + * NFS server is in charge of managing the file size. Since
- + * |nfs41_SetFileInformationAtCleanup()| is never used to
- + * truncate a file we just make this as NO-OP here
- + *
- + * This also needs to be handled with care in cases multiple
- + * machines access a file in a { lock-whole-file, append,
- + * unlock-whole-file } manner, doing a set-file-size outside
- + * the file lock causes data corruption in such cases.
- + */
- + DbgP("nfs41_SetFileInformationAtCleanup: FileEndOfFileInformation NOP\n",
- + (int)InfoClass);
- + status = STATUS_SUCCESS;
- + break;
- + case FileBasicInformation:
- + /* Timestamp updates */
- + DbgP("nfs41_SetFileInformationAtCleanup: FileBasicInformation timestamp updates\n",
- + (int)InfoClass);
- + status = nfs41_SetFileInformation(RxContext);
- + break;
- + default:
- + DbgP("nfs41_SetFileInformationAtCleanup: unknown InfoClass=%d\n",
- + (int)InfoClass);
- + status = STATUS_INVALID_PARAMETER;
- + break;
- + }
- +
- DbgEx();
- return status;
- }
- --
- 2.51.0
- From 9468e734c187ee989f3ef50b8797c6ee24f96a45 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 8 Nov 2025 17:08:00 +0100
- Subject: [PATCH 2/5] daemon,include,sys: Implement
- |NFS41_SYSOP_FILE_SET_AT_CLEANUP| to avoid delegation recall for timestamp
- updates
- Implement |NFS41_SYSOP_FILE_SET_AT_CLEANUP| to avoid delegation recall
- for timestamp updates.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- daemon/daemon_debug.c | 1 +
- daemon/setattr.c | 22 +++++++++++++++-------
- daemon/upcall.c | 3 ++-
- include/nfs41_driver.h | 1 +
- sys/nfs41sys_debug.c | 1 +
- sys/nfs41sys_fileinfo.c | 26 ++++++++++++++++++--------
- sys/nfs41sys_updowncall.c | 2 ++
- 7 files changed, 40 insertions(+), 16 deletions(-)
- diff --git a/daemon/daemon_debug.c b/daemon/daemon_debug.c
- index 7b840ce..2576e9b 100644
- --- a/daemon/daemon_debug.c
- +++ b/daemon/daemon_debug.c
- @@ -474,6 +474,7 @@ const char* opcode2string(nfs41_opcodes opcode)
- NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_QUERY)
- NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_QUERY_TIME_BASED_COHERENCY)
- NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_SET)
- + NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_SET_AT_CLEANUP)
- NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_EA_SET)
- NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_EA_GET)
- NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_SYMLINK_GET)
- diff --git a/daemon/setattr.c b/daemon/setattr.c
- index a45e782..971b973 100644
- --- a/daemon/setattr.c
- +++ b/daemon/setattr.c
- @@ -41,7 +41,7 @@
- #error UPCALL_BUF_SIZE too small for rename ((NFS41_MAX_PATH_LEN*2)+2048)
- #endif
- -/* NFS41_SYSOP_FILE_SET */
- +/* NFS41_SYSOP_FILE_SET, NFS41_SYSOP_FILE_SET_AT_CLEANUP */
- static int parse_setattr(
- const unsigned char *restrict buffer,
- uint32_t length,
- @@ -63,13 +63,16 @@ static int parse_setattr(
- args->root = upcall->root_ref;
- args->state = upcall->state_ref;
- - DPRINTF(1, ("parsing NFS41_SYSOP_FILE_SET: filename='%s' info_class=%d "
- - "buf_len=%d\n", args->path, args->set_class, args->buf_len));
- + DPRINTF(1, ("parsing '%s': filename='%s' info_class=%d "
- + "buf_len=%d\n",
- + opcode2string(upcall->opcode),
- + args->path, args->set_class, args->buf_len));
- out:
- return status;
- }
- -static int handle_nfs41_setattr_basicinfo(void *daemon_context, setattr_upcall_args *args)
- +static int handle_nfs41_setattr_basicinfo(void *daemon_context,
- + nfs41_opcodes opcode, setattr_upcall_args *args)
- {
- PFILE_BASIC_INFORMATION basic_info = (PFILE_BASIC_INFORMATION)args->buf;
- nfs41_open_state *state = args->state;
- @@ -177,6 +180,9 @@ static int handle_nfs41_setattr_basicinfo(void *daemon_context, setattr_upcall_a
- /*
- * Break read delegations before SETATTR, but only for attributes
- * which are unsafe even if we hold a read delegation.
- + * We also do not break the delegation if we do updates at
- + * |NFS41_SYSOP_FILE_SET_AT_CLEANUP| time, which are usually only
- + * access time updates.
- *
- * FIXME:
- * 1. Should we do this if we own a write delegation ?
- @@ -187,8 +193,9 @@ static int handle_nfs41_setattr_basicinfo(void *daemon_context, setattr_upcall_a
- * 3. The NFSv4 RFCs really should have a list of attributes which
- * would trigger a recall for read or write delegations
- */
- - if (bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_MODE) ||
- - bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_TIME_CREATE)) {
- + if ((opcode != NFS41_SYSOP_FILE_SET_AT_CLEANUP) &&
- + (bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_MODE) ||
- + bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_TIME_CREATE))) {
- DPRINTF(0, ("handle_nfs41_setattr_basicinfo(args->path='%s'): "
- "returning read delegation because of mode=%d, time_create=%d\n",
- args->path,
- @@ -712,7 +719,8 @@ static int handle_setattr(void *daemon_context, nfs41_upcall *upcall)
- switch (args->set_class) {
- case FileBasicInformation:
- - status = handle_nfs41_setattr_basicinfo(daemon_context, args);
- + status = handle_nfs41_setattr_basicinfo(daemon_context,
- + upcall->opcode, args);
- break;
- case FileDispositionInformation:
- status = handle_nfs41_remove(daemon_context, args);
- diff --git a/daemon/upcall.c b/daemon/upcall.c
- index 8d5d335..fff2d6f 100644
- --- a/daemon/upcall.c
- +++ b/daemon/upcall.c
- @@ -69,7 +69,8 @@ static const nfs41_upcall_op *g_upcall_op_table[] = {
- &nfs41_op_readdir,
- &nfs41_op_getattr, /* NFS41_SYSOP_FILE_QUERY */
- &nfs41_op_getattr, /* NFS41_SYSOP_FILE_QUERY_TIME_BASED_COHERENCY */
- - &nfs41_op_setattr,
- + &nfs41_op_setattr, /* NFS41_SYSOP_FILE_SET */
- + &nfs41_op_setattr, /* NFS41_SYSOP_FILE_SET_AT_CLEANUP */
- &nfs41_op_getexattr,
- &nfs41_op_setexattr,
- &nfs41_op_symlink_get,
- diff --git a/include/nfs41_driver.h b/include/nfs41_driver.h
- index 4e8b4b2..ce4fb54 100644
- --- a/include/nfs41_driver.h
- +++ b/include/nfs41_driver.h
- @@ -80,6 +80,7 @@ typedef enum _nfs41_opcodes {
- NFS41_SYSOP_FILE_QUERY,
- NFS41_SYSOP_FILE_QUERY_TIME_BASED_COHERENCY,
- NFS41_SYSOP_FILE_SET,
- + NFS41_SYSOP_FILE_SET_AT_CLEANUP,
- NFS41_SYSOP_EA_GET,
- NFS41_SYSOP_EA_SET,
- NFS41_SYSOP_SYMLINK_GET,
- diff --git a/sys/nfs41sys_debug.c b/sys/nfs41sys_debug.c
- index ecf500a..c1c996f 100644
- --- a/sys/nfs41sys_debug.c
- +++ b/sys/nfs41sys_debug.c
- @@ -684,6 +684,7 @@ const char *opcode2string(int opcode)
- case NFS41_SYSOP_DIR_QUERY: return "NFS41_SYSOP_DIR_QUERY";
- case NFS41_SYSOP_FILE_QUERY: return "NFS41_SYSOP_FILE_QUERY";
- case NFS41_SYSOP_FILE_SET: return "NFS41_SYSOP_FILE_SET";
- + case NFS41_SYSOP_FILE_SET_AT_CLEANUP: return "NFS41_SYSOP_FILE_SET_AT_CLEANUP";
- case NFS41_SYSOP_EA_SET: return "NFS41_SYSOP_EA_SET";
- case NFS41_SYSOP_EA_GET: return "NFS41_SYSOP_EA_GET";
- case NFS41_SYSOP_SYMLINK_GET: return "NFS41_SYSOP_SYMLINK_GET";
- diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
- index f0b1bc8..991646b 100644
- --- a/sys/nfs41sys_fileinfo.c
- +++ b/sys/nfs41sys_fileinfo.c
- @@ -655,7 +655,7 @@ NTSTATUS check_nfs41_setattr_args(
- case FileEndOfFileInformation:
- break;
- default:
- - print_error("nfs41_SetFileInformation: unhandled class %d\n", InfoClass);
- + print_error("check_nfs41_setattr_args: unhandled class %d\n", InfoClass);
- status = STATUS_NOT_SUPPORTED;
- }
- @@ -663,8 +663,10 @@ out:
- return status;
- }
- -NTSTATUS nfs41_SetFileInformation(
- - IN OUT PRX_CONTEXT RxContext)
- +static
- +NTSTATUS nfs41_SetFileInformationImpl(
- + IN OUT PRX_CONTEXT RxContext,
- + nfs41_opcodes opcode)
- {
- NTSTATUS status = STATUS_INVALID_PARAMETER;
- nfs41_updowncall_entry *entry = NULL;
- @@ -785,7 +787,7 @@ NTSTATUS nfs41_SetFileInformation(
- }
- }
- - status = nfs41_UpcallCreate(NFS41_SYSOP_FILE_SET, &nfs41_fobx->sec_ctx,
- + status = nfs41_UpcallCreate(opcode, &nfs41_fobx->sec_ctx,
- pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
- pNetRootContext->nfs41d_version, SrvOpen->pAlreadyPrefixedName, &entry);
- if (status) goto out;
- @@ -835,7 +837,7 @@ out:
- InterlockedIncrement(&setattr.tops);
- InterlockedAdd64(&setattr.ticks, t2.QuadPart - t1.QuadPart);
- #ifdef ENABLE_INDV_TIMINGS
- - DbgP("nfs41_SetFileInformation delta = %d op=%d sum=%d\n",
- + DbgP("nfs41_SetFileInformationImpl delta = %d op=%d sum=%d\n",
- t2.QuadPart - t1.QuadPart, setattr.tops, setattr.ticks);
- #endif
- #endif
- @@ -846,13 +848,21 @@ out:
- return status;
- }
- +NTSTATUS nfs41_SetFileInformation(
- + IN OUT PRX_CONTEXT RxContext)
- +{
- + return nfs41_SetFileInformationImpl(RxContext, NFS41_SYSOP_FILE_SET);
- +}
- +
- +
- NTSTATUS nfs41_SetFileInformationAtCleanup(
- IN OUT PRX_CONTEXT RxContext)
- {
- NTSTATUS status;
- - DbgEn();
- FILE_INFORMATION_CLASS InfoClass = RxContext->Info.FileInformationClass;
- +
- + /* Filter |MRxSetFileInfoAtCleanup()| by InfoClass */
- switch (InfoClass) {
- case FileEndOfFileInformation:
- /*
- @@ -873,7 +883,8 @@ NTSTATUS nfs41_SetFileInformationAtCleanup(
- /* Timestamp updates */
- DbgP("nfs41_SetFileInformationAtCleanup: FileBasicInformation timestamp updates\n",
- (int)InfoClass);
- - status = nfs41_SetFileInformation(RxContext);
- + status = nfs41_SetFileInformationImpl(RxContext,
- + NFS41_SYSOP_FILE_SET_AT_CLEANUP);
- break;
- default:
- DbgP("nfs41_SetFileInformationAtCleanup: unknown InfoClass=%d\n",
- @@ -882,6 +893,5 @@ NTSTATUS nfs41_SetFileInformationAtCleanup(
- break;
- }
- - DbgEx();
- return status;
- }
- diff --git a/sys/nfs41sys_updowncall.c b/sys/nfs41sys_updowncall.c
- index c1a0310..cd1c1c2 100644
- --- a/sys/nfs41sys_updowncall.c
- +++ b/sys/nfs41sys_updowncall.c
- @@ -299,6 +299,7 @@ NTSTATUS handle_upcall(
- status = marshal_nfs41_filequery(entry, pbOut, cbOut, len);
- break;
- case NFS41_SYSOP_FILE_SET:
- + case NFS41_SYSOP_FILE_SET_AT_CLEANUP:
- status = marshal_nfs41_fileset(entry, pbOut, cbOut, len);
- break;
- case NFS41_SYSOP_EA_SET:
- @@ -768,6 +769,7 @@ NTSTATUS nfs41_downcall(
- status = unmarshal_nfs41_getacl(cur, &inbuf);
- break;
- case NFS41_SYSOP_FILE_SET:
- + case NFS41_SYSOP_FILE_SET_AT_CLEANUP:
- unmarshal_nfs41_setattr(cur, &cur->ChangeTime, &inbuf);
- break;
- case NFS41_SYSOP_EA_SET:
- --
- 2.51.0
- From fbf135794cbe5eae5f825d788d0689dddac85825 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 8 Nov 2025 17:35:49 +0100
- Subject: [PATCH 3/5] cygwin: make bintarball should genreate the HTML ReadMe
- make bintarball should genreate the HTML ReadMe.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- cygwin/Makefile | 42 +++++++++++++++++++++++++++++++++---------
- 1 file changed, 33 insertions(+), 9 deletions(-)
- diff --git a/cygwin/Makefile b/cygwin/Makefile
- index e400eef..eda64e6 100644
- --- a/cygwin/Makefile
- +++ b/cygwin/Makefile
- @@ -187,7 +187,11 @@ installdest64: \
- # in parallel
- installdest: installdest_util installdest32 .WAIT installdest64
- -bintarball: installdest $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)/README.md
- +bintarball: \
- + installdest \
- + $(PROJECT_BASEDIR_DIR)/README.txt \
- + $(PROJECT_BASEDIR_DIR)/README.html \
- + $(PROJECT_BASEDIR_DIR)/README.md
- set -o errexit ; set -o xtrace ; \
- base_filename="msnfs41client_cygwin_64bit32bit_binaries_$$(date +%Y%m%d_%Hh%Mm)_git$$(git rev-parse --short HEAD)" ; \
- ( \
- @@ -201,14 +205,22 @@ bintarball: installdest $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)
- archive_sha256hash="$$(openssl sha256 -r "$${base_filename}.tar.bz2" | while read a dummy ; do printf "%s\n" "$$a" ; done)" ; \
- sed -E <"../README.txt" \
- -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
- - -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" \
- + -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" ; \
- + sed -E <"../README.html" \
- + -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
- + -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.html" \
- ) ; \
- printf "\n#\n# 32bit+64bit tarball is ready now\n#\n" ; \
- ls -l "$(DESTDIR)/$${base_filename}.tar.bz2" ; \
- - ls -l "$(DESTDIR)/$${base_filename}.readme"
- + ls -l "$(DESTDIR)/$${base_filename}.readme" ; \
- + ls -l "$(DESTDIR)/$${base_filename}.html"
- sync
- -bintarball32: installdest32 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)/README.md
- +bintarball32: \
- + installdest32 \
- + $(PROJECT_BASEDIR_DIR)/README.txt \
- + $(PROJECT_BASEDIR_DIR)/README.html \
- + $(PROJECT_BASEDIR_DIR)/README.md
- set -o errexit ; set -o xtrace ; \
- base_filename="msnfs41client_cygwin_32bit_binaries_$$(date +%Y%m%d_%Hh%Mm)_git$$(git rev-parse --short HEAD)" ; \
- ( \
- @@ -222,14 +234,22 @@ bintarball32: installdest32 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_
- archive_sha256hash="$$(openssl sha256 -r "$${base_filename}.tar.bz2" | while read a dummy ; do printf "%s\n" "$$a" ; done)" ; \
- sed -E <"../README.txt" \
- -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
- - -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" \
- + -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" ; \
- + sed -E <"../README.html" \
- + -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
- + -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.html" \
- ) ; \
- printf "\n#\n# 32bit-only tarball is ready now\n#\n" ; \
- ls -l "$(DESTDIR)/$${base_filename}.tar.bz2" ; \
- - ls -l "$(DESTDIR)/$${base_filename}.readme"
- + ls -l "$(DESTDIR)/$${base_filename}.readme" ; \
- + ls -l "$(DESTDIR)/$${base_filename}.html"
- sync
- -bintarball64: installdest64 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)/README.md
- +bintarball64: \
- + installdest64 \
- + $(PROJECT_BASEDIR_DIR)/README.txt \
- + $(PROJECT_BASEDIR_DIR)/README.html \
- + $(PROJECT_BASEDIR_DIR)/README.md
- set -o errexit ; set -o xtrace ; \
- base_filename="msnfs41client_cygwin_64bit_binaries_$$(date +%Y%m%d_%Hh%Mm)_git$$(git rev-parse --short HEAD)" ; \
- ( \
- @@ -243,11 +263,15 @@ bintarball64: installdest64 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_
- archive_sha256hash="$$(openssl sha256 -r "$${base_filename}.tar.bz2" | while read a dummy ; do printf "%s\n" "$$a" ; done)" ; \
- sed -E <"../README.txt" \
- -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
- - -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" \
- + -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" ; \
- + sed -E <"../README.html" \
- + -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
- + -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.html" \
- ) ; \
- printf "\n#\n# 64bit-only tarball is ready now\n#\n" ; \
- ls -l "$(DESTDIR)/$${base_filename}.tar.bz2" ; \
- - ls -l "$(DESTDIR)/$${base_filename}.readme"
- + ls -l "$(DESTDIR)/$${base_filename}.readme" ; \
- + ls -l "$(DESTDIR)/$${base_filename}.html"
- sync
- $(PROJECT_BASEDIR_DIR)/README.html: $(PROJECT_BASEDIR_DIR)/docs/README.xml
- --
- 2.51.0
- From 6aa41a42f84032e5171f704908359f657b622cf5 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 8 Nov 2025 17:38:24 +0100
- Subject: [PATCH 4/5] README.md,docs: Remove reference to the long gone
- cygwin/README.bintarball.txt
- Remove reference to the long gone cygwin/README.bintarball.txt.
- Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- README.md | 12 +++---------
- docs/README.xml | 6 +++---
- 2 files changed, 6 insertions(+), 12 deletions(-)
- diff --git a/README.md b/README.md
- index 2364154..a41dca6 100644
- --- a/README.md
- +++ b/README.md
- @@ -854,9 +854,7 @@ Source code can be obtained from
- - WDK for Windows 10, version 2004, from
- <https://go.microsoft.com/fwlink/?linkid=2128854>
- - - Cygwin 64bit \>= 3.5.0 (see
- - `ms-nfs41-clientcygwin/README.bintarball.txt` for Cygwin 32bit and
- - 64bit installation instructions)
- + - Cygwin 64bit \>= 3.5.0
- - PanDoc document converter, from
- <https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi>
- @@ -875,9 +873,7 @@ Source code can be obtained from
- - WDK for Windows 11, version 1591, from
- <https://go.microsoft.com/fwlink/?linkid=2286137>
- - - Cygwin 64bit \>= 3.5.0 (see
- - `ms-nfs41-clientcygwin/README.bintarball.txt` for Cygwin 32bit and
- - 64bit installation instructions)
- + - Cygwin 64bit \>= 3.5.0
- - PanDoc document converter, from
- <https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi>
- @@ -896,9 +892,7 @@ Source code can be obtained from
- cp '/cygdrive/c/Program Files (x86)/Windows Kits/10/build/bin/Microsoft.DriverKit.Build.Tasks.16.0.dll' '/cygdrive/c/Program Files (x86)/Windows Kits/10/build/bin/Microsoft.DriverKit.Build.Tasks.18.0.dll'
- - - Cygwin 64bit \>= 3.5.0 (see
- - `ms-nfs41-clientcygwin/README.bintarball.txt` for Cygwin 32bit and
- - 64bit installation instructions)
- + - Cygwin 64bit \>= 3.5.0
- - PanDoc document converter, from
- <https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi>
- diff --git a/docs/README.xml b/docs/README.xml
- index d605c85..a74a903 100644
- --- a/docs/README.xml
- +++ b/docs/README.xml
- @@ -950,7 +950,7 @@ Datei befindet. Versuchen Sie, die Datei woanders zu speichern.</programlisting>
- <para>WDK for Windows 10, version 2004, from <link xl:href="https://go.microsoft.com/fwlink/?linkid=2128854">https://go.microsoft.com/fwlink/?linkid=2128854</link></para>
- </listitem>
- <listitem>
- - <para>Cygwin 64bit >= 3.5.0 (see <filename>ms-nfs41-clientcygwin/README.bintarball.txt</filename> for Cygwin 32bit and 64bit installation instructions)</para>
- + <para>Cygwin 64bit >= 3.5.0</para>
- </listitem>
- <listitem>
- <para>PanDoc document converter, from <link xl:href="https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi">https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi</link></para>
- @@ -971,7 +971,7 @@ Datei befindet. Versuchen Sie, die Datei woanders zu speichern.</programlisting>
- <para>WDK for Windows 11, version 1591, from <link xl:href="https://go.microsoft.com/fwlink/?linkid=2286137">https://go.microsoft.com/fwlink/?linkid=2286137</link></para>
- </listitem>
- <listitem>
- - <para>Cygwin 64bit >= 3.5.0 (see <filename>ms-nfs41-clientcygwin/README.bintarball.txt</filename> for Cygwin 32bit and 64bit installation instructions)</para>
- + <para>Cygwin 64bit >= 3.5.0</para>
- </listitem>
- <listitem>
- <para>PanDoc document converter, from <link xl:href="https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi">https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi</link></para>
- @@ -993,7 +993,7 @@ Datei befindet. Versuchen Sie, die Datei woanders zu speichern.</programlisting>
- </para>
- </listitem>
- <listitem>
- - <para>Cygwin 64bit >= 3.5.0 (see <filename>ms-nfs41-clientcygwin/README.bintarball.txt</filename> for Cygwin 32bit and 64bit installation instructions)</para>
- + <para>Cygwin 64bit >= 3.5.0</para>
- </listitem>
- <listitem>
- <para>PanDoc document converter, from <link xl:href="https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi">https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi</link></para>
- --
- 2.51.0
- From ae294778b60c72d26c226af034ac5967cb62524e Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 8 Nov 2025 19:00:40 +0100
- Subject: [PATCH 5/5] daemon: Turn oplocks-are-unimplemented |EASSERT()|s in
- |handle_open()| into |DASSERT()|s
- Turn oplocks-are-unimplemented |EASSERT()|s in |handle_open()| into |DASSERT()|s
- for less traffic
- Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- daemon/open.c | 35 ++++++++++++++++++++---------------
- 1 file changed, 20 insertions(+), 15 deletions(-)
- diff --git a/daemon/open.c b/daemon/open.c
- index 2454138..5532e3c 100644
- --- a/daemon/open.c
- +++ b/daemon/open.c
- @@ -778,25 +778,30 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
- break;
- }
- - EASSERT_MSG(!(args->create_opts & FILE_COMPLETE_IF_OPLOCKED),
- - ("handle_open: file='%s': "
- - "FILE_COMPLETE_IF_OPLOCKED not supported\n", args->path));
- - EASSERT_MSG(!(args->create_opts & FILE_OPEN_BY_FILE_ID),
- - ("handle_open: file='%s': "
- - "FILE_OPEN_BY_FILE_ID not supported\n", args->path));
- + DASSERT_MSG(((args->create_opts & FILE_COMPLETE_IF_OPLOCKED) == 0),
- + 1,
- + ("handle_open: file='%s': FILE_COMPLETE_IF_OPLOCKED not supported\n",
- + args->path));
- + DASSERT_MSG(((args->create_opts & FILE_OPEN_BY_FILE_ID) == 0),
- + 1,
- + ("handle_open: file='%s': FILE_OPEN_BY_FILE_ID not supported\n",
- + args->path));
- /*
- * Kernel rejects |FILE_OPEN_REQUIRING_OPLOCK|, we just use
- * this here as safeguard
- */
- - EASSERT_MSG(!(args->create_opts & FILE_OPEN_REQUIRING_OPLOCK),
- - ("handle_open: file='%s': "
- - "FILE_OPEN_REQUIRING_OPLOCK not supported\n", args->path));
- - EASSERT_MSG(!(args->create_opts & FILE_DISALLOW_EXCLUSIVE),
- - ("handle_open: file='%s': "
- - "FILE_DISALLOW_EXCLUSIVE not supported\n", args->path));
- - EASSERT_MSG(!(args->create_opts & FILE_RESERVE_OPFILTER),
- - ("handle_open: file='%s': "
- - "FILE_RESERVE_OPFILTER not supported\n", args->path));
- + DASSERT_MSG(((args->create_opts & FILE_OPEN_REQUIRING_OPLOCK) == 0),
- + 1,
- + ("handle_open: file='%s': FILE_OPEN_REQUIRING_OPLOCK not supported\n",
- + args->path));
- + DASSERT_MSG(((args->create_opts & FILE_RESERVE_OPFILTER) == 0),
- + 1,
- + ("handle_open: file='%s': FILE_RESERVE_OPFILTER not supported\n",
- + args->path));
- + DASSERT_MSG(((args->create_opts & FILE_DISALLOW_EXCLUSIVE) == 0),
- + 1,
- + ("handle_open: file='%s': FILE_DISALLOW_EXCLUSIVE not supported\n",
- + args->path));
- status = create_open_state(args->path, args->open_owner_id, &state);
- if (status) {
- --
- 2.51.0
msnfs41client: Patches for Win32 |MRxSetFileInfoAtCleanup()| implementation, docs+misc, 2025-11-08
Posted by Anonymous on Sat 8th Nov 2025 18:14
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.
rovema.kpaste.net RSS