pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Patches for Win32 |MRxSetFileInfoAtCleanup()| implementation, docs+misc, 2025-11-08
Posted by Anonymous on Sat 8th Nov 2025 18:14
raw | new post

  1. From 5953cc4ec0b3aba12c5374f41ada6fc72d55a67c Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Sat, 8 Nov 2025 16:17:41 +0100
  4. Subject: [PATCH 1/5] sys: |nfs41_SetFileInformationAtCleanup()| should filter
  5.  out |FileEndOfFileInformation|
  6.  
  7. |nfs41_SetFileInformationAtCleanup()| should filter out
  8. |FileEndOfFileInformation|.
  9.  
  10. The NFS server is in charge of managing the file size. Since
  11. |nfs41_SetFileInformationAtCleanup()| is never used to truncate
  12. a file we just make this a NO-OP
  13.  
  14. Note:
  15. |FileEndOfFileInformation| at cleanup must be handled with care
  16. in cases multiple machines access a file in a { lock-whole-file,
  17. append, unlock-whole-file } manner, doing a set-file-size outside
  18. the file lock causes data corruption in such cases.
  19.  
  20. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  21. ---
  22. sys/nfs41sys_fileinfo.c | 32 +++++++++++++++++++++++++++++++-
  23.  1 file changed, 31 insertions(+), 1 deletion(-)
  24.  
  25. diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
  26. index 7fc38bf..f0b1bc8 100644
  27. --- a/sys/nfs41sys_fileinfo.c
  28. +++ b/sys/nfs41sys_fileinfo.c
  29. @@ -851,7 +851,37 @@ NTSTATUS nfs41_SetFileInformationAtCleanup(
  30.  {
  31.      NTSTATUS status;
  32.      DbgEn();
  33. -    status = nfs41_SetFileInformation(RxContext);
  34. +
  35. +    FILE_INFORMATION_CLASS InfoClass = RxContext->Info.FileInformationClass;
  36. +    switch (InfoClass) {
  37. +        case FileEndOfFileInformation:
  38. +            /*
  39. +             * NFS server is in charge of managing the file size. Since
  40. +             * |nfs41_SetFileInformationAtCleanup()| is never used to
  41. +             * truncate a file we just make this as NO-OP here
  42. +             *
  43. +             * This also needs to be handled with care in cases multiple
  44. +             * machines access a file in a { lock-whole-file, append,
  45. +             * unlock-whole-file } manner, doing a set-file-size outside
  46. +             * the file lock causes data corruption in such cases.
  47. +             */
  48. +            DbgP("nfs41_SetFileInformationAtCleanup: FileEndOfFileInformation NOP\n",
  49. +                (int)InfoClass);
  50. +            status = STATUS_SUCCESS;
  51. +            break;
  52. +        case FileBasicInformation:
  53. +            /* Timestamp updates */
  54. +            DbgP("nfs41_SetFileInformationAtCleanup: FileBasicInformation timestamp updates\n",
  55. +                (int)InfoClass);
  56. +            status = nfs41_SetFileInformation(RxContext);
  57. +            break;
  58. +        default:
  59. +            DbgP("nfs41_SetFileInformationAtCleanup: unknown InfoClass=%d\n",
  60. +                (int)InfoClass);
  61. +            status = STATUS_INVALID_PARAMETER;
  62. +            break;
  63. +    }
  64. +
  65.      DbgEx();
  66.      return status;
  67.  }
  68. --
  69. 2.51.0
  70.  
  71. From 9468e734c187ee989f3ef50b8797c6ee24f96a45 Mon Sep 17 00:00:00 2001
  72. From: Roland Mainz <roland.mainz@nrubsig.org>
  73. Date: Sat, 8 Nov 2025 17:08:00 +0100
  74. Subject: [PATCH 2/5] daemon,include,sys: Implement
  75.  |NFS41_SYSOP_FILE_SET_AT_CLEANUP| to avoid delegation recall for timestamp
  76.  updates
  77.  
  78. Implement |NFS41_SYSOP_FILE_SET_AT_CLEANUP| to avoid delegation recall
  79. for timestamp updates.
  80.  
  81. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  82. ---
  83. daemon/daemon_debug.c     |  1 +
  84.  daemon/setattr.c          | 22 +++++++++++++++-------
  85.  daemon/upcall.c           |  3 ++-
  86.  include/nfs41_driver.h    |  1 +
  87.  sys/nfs41sys_debug.c      |  1 +
  88.  sys/nfs41sys_fileinfo.c   | 26 ++++++++++++++++++--------
  89.  sys/nfs41sys_updowncall.c |  2 ++
  90.  7 files changed, 40 insertions(+), 16 deletions(-)
  91.  
  92. diff --git a/daemon/daemon_debug.c b/daemon/daemon_debug.c
  93. index 7b840ce..2576e9b 100644
  94. --- a/daemon/daemon_debug.c
  95. +++ b/daemon/daemon_debug.c
  96. @@ -474,6 +474,7 @@ const char* opcode2string(nfs41_opcodes opcode)
  97.          NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_QUERY)
  98.          NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_QUERY_TIME_BASED_COHERENCY)
  99.          NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_SET)
  100. +        NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_FILE_SET_AT_CLEANUP)
  101.          NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_EA_SET)
  102.          NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_EA_GET)
  103.          NFSOPCODE_TO_STRLITERAL(NFS41_SYSOP_SYMLINK_GET)
  104. diff --git a/daemon/setattr.c b/daemon/setattr.c
  105. index a45e782..971b973 100644
  106. --- a/daemon/setattr.c
  107. +++ b/daemon/setattr.c
  108. @@ -41,7 +41,7 @@
  109.  #error UPCALL_BUF_SIZE too small for rename ((NFS41_MAX_PATH_LEN*2)+2048)
  110.  #endif
  111.  
  112. -/* NFS41_SYSOP_FILE_SET */
  113. +/* NFS41_SYSOP_FILE_SET, NFS41_SYSOP_FILE_SET_AT_CLEANUP */
  114.  static int parse_setattr(
  115.      const unsigned char *restrict buffer,
  116.      uint32_t length,
  117. @@ -63,13 +63,16 @@ static int parse_setattr(
  118.      args->root = upcall->root_ref;
  119.      args->state = upcall->state_ref;
  120.  
  121. -    DPRINTF(1, ("parsing NFS41_SYSOP_FILE_SET: filename='%s' info_class=%d "
  122. -        "buf_len=%d\n", args->path, args->set_class, args->buf_len));
  123. +    DPRINTF(1, ("parsing '%s': filename='%s' info_class=%d "
  124. +        "buf_len=%d\n",
  125. +        opcode2string(upcall->opcode),
  126. +        args->path, args->set_class, args->buf_len));
  127.  out:
  128.      return status;
  129.  }
  130.  
  131. -static int handle_nfs41_setattr_basicinfo(void *daemon_context, setattr_upcall_args *args)
  132. +static int handle_nfs41_setattr_basicinfo(void *daemon_context,
  133. +    nfs41_opcodes opcode, setattr_upcall_args *args)
  134.  {
  135.      PFILE_BASIC_INFORMATION basic_info = (PFILE_BASIC_INFORMATION)args->buf;
  136.      nfs41_open_state *state = args->state;
  137. @@ -177,6 +180,9 @@ static int handle_nfs41_setattr_basicinfo(void *daemon_context, setattr_upcall_a
  138.      /*
  139.       * Break read delegations before SETATTR, but only for attributes
  140.       * which are unsafe even if we hold a read delegation.
  141. +     * We also do not break the delegation if we do updates at
  142. +     * |NFS41_SYSOP_FILE_SET_AT_CLEANUP| time, which are usually only
  143. +     * access time updates.
  144.       *
  145.       * FIXME:
  146.       * 1. Should we do this if we own a write delegation ?
  147. @@ -187,8 +193,9 @@ static int handle_nfs41_setattr_basicinfo(void *daemon_context, setattr_upcall_a
  148.       * 3. The NFSv4 RFCs really should have a list of attributes which
  149.       * would trigger a recall for read or write delegations
  150.       */
  151. -    if (bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_MODE) ||
  152. -        bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_TIME_CREATE)) {
  153. +    if ((opcode != NFS41_SYSOP_FILE_SET_AT_CLEANUP) &&
  154. +        (bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_MODE) ||
  155. +        bitmap_isset(&info.attrmask, 1, FATTR4_WORD1_TIME_CREATE))) {
  156.          DPRINTF(0, ("handle_nfs41_setattr_basicinfo(args->path='%s'): "
  157.              "returning read delegation because of mode=%d, time_create=%d\n",
  158.              args->path,
  159. @@ -712,7 +719,8 @@ static int handle_setattr(void *daemon_context, nfs41_upcall *upcall)
  160.  
  161.      switch (args->set_class) {
  162.      case FileBasicInformation:
  163. -        status = handle_nfs41_setattr_basicinfo(daemon_context, args);
  164. +        status = handle_nfs41_setattr_basicinfo(daemon_context,
  165. +            upcall->opcode, args);
  166.          break;
  167.      case FileDispositionInformation:
  168.          status = handle_nfs41_remove(daemon_context, args);
  169. diff --git a/daemon/upcall.c b/daemon/upcall.c
  170. index 8d5d335..fff2d6f 100644
  171. --- a/daemon/upcall.c
  172. +++ b/daemon/upcall.c
  173. @@ -69,7 +69,8 @@ static const nfs41_upcall_op *g_upcall_op_table[] = {
  174.      &nfs41_op_readdir,
  175.      &nfs41_op_getattr, /* NFS41_SYSOP_FILE_QUERY */
  176.      &nfs41_op_getattr, /* NFS41_SYSOP_FILE_QUERY_TIME_BASED_COHERENCY */
  177. -    &nfs41_op_setattr,
  178. +    &nfs41_op_setattr, /* NFS41_SYSOP_FILE_SET */
  179. +    &nfs41_op_setattr, /* NFS41_SYSOP_FILE_SET_AT_CLEANUP */
  180.      &nfs41_op_getexattr,
  181.      &nfs41_op_setexattr,
  182.      &nfs41_op_symlink_get,
  183. diff --git a/include/nfs41_driver.h b/include/nfs41_driver.h
  184. index 4e8b4b2..ce4fb54 100644
  185. --- a/include/nfs41_driver.h
  186. +++ b/include/nfs41_driver.h
  187. @@ -80,6 +80,7 @@ typedef enum _nfs41_opcodes {
  188.      NFS41_SYSOP_FILE_QUERY,
  189.      NFS41_SYSOP_FILE_QUERY_TIME_BASED_COHERENCY,
  190.      NFS41_SYSOP_FILE_SET,
  191. +    NFS41_SYSOP_FILE_SET_AT_CLEANUP,
  192.      NFS41_SYSOP_EA_GET,
  193.      NFS41_SYSOP_EA_SET,
  194.      NFS41_SYSOP_SYMLINK_GET,
  195. diff --git a/sys/nfs41sys_debug.c b/sys/nfs41sys_debug.c
  196. index ecf500a..c1c996f 100644
  197. --- a/sys/nfs41sys_debug.c
  198. +++ b/sys/nfs41sys_debug.c
  199. @@ -684,6 +684,7 @@ const char *opcode2string(int opcode)
  200.      case NFS41_SYSOP_DIR_QUERY: return "NFS41_SYSOP_DIR_QUERY";
  201.      case NFS41_SYSOP_FILE_QUERY: return "NFS41_SYSOP_FILE_QUERY";
  202.      case NFS41_SYSOP_FILE_SET: return "NFS41_SYSOP_FILE_SET";
  203. +    case NFS41_SYSOP_FILE_SET_AT_CLEANUP: return "NFS41_SYSOP_FILE_SET_AT_CLEANUP";
  204.      case NFS41_SYSOP_EA_SET: return "NFS41_SYSOP_EA_SET";
  205.      case NFS41_SYSOP_EA_GET: return "NFS41_SYSOP_EA_GET";
  206.      case NFS41_SYSOP_SYMLINK_GET: return "NFS41_SYSOP_SYMLINK_GET";
  207. diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
  208. index f0b1bc8..991646b 100644
  209. --- a/sys/nfs41sys_fileinfo.c
  210. +++ b/sys/nfs41sys_fileinfo.c
  211. @@ -655,7 +655,7 @@ NTSTATUS check_nfs41_setattr_args(
  212.      case FileEndOfFileInformation:
  213.          break;
  214.      default:
  215. -        print_error("nfs41_SetFileInformation: unhandled class %d\n", InfoClass);
  216. +        print_error("check_nfs41_setattr_args: unhandled class %d\n", InfoClass);
  217.          status = STATUS_NOT_SUPPORTED;
  218.      }
  219.  
  220. @@ -663,8 +663,10 @@ out:
  221.      return status;
  222.  }
  223.  
  224. -NTSTATUS nfs41_SetFileInformation(
  225. -    IN OUT PRX_CONTEXT RxContext)
  226. +static
  227. +NTSTATUS nfs41_SetFileInformationImpl(
  228. +    IN OUT PRX_CONTEXT RxContext,
  229. +    nfs41_opcodes opcode)
  230.  {
  231.      NTSTATUS status = STATUS_INVALID_PARAMETER;
  232.      nfs41_updowncall_entry *entry = NULL;
  233. @@ -785,7 +787,7 @@ NTSTATUS nfs41_SetFileInformation(
  234.          }
  235.      }
  236.  
  237. -    status = nfs41_UpcallCreate(NFS41_SYSOP_FILE_SET, &nfs41_fobx->sec_ctx,
  238. +    status = nfs41_UpcallCreate(opcode, &nfs41_fobx->sec_ctx,
  239.          pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
  240.          pNetRootContext->nfs41d_version, SrvOpen->pAlreadyPrefixedName, &entry);
  241.      if (status) goto out;
  242. @@ -835,7 +837,7 @@ out:
  243.      InterlockedIncrement(&setattr.tops);
  244.      InterlockedAdd64(&setattr.ticks, t2.QuadPart - t1.QuadPart);
  245.  #ifdef ENABLE_INDV_TIMINGS
  246. -    DbgP("nfs41_SetFileInformation delta = %d op=%d sum=%d\n",
  247. +    DbgP("nfs41_SetFileInformationImpl delta = %d op=%d sum=%d\n",
  248.          t2.QuadPart - t1.QuadPart, setattr.tops, setattr.ticks);
  249.  #endif
  250.  #endif
  251. @@ -846,13 +848,21 @@ out:
  252.      return status;
  253.  }
  254.  
  255. +NTSTATUS nfs41_SetFileInformation(
  256. +    IN OUT PRX_CONTEXT RxContext)
  257. +{
  258. +    return nfs41_SetFileInformationImpl(RxContext, NFS41_SYSOP_FILE_SET);
  259. +}
  260. +
  261. +
  262.  NTSTATUS nfs41_SetFileInformationAtCleanup(
  263.        IN OUT PRX_CONTEXT RxContext)
  264.  {
  265.      NTSTATUS status;
  266. -    DbgEn();
  267.  
  268.      FILE_INFORMATION_CLASS InfoClass = RxContext->Info.FileInformationClass;
  269. +
  270. +    /* Filter |MRxSetFileInfoAtCleanup()| by InfoClass */
  271.      switch (InfoClass) {
  272.          case FileEndOfFileInformation:
  273.              /*
  274. @@ -873,7 +883,8 @@ NTSTATUS nfs41_SetFileInformationAtCleanup(
  275.              /* Timestamp updates */
  276.              DbgP("nfs41_SetFileInformationAtCleanup: FileBasicInformation timestamp updates\n",
  277.                  (int)InfoClass);
  278. -            status = nfs41_SetFileInformation(RxContext);
  279. +            status = nfs41_SetFileInformationImpl(RxContext,
  280. +                NFS41_SYSOP_FILE_SET_AT_CLEANUP);
  281.              break;
  282.          default:
  283.              DbgP("nfs41_SetFileInformationAtCleanup: unknown InfoClass=%d\n",
  284. @@ -882,6 +893,5 @@ NTSTATUS nfs41_SetFileInformationAtCleanup(
  285.              break;
  286.      }
  287.  
  288. -    DbgEx();
  289.      return status;
  290.  }
  291. diff --git a/sys/nfs41sys_updowncall.c b/sys/nfs41sys_updowncall.c
  292. index c1a0310..cd1c1c2 100644
  293. --- a/sys/nfs41sys_updowncall.c
  294. +++ b/sys/nfs41sys_updowncall.c
  295. @@ -299,6 +299,7 @@ NTSTATUS handle_upcall(
  296.          status = marshal_nfs41_filequery(entry, pbOut, cbOut, len);
  297.          break;
  298.      case NFS41_SYSOP_FILE_SET:
  299. +    case NFS41_SYSOP_FILE_SET_AT_CLEANUP:
  300.          status = marshal_nfs41_fileset(entry, pbOut, cbOut, len);
  301.          break;
  302.      case NFS41_SYSOP_EA_SET:
  303. @@ -768,6 +769,7 @@ NTSTATUS nfs41_downcall(
  304.              status = unmarshal_nfs41_getacl(cur, &inbuf);
  305.              break;
  306.          case NFS41_SYSOP_FILE_SET:
  307. +        case NFS41_SYSOP_FILE_SET_AT_CLEANUP:
  308.              unmarshal_nfs41_setattr(cur, &cur->ChangeTime, &inbuf);
  309.              break;
  310.          case NFS41_SYSOP_EA_SET:
  311. --
  312. 2.51.0
  313.  
  314. From fbf135794cbe5eae5f825d788d0689dddac85825 Mon Sep 17 00:00:00 2001
  315. From: Roland Mainz <roland.mainz@nrubsig.org>
  316. Date: Sat, 8 Nov 2025 17:35:49 +0100
  317. Subject: [PATCH 3/5] cygwin: make bintarball should genreate the HTML ReadMe
  318.  
  319. make bintarball should genreate the HTML ReadMe.
  320.  
  321. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  322. ---
  323. cygwin/Makefile | 42 +++++++++++++++++++++++++++++++++---------
  324.  1 file changed, 33 insertions(+), 9 deletions(-)
  325.  
  326. diff --git a/cygwin/Makefile b/cygwin/Makefile
  327. index e400eef..eda64e6 100644
  328. --- a/cygwin/Makefile
  329. +++ b/cygwin/Makefile
  330. @@ -187,7 +187,11 @@ installdest64: \
  331.  # in parallel
  332.  installdest: installdest_util installdest32 .WAIT installdest64
  333.  
  334. -bintarball: installdest $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)/README.md
  335. +bintarball: \
  336. +       installdest \
  337. +       $(PROJECT_BASEDIR_DIR)/README.txt \
  338. +       $(PROJECT_BASEDIR_DIR)/README.html \
  339. +       $(PROJECT_BASEDIR_DIR)/README.md
  340.         set -o errexit ; set -o xtrace ; \
  341.         base_filename="msnfs41client_cygwin_64bit32bit_binaries_$$(date +%Y%m%d_%Hh%Mm)_git$$(git rev-parse --short HEAD)" ; \
  342.         ( \
  343. @@ -201,14 +205,22 @@ bintarball: installdest $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)
  344.         archive_sha256hash="$$(openssl sha256 -r "$${base_filename}.tar.bz2" | while read a dummy ; do printf "%s\n" "$$a" ; done)" ; \
  345.                 sed -E <"../README.txt" \
  346.                         -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
  347. -                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" \
  348. +                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" ; \
  349. +               sed -E <"../README.html" \
  350. +                       -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
  351. +                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.html" \
  352.         ) ; \
  353.         printf "\n#\n# 32bit+64bit tarball is ready now\n#\n" ; \
  354.         ls -l "$(DESTDIR)/$${base_filename}.tar.bz2" ; \
  355. -       ls -l "$(DESTDIR)/$${base_filename}.readme"
  356. +       ls -l "$(DESTDIR)/$${base_filename}.readme" ; \
  357. +       ls -l "$(DESTDIR)/$${base_filename}.html"
  358.         sync
  359.  
  360. -bintarball32: installdest32 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)/README.md
  361. +bintarball32: \
  362. +       installdest32 \
  363. +       $(PROJECT_BASEDIR_DIR)/README.txt \
  364. +       $(PROJECT_BASEDIR_DIR)/README.html \
  365. +       $(PROJECT_BASEDIR_DIR)/README.md
  366.         set -o errexit ; set -o xtrace ; \
  367.         base_filename="msnfs41client_cygwin_32bit_binaries_$$(date +%Y%m%d_%Hh%Mm)_git$$(git rev-parse --short HEAD)" ; \
  368.         ( \
  369. @@ -222,14 +234,22 @@ bintarball32: installdest32 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_
  370.         archive_sha256hash="$$(openssl sha256 -r "$${base_filename}.tar.bz2" | while read a dummy ; do printf "%s\n" "$$a" ; done)" ; \
  371.                 sed -E <"../README.txt" \
  372.                         -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
  373. -                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" \
  374. +                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" ; \
  375. +               sed -E <"../README.html" \
  376. +                       -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
  377. +                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.html" \
  378.         ) ; \
  379.         printf "\n#\n# 32bit-only tarball is ready now\n#\n" ; \
  380.         ls -l "$(DESTDIR)/$${base_filename}.tar.bz2" ; \
  381. -       ls -l "$(DESTDIR)/$${base_filename}.readme"
  382. +       ls -l "$(DESTDIR)/$${base_filename}.readme" ; \
  383. +       ls -l "$(DESTDIR)/$${base_filename}.html"
  384.         sync
  385.  
  386. -bintarball64: installdest64 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_DIR)/README.md
  387. +bintarball64: \
  388. +       installdest64 \
  389. +       $(PROJECT_BASEDIR_DIR)/README.txt \
  390. +       $(PROJECT_BASEDIR_DIR)/README.html \
  391. +       $(PROJECT_BASEDIR_DIR)/README.md
  392.         set -o errexit ; set -o xtrace ; \
  393.         base_filename="msnfs41client_cygwin_64bit_binaries_$$(date +%Y%m%d_%Hh%Mm)_git$$(git rev-parse --short HEAD)" ; \
  394.         ( \
  395. @@ -243,11 +263,15 @@ bintarball64: installdest64 $(PROJECT_BASEDIR_DIR)/README.txt $(PROJECT_BASEDIR_
  396.         archive_sha256hash="$$(openssl sha256 -r "$${base_filename}.tar.bz2" | while read a dummy ; do printf "%s\n" "$$a" ; done)" ; \
  397.                 sed -E <"../README.txt" \
  398.                         -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
  399. -                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" \
  400. +                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.readme" ; \
  401. +               sed -E <"../README.html" \
  402. +                       -e "s/\\$$\{bintarball.base_filename\}/$${base_filename}/g" \
  403. +                       -e "s/\\$$\{bintarball.archive_sha256hash\}/$${archive_sha256hash}/g" >"$${base_filename}.html" \
  404.         ) ; \
  405.         printf "\n#\n# 64bit-only tarball is ready now\n#\n" ; \
  406.         ls -l "$(DESTDIR)/$${base_filename}.tar.bz2" ; \
  407. -       ls -l "$(DESTDIR)/$${base_filename}.readme"
  408. +       ls -l "$(DESTDIR)/$${base_filename}.readme" ; \
  409. +       ls -l "$(DESTDIR)/$${base_filename}.html"
  410.         sync
  411.  
  412.  $(PROJECT_BASEDIR_DIR)/README.html: $(PROJECT_BASEDIR_DIR)/docs/README.xml
  413. --
  414. 2.51.0
  415.  
  416. From 6aa41a42f84032e5171f704908359f657b622cf5 Mon Sep 17 00:00:00 2001
  417. From: Roland Mainz <roland.mainz@nrubsig.org>
  418. Date: Sat, 8 Nov 2025 17:38:24 +0100
  419. Subject: [PATCH 4/5] README.md,docs: Remove reference to the long gone
  420.  cygwin/README.bintarball.txt
  421.  
  422. Remove reference to the long gone cygwin/README.bintarball.txt.
  423.  
  424. Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
  425. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  426. ---
  427. README.md       | 12 +++---------
  428.  docs/README.xml |  6 +++---
  429.  2 files changed, 6 insertions(+), 12 deletions(-)
  430.  
  431. diff --git a/README.md b/README.md
  432. index 2364154..a41dca6 100644
  433. --- a/README.md
  434. +++ b/README.md
  435. @@ -854,9 +854,7 @@ Source code can be obtained from
  436.    - WDK for Windows 10, version 2004, from
  437.      <https://go.microsoft.com/fwlink/?linkid=2128854>
  438.  
  439. -  - Cygwin 64bit \>= 3.5.0 (see
  440. -    `ms-nfs41-clientcygwin/README.bintarball.txt` for Cygwin 32bit and
  441. -    64bit installation instructions)
  442. +  - Cygwin 64bit \>= 3.5.0
  443.  
  444.    - PanDoc document converter, from
  445.      <https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi>
  446. @@ -875,9 +873,7 @@ Source code can be obtained from
  447.    - WDK for Windows 11, version 1591, from
  448.      <https://go.microsoft.com/fwlink/?linkid=2286137>
  449.  
  450. -  - Cygwin 64bit \>= 3.5.0 (see
  451. -    `ms-nfs41-clientcygwin/README.bintarball.txt` for Cygwin 32bit and
  452. -    64bit installation instructions)
  453. +  - Cygwin 64bit \>= 3.5.0
  454.  
  455.    - PanDoc document converter, from
  456.      <https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi>
  457. @@ -896,9 +892,7 @@ Source code can be obtained from
  458.  
  459.          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'
  460.  
  461. -  - Cygwin 64bit \>= 3.5.0 (see
  462. -    `ms-nfs41-clientcygwin/README.bintarball.txt` for Cygwin 32bit and
  463. -    64bit installation instructions)
  464. +  - Cygwin 64bit \>= 3.5.0
  465.  
  466.    - PanDoc document converter, from
  467.      <https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-windows-x86_64.msi>
  468. diff --git a/docs/README.xml b/docs/README.xml
  469. index d605c85..a74a903 100644
  470. --- a/docs/README.xml
  471. +++ b/docs/README.xml
  472. @@ -950,7 +950,7 @@ Datei befindet. Versuchen Sie, die Datei woanders zu speichern.</programlisting>
  473.                  <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>
  474.                </listitem>
  475.                <listitem>
  476. -                <para>Cygwin 64bit &gt;= 3.5.0 (see <filename>ms-nfs41-clientcygwin/README.bintarball.txt</filename> for Cygwin 32bit and 64bit installation instructions)</para>
  477. +                <para>Cygwin 64bit &gt;= 3.5.0</para>
  478.                </listitem>
  479.                <listitem>
  480.                  <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>
  481. @@ -971,7 +971,7 @@ Datei befindet. Versuchen Sie, die Datei woanders zu speichern.</programlisting>
  482.                  <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>
  483.                </listitem>
  484.                <listitem>
  485. -                <para>Cygwin 64bit &gt;= 3.5.0 (see <filename>ms-nfs41-clientcygwin/README.bintarball.txt</filename> for Cygwin 32bit and 64bit installation instructions)</para>
  486. +                <para>Cygwin 64bit &gt;= 3.5.0</para>
  487.                </listitem>
  488.                <listitem>
  489.                  <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>
  490. @@ -993,7 +993,7 @@ Datei befindet. Versuchen Sie, die Datei woanders zu speichern.</programlisting>
  491.                  </para>
  492.                </listitem>
  493.                <listitem>
  494. -                <para>Cygwin 64bit &gt;= 3.5.0 (see <filename>ms-nfs41-clientcygwin/README.bintarball.txt</filename> for Cygwin 32bit and 64bit installation instructions)</para>
  495. +                <para>Cygwin 64bit &gt;= 3.5.0</para>
  496.                </listitem>
  497.                <listitem>
  498.                  <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>
  499. --
  500. 2.51.0
  501.  
  502. From ae294778b60c72d26c226af034ac5967cb62524e Mon Sep 17 00:00:00 2001
  503. From: Roland Mainz <roland.mainz@nrubsig.org>
  504. Date: Sat, 8 Nov 2025 19:00:40 +0100
  505. Subject: [PATCH 5/5] daemon: Turn oplocks-are-unimplemented |EASSERT()|s in
  506.  |handle_open()| into |DASSERT()|s
  507.  
  508. Turn oplocks-are-unimplemented |EASSERT()|s in |handle_open()| into |DASSERT()|s
  509. for less traffic
  510.  
  511. Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
  512. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  513. ---
  514. daemon/open.c | 35 ++++++++++++++++++++---------------
  515.  1 file changed, 20 insertions(+), 15 deletions(-)
  516.  
  517. diff --git a/daemon/open.c b/daemon/open.c
  518. index 2454138..5532e3c 100644
  519. --- a/daemon/open.c
  520. +++ b/daemon/open.c
  521. @@ -778,25 +778,30 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  522.              break;
  523.      }
  524.  
  525. -    EASSERT_MSG(!(args->create_opts & FILE_COMPLETE_IF_OPLOCKED),
  526. -        ("handle_open: file='%s': "
  527. -        "FILE_COMPLETE_IF_OPLOCKED not supported\n", args->path));
  528. -    EASSERT_MSG(!(args->create_opts & FILE_OPEN_BY_FILE_ID),
  529. -        ("handle_open: file='%s': "
  530. -        "FILE_OPEN_BY_FILE_ID not supported\n", args->path));
  531. +    DASSERT_MSG(((args->create_opts & FILE_COMPLETE_IF_OPLOCKED) == 0),
  532. +        1,
  533. +        ("handle_open: file='%s': FILE_COMPLETE_IF_OPLOCKED not supported\n",
  534. +        args->path));
  535. +    DASSERT_MSG(((args->create_opts & FILE_OPEN_BY_FILE_ID) == 0),
  536. +        1,
  537. +        ("handle_open: file='%s': FILE_OPEN_BY_FILE_ID not supported\n",
  538. +        args->path));
  539.      /*
  540.       * Kernel rejects |FILE_OPEN_REQUIRING_OPLOCK|, we just use
  541.       * this here as safeguard
  542.       */
  543. -    EASSERT_MSG(!(args->create_opts & FILE_OPEN_REQUIRING_OPLOCK),
  544. -        ("handle_open: file='%s': "
  545. -        "FILE_OPEN_REQUIRING_OPLOCK not supported\n", args->path));
  546. -    EASSERT_MSG(!(args->create_opts & FILE_DISALLOW_EXCLUSIVE),
  547. -        ("handle_open: file='%s': "
  548. -        "FILE_DISALLOW_EXCLUSIVE not supported\n", args->path));
  549. -    EASSERT_MSG(!(args->create_opts & FILE_RESERVE_OPFILTER),
  550. -        ("handle_open: file='%s': "
  551. -        "FILE_RESERVE_OPFILTER not supported\n", args->path));
  552. +    DASSERT_MSG(((args->create_opts & FILE_OPEN_REQUIRING_OPLOCK) == 0),
  553. +        1,
  554. +        ("handle_open: file='%s': FILE_OPEN_REQUIRING_OPLOCK not supported\n",
  555. +        args->path));
  556. +    DASSERT_MSG(((args->create_opts & FILE_RESERVE_OPFILTER) == 0),
  557. +        1,
  558. +        ("handle_open: file='%s': FILE_RESERVE_OPFILTER not supported\n",
  559. +        args->path));
  560. +    DASSERT_MSG(((args->create_opts & FILE_DISALLOW_EXCLUSIVE) == 0),
  561. +        1,
  562. +        ("handle_open: file='%s': FILE_DISALLOW_EXCLUSIVE not supported\n",
  563. +        args->path));
  564.  
  565.      status = create_open_state(args->path, args->open_owner_id, &state);
  566.      if (status) {
  567. --
  568. 2.51.0

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.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at