pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Patches for opening volume (dir) as file, docs, cleanup, tests+misc, 2025-07-26
Posted by Anonymous on Sat 26th Jul 2025 15:59
raw | new post

  1. From f094498129a5b406796c38c34527d8ffac341833 Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Sat, 26 Jul 2025 15:02:28 +0200
  4. Subject: [PATCH 1/4] daemon,sys,tests: Support opening the volume mount point
  5.  dir as file
  6.  
  7. Support opening the volume mount point dir as file, i.e. open
  8. L: if |FILE_NON_DIRECTORY_FILE| is set.
  9.  
  10. See https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
  11. section "FILE_NON_DIRECTORY_FILE":
  12. "... The file being opened must not be a directory file or this call
  13. fails. The file object being opened can represent a data file, a
  14. logical, virtual, or physical device, or a *VOLUME* ...").
  15.  
  16. This also gets $ fsutil.exe fsinfo volumeinfo L: # working.
  17.  
  18. Reported-by: Martin Wege <martin.l.wege@gmail.com>
  19. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  20. ---
  21. daemon/open.c            | 49 ++++++++++++++++++++++++++++------------
  22.  daemon/upcall.h          |  1 +
  23.  sys/nfs41sys_driver.h    |  4 +++-
  24.  sys/nfs41sys_mount.c     |  5 +++-
  25.  sys/nfs41sys_openclose.c | 21 +++++++++++++++++
  26.  sys/nfs41sys_util.c      |  2 +-
  27.  tests/manual_testing.txt | 11 +++++++++
  28.  7 files changed, 76 insertions(+), 17 deletions(-)
  29.  
  30. diff --git a/daemon/open.c b/daemon/open.c
  31. index ac7d102..2e71e07 100644
  32. --- a/daemon/open.c
  33. +++ b/daemon/open.c
  34. @@ -317,6 +317,8 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
  35.  
  36.      status = get_name(&buffer, &length, &args->path);
  37.      if (status) goto out;
  38. +    status = safe_read(&buffer, &length, &args->isvolumemntpt, sizeof(BOOLEAN));
  39. +    if (status) goto out;
  40.      status = safe_read(&buffer, &length, &args->access_mask, sizeof(ULONG));
  41.      if (status) goto out;
  42.      status = safe_read(&buffer, &length, &args->access_mode, sizeof(ULONG));
  43. @@ -345,21 +347,25 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
  44.      if (status) goto out;
  45.  
  46.  #ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  47. -    DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' access mask=%d "
  48. +    DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
  49. +        "isvolumemntpt=%d access mask=%d "
  50.          "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
  51.          "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
  52.          "owner_local_uid=%u owner_group_local_gid=%u "
  53. -        "srv_open=0x%p symlink=%s ea=0x%p\n", args->path, args->access_mask,
  54. +        "srv_open=0x%p symlink=%s ea=0x%p\n",
  55. +        args->path, (int)args->isvolumemntpt, args->access_mask,
  56.          args->access_mode, args->file_attrs, args->create_opts,
  57.          args->disposition, args->open_owner_id, args->mode,
  58.          (unsigned int)args->owner_local_uid, (unsigned int)args->owner_group_local_gid,
  59.          args->srv_open,
  60.          args->symlink.path, args->ea));
  61.  #else
  62. -    DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' access mask=%d "
  63. +    DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
  64. +        "isvolumemntpt=%d access mask=%d "
  65.          "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
  66.          "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
  67. -        "srv_open=0x%p symlink=%s ea=0x%p\n", args->path, args->access_mask,
  68. +        "srv_open=0x%p symlink=%s ea=0x%p\n",
  69. +        args->path, (int)args->isvolumemntpt, args->access_mask,
  70.          args->access_mode, args->file_attrs, args->create_opts,
  71.          args->disposition, args->open_owner_id, args->mode,
  72.          args->srv_open,
  73. @@ -836,16 +842,31 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  74.          if (info.type == NF4DIR) {
  75.              DPRINTF(2, ("handle_nfs41_open: DIRECTORY\n"));
  76.              if (args->create_opts & FILE_NON_DIRECTORY_FILE) {
  77. -                DPRINTF(1, ("trying to open directory '%s' as a file\n",
  78. -                    state->path.path));
  79. -                /*
  80. -                 * Notes:
  81. -                 * - NTFS+SMB returns |STATUS_FILE_IS_A_DIRECTORY|
  82. -                 * - See |map_open_errors()| for the mapping to
  83. -                 * |STATUS_*|
  84. -                 */
  85. -                status = ERROR_DIRECTORY_NOT_SUPPORTED;
  86. -                goto out_free_state;
  87. +                if (args->isvolumemntpt) {
  88. +                    /*
  89. +                     * Open directry as volume
  90. +                     * (see https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
  91. +                     * section "FILE_NON_DIRECTORY_FILE":
  92. +                     * "... The file being opened must not be a directory file
  93. +                     * or this call fails. The file object being opened can
  94. +                     * represent a data file, a logical, virtual, or physical
  95. +                     * device, or a *VOLUME* ...")
  96. +                     */
  97. +                    DPRINTF(1, ("open directory '%s' as a volume\n",
  98. +                        state->path.path));
  99. +                }
  100. +                else {
  101. +                    DPRINTF(1, ("trying to open directory '%s' as a file\n",
  102. +                        state->path.path));
  103. +                    /*
  104. +                     * Notes:
  105. +                     * - NTFS+SMB returns |STATUS_FILE_IS_A_DIRECTORY|
  106. +                     * - See |map_open_errors()| for the mapping to
  107. +                     * |STATUS_*|
  108. +                     */
  109. +                    status = ERROR_DIRECTORY_NOT_SUPPORTED;
  110. +                    goto out_free_state;
  111. +                }
  112.              }
  113.          } else if (info.type == NF4REG) {
  114.              DPRINTF(2, ("handle nfs41_open: FILE\n"));
  115. diff --git a/daemon/upcall.h b/daemon/upcall.h
  116. index bbbecf7..bafaac9 100644
  117. --- a/daemon/upcall.h
  118. +++ b/daemon/upcall.h
  119. @@ -51,6 +51,7 @@ typedef struct __open_upcall_args {
  120.      ULONGLONG fileid;
  121.      ULONGLONG fsid_major, fsid_minor;
  122.      const char *path;
  123. +    BOOLEAN isvolumemntpt;
  124.      ULONG access_mask;
  125.      ULONG access_mode;
  126.      ULONG file_attrs;
  127. diff --git a/sys/nfs41sys_driver.h b/sys/nfs41sys_driver.h
  128. index c6b6c0d..87047f9 100644
  129. --- a/sys/nfs41sys_driver.h
  130. +++ b/sys/nfs41sys_driver.h
  131. @@ -219,6 +219,7 @@ typedef struct _updowncall_entry {
  132.              ULONGLONG fileid;
  133.              ULONGLONG fsid_major, fsid_minor;
  134.              UNICODE_STRING symlink;
  135. +            BOOLEAN isvolumemntpt;
  136.              ULONG access_mask;
  137.              ULONG access_mode;
  138.              ULONG attrs;
  139. @@ -408,7 +409,8 @@ typedef struct _NFS41_V_NET_ROOT_EXTENSION {
  140.      DWORD                   timeout;
  141.      NFS41_MOUNT_CREATEMODE  dir_createmode;
  142.      NFS41_MOUNT_CREATEMODE  file_createmode;
  143. -    USHORT                  MountPathLen;
  144. +    WCHAR                   mntpt_buffer[NFS41_SYS_MAX_PATH_LEN];
  145. +    UNICODE_STRING          MntPt;
  146.      DWORD                   nfsvers;
  147.      BOOLEAN                 read_only;
  148.      BOOLEAN                 write_thru;
  149. diff --git a/sys/nfs41sys_mount.c b/sys/nfs41sys_mount.c
  150. index 5e66eda..f2d7d81 100644
  151. --- a/sys/nfs41sys_mount.c
  152. +++ b/sys/nfs41sys_mount.c
  153. @@ -1051,7 +1051,10 @@ NTSTATUS nfs41_CreateVNetRoot(
  154.          Config->file_createmode.use_nfsv3attrsea_mode?1:0,
  155.          Config->file_createmode.mode);
  156.  
  157. -    pVNetRootContext->MountPathLen = Config->MntPt.Length;
  158. +    pVNetRootContext->MntPt.Buffer = pVNetRootContext->mntpt_buffer;
  159. +    pVNetRootContext->MntPt.Length = Config->MntPt.Length;
  160. +    pVNetRootContext->MntPt.MaximumLength = Config->MntPt.MaximumLength;
  161. +    RtlCopyUnicodeString(&pVNetRootContext->MntPt, &Config->MntPt);
  162.      pVNetRootContext->timeout = Config->timeout;
  163.      pVNetRootContext->dir_createmode.use_nfsv3attrsea_mode =
  164.          Config->dir_createmode.use_nfsv3attrsea_mode;
  165. diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
  166. index 94d3fa8..f18e54f 100644
  167. --- a/sys/nfs41sys_openclose.c
  168. +++ b/sys/nfs41sys_openclose.c
  169. @@ -123,6 +123,7 @@ NTSTATUS marshal_nfs41_open(
  170.  #ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  171.          2 * sizeof(DWORD) +
  172.  #endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  173. +        1 * sizeof(BOOLEAN) +
  174.          2 * sizeof(HANDLE) +
  175.          length_as_utf8(&entry->u.Open.symlink);
  176.      if (header_len > buf_len) {
  177. @@ -131,6 +132,9 @@ NTSTATUS marshal_nfs41_open(
  178.      }
  179.      status = marshall_unicode_as_utf8(&tmp, entry->filename);
  180.      if (status) goto out;
  181. +    RtlCopyMemory(tmp, &entry->u.Open.isvolumemntpt,
  182. +        sizeof(entry->u.Open.isvolumemntpt));
  183. +    tmp += sizeof(entry->u.Open.isvolumemntpt);
  184.      RtlCopyMemory(tmp, &entry->u.Open.access_mask,
  185.          sizeof(entry->u.Open.access_mask));
  186.      tmp += sizeof(entry->u.Open.access_mask);
  187. @@ -389,6 +393,18 @@ static BOOLEAN areOpenParamsValid(NT_CREATE_PARAMETERS *params)
  188.      return TRUE;
  189.  }
  190.  
  191. +static BOOLEAN isFileNameTheVolumeMountPoint(PUNICODE_STRING fileName,
  192. +    PNFS41_V_NET_ROOT_EXTENSION pVNetRootContext) {
  193. +    /* Check whether this is the mount point for this volume */
  194. +    if ((fileName->Length == pVNetRootContext->MntPt.Length) &&
  195. +        (memcmp(fileName->Buffer,
  196. +            pVNetRootContext->MntPt.Buffer,
  197. +            pVNetRootContext->MntPt.Length) == 0)) {
  198. +        return TRUE;
  199. +    }
  200. +    return FALSE;
  201. +}
  202. +
  203.  NTSTATUS map_open_errors(
  204.      DWORD status,
  205.      USHORT len)
  206. @@ -628,6 +644,11 @@ NTSTATUS nfs41_Create(
  207.          SrvOpen->pAlreadyPrefixedName, &entry);
  208.      if (status) goto out;
  209.  
  210. +    /* Check whether this is the mount point for this volume */
  211. +    entry->u.Open.isvolumemntpt =
  212. +        isFileNameTheVolumeMountPoint(SrvOpen->pAlreadyPrefixedName,
  213. +            pVNetRootContext);
  214. +
  215.      entry->u.Open.access_mask = params->DesiredAccess;
  216.      entry->u.Open.access_mode = params->ShareAccess;
  217.      entry->u.Open.attrs = params->FileAttributes;
  218. diff --git a/sys/nfs41sys_util.c b/sys/nfs41sys_util.c
  219. index b1a7589..4420546 100644
  220. --- a/sys/nfs41sys_util.c
  221. +++ b/sys/nfs41sys_util.c
  222. @@ -112,7 +112,7 @@ BOOLEAN is_root_directory(
  223.      /* calculate the root directory's length, including vnetroot prefix,
  224.       * mount path, and a trailing \ */
  225.      const USHORT RootPathLen = VNetRoot->PrefixEntry.Prefix.Length +
  226. -            pVNetRootContext->MountPathLen + sizeof(WCHAR);
  227. +            pVNetRootContext->MntPt.Length + sizeof(WCHAR);
  228.  
  229.      return RxContext->CurrentIrpSp->FileObject->FileName.Length <= RootPathLen;
  230.  }
  231. diff --git a/tests/manual_testing.txt b/tests/manual_testing.txt
  232. index c57160b..526547c 100644
  233. --- a/tests/manual_testing.txt
  234. +++ b/tests/manual_testing.txt
  235. @@ -427,6 +427,17 @@ icacls mytestfile1.txt | grep --colour -E 'cygwingrp2.+GR'
  236.  #
  237.  
  238.  
  239. +#
  240. +# Test whether opening the mount point (e.g. L:) as a plain file works
  241. +# (see https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
  242. +# section "FILE_NON_DIRECTORY_FILE": "... The file being opened must not be a directory file
  243. +# or this call fails. The file object being opened can represent a data file, a logical,
  244. +# virtual, or physical device, or a *VOLUME*. ...")
  245. +#
  246. +$ fsutil.exe fsinfo volumeinfo L:
  247. +<Should print info about that filesystem>
  248. +
  249. +
  250.  #
  251.  # Tests for Windows EAs (Extended Attributes)
  252.  # Windows EAs are represented as NFSv4 extended attributes (XATTR)
  253. --
  254. 2.45.1
  255.  
  256. From 34c1b7491ef79b76fa491080644a432985ec794a Mon Sep 17 00:00:00 2001
  257. From: Roland Mainz <roland.mainz@nrubsig.org>
  258. Date: Sat, 26 Jul 2025 15:18:29 +0200
  259. Subject: [PATCH 2/4] daemon: Enable debug output for NFS file types open does
  260.  not handle (FIFO, DEVICE, ...)
  261.  
  262. Enable debug output for NFS file types open does not handle (FIFO, DEVICE, ...).
  263.  
  264. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  265. ---
  266. daemon/open.c | 7 +++++--
  267.  1 file changed, 5 insertions(+), 2 deletions(-)
  268.  
  269. diff --git a/daemon/open.c b/daemon/open.c
  270. index 2e71e07..49c01a9 100644
  271. --- a/daemon/open.c
  272. +++ b/daemon/open.c
  273. @@ -918,8 +918,11 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  274.                  }
  275.                  goto out_free_state;
  276.              }
  277. -        } else
  278. -            DPRINTF(2, ("handle_open(): unsupported type=%d\n", info.type));
  279. +        } else {
  280. +            DPRINTF(0,
  281. +                ("handle_open(args->path='%s'): unsupported info.type=%d\n",
  282. +                args->path, info.type));
  283. +        }
  284.          state->type = info.type;
  285.      } else if (status != ERROR_FILE_NOT_FOUND)
  286.          goto out_free_state;
  287. --
  288. 2.45.1
  289.  
  290. From 3339532909b15b5b2e0228b6317d9d1b9d59eb6f Mon Sep 17 00:00:00 2001
  291. From: Roland Mainz <roland.mainz@nrubsig.org>
  292. Date: Sat, 26 Jul 2025 15:39:06 +0200
  293. Subject: [PATCH 3/4] daemon,sys: Remove dead code in
  294.  NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES support
  295.  
  296. Remove dead code in NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  297. support.
  298.  
  299. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  300. ---
  301. daemon/open.c            | 21 ---------------------
  302.  sys/nfs41sys_openclose.c | 15 ---------------
  303.  2 files changed, 36 deletions(-)
  304.  
  305. diff --git a/daemon/open.c b/daemon/open.c
  306. index 49c01a9..65e2607 100644
  307. --- a/daemon/open.c
  308. +++ b/daemon/open.c
  309. @@ -333,12 +333,6 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
  310.      if (status) goto out;
  311.      status = safe_read(&buffer, &length, &args->mode, sizeof(DWORD));
  312.      if (status) goto out;
  313. -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  314. -    status = safe_read(&buffer, &length, &args->owner_local_uid, sizeof(DWORD));
  315. -    if (status) goto out;
  316. -    status = safe_read(&buffer, &length, &args->owner_group_local_gid, sizeof(DWORD));
  317. -    if (status) goto out;
  318. -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  319.      status = safe_read(&buffer, &length, &args->srv_open, sizeof(HANDLE));
  320.      if (status) goto out;
  321.      status = parse_abs_path(&buffer, &length, &args->symlink);
  322. @@ -346,31 +340,16 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
  323.      status = safe_read(&buffer, &length, &args->ea, sizeof(HANDLE));
  324.      if (status) goto out;
  325.  
  326. -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  327.      DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
  328.          "isvolumemntpt=%d access mask=%d "
  329.          "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
  330.          "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
  331. -        "owner_local_uid=%u owner_group_local_gid=%u "
  332.          "srv_open=0x%p symlink=%s ea=0x%p\n",
  333.          args->path, (int)args->isvolumemntpt, args->access_mask,
  334.          args->access_mode, args->file_attrs, args->create_opts,
  335.          args->disposition, args->open_owner_id, args->mode,
  336. -        (unsigned int)args->owner_local_uid, (unsigned int)args->owner_group_local_gid,
  337.          args->srv_open,
  338.          args->symlink.path, args->ea));
  339. -#else
  340. -    DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
  341. -        "isvolumemntpt=%d access mask=%d "
  342. -        "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
  343. -        "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
  344. -        "srv_open=0x%p symlink=%s ea=0x%p\n",
  345. -        args->path, (int)args->isvolumemntpt, args->access_mask,
  346. -        args->access_mode, args->file_attrs, args->create_opts,
  347. -        args->disposition, args->open_owner_id, args->mode,
  348. -        args->srv_open,
  349. -        args->symlink.path, args->ea));
  350. -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  351.  
  352.      if (DPRINTF_LEVEL_ENABLED(2)) {
  353.          print_disposition(2, args->disposition);
  354. diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
  355. index f18e54f..9a4431f 100644
  356. --- a/sys/nfs41sys_openclose.c
  357. +++ b/sys/nfs41sys_openclose.c
  358. @@ -120,9 +120,6 @@ NTSTATUS marshal_nfs41_open(
  359.  
  360.      header_len = *len + length_as_utf8(entry->filename) +
  361.          7 * sizeof(ULONG) +
  362. -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  363. -        2 * sizeof(DWORD) +
  364. -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  365.          1 * sizeof(BOOLEAN) +
  366.          2 * sizeof(HANDLE) +
  367.          length_as_utf8(&entry->u.Open.symlink);
  368. @@ -152,12 +149,6 @@ NTSTATUS marshal_nfs41_open(
  369.      tmp += sizeof(entry->u.Open.open_owner_id);
  370.      RtlCopyMemory(tmp, &entry->u.Open.mode, sizeof(DWORD));
  371.      tmp += sizeof(DWORD);
  372. -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  373. -    RtlCopyMemory(tmp, &entry->u.Open.owner_local_uid, sizeof(DWORD));
  374. -    tmp += sizeof(DWORD);
  375. -    RtlCopyMemory(tmp, &entry->u.Open.owner_group_local_gid, sizeof(DWORD));
  376. -    tmp += sizeof(DWORD);
  377. -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  378.      RtlCopyMemory(tmp, &entry->u.Open.srv_open, sizeof(HANDLE));
  379.      tmp += sizeof(HANDLE);
  380.      status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
  381. @@ -190,16 +181,10 @@ NTSTATUS marshal_nfs41_open(
  382.  #ifdef DEBUG_MARSHAL_DETAIL
  383.      DbgP("marshal_nfs41_open: name='%wZ' mask=0x%x access=0x%x attrs=0x%x "
  384.           "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=0%o "
  385. -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  386. -         "owner_local_uid=%lu owner_group_local_gid=%lu "
  387. -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  388.           "srv_open=0x%p ea=0x%p\n",
  389.           entry->filename, entry->u.Open.access_mask,
  390.           entry->u.Open.access_mode, entry->u.Open.attrs, entry->u.Open.copts,
  391.           entry->u.Open.disp, entry->u.Open.open_owner_id, entry->u.Open.mode,
  392. -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  393. -         entry->u.Open.owner_local_uid,entry->u.Open.owner_group_local_gid,
  394. -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  395.           entry->u.Open.srv_open, entry->u.Open.EaBuffer);
  396.  #endif
  397.  out:
  398. --
  399. 2.45.1
  400.  
  401. From 17eddea0b8a959ea8254556e42376b7ef8efabba Mon Sep 17 00:00:00 2001
  402. From: Roland Mainz <roland.mainz@nrubsig.org>
  403. Date: Sat, 26 Jul 2025 15:50:15 +0200
  404. Subject: [PATCH 4/4] README.md,docs: Add MariaDB+Office 2016+misc to
  405.  supported+tested software
  406.  
  407. Add MariaDB+Office 2016+misc to supported+tested software.
  408.  
  409. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  410. ---
  411. README.md       | 10 ++++++++--
  412.  docs/README.xml |  8 +++++++-
  413.  2 files changed, 15 insertions(+), 3 deletions(-)
  414.  
  415. diff --git a/README.md b/README.md
  416. index 9c3a2de..48e6695 100644
  417. --- a/README.md
  418. +++ b/README.md
  419. @@ -174,7 +174,8 @@ NFSv4.2/NFSv4.1 filesystem driver for Windows 10/11 & Windows Server
  420.      and other POSIX-compatible NFSv4.2/NFSv4.1 clients.
  421.  
  422.  - Support for NFSv4 public mounts (i.e., use the NFSv4 public file
  423. -  handle lookup protocol via `$ nfs_mount -o public ... #`)
  424. +  handle lookup protocol via
  425. +  `$ nfs_mount -o public ... relative-path-or-url#`)
  426.  
  427.  - Support for NFSv4 referrals
  428.  
  429. @@ -210,11 +211,16 @@ NFSv4.2/NFSv4.1 filesystem driver for Windows 10/11 & Windows Server
  430.  
  431.    - All tools from Cygwin/MSYS2/MinGW
  432.  
  433. -  - Visual Studio
  434. +  - Visual Studio (tested: VS2019, VS2022)
  435.  
  436.    - VMware Workstation (can use VMs hosted on NFSv4.2/NFSv4.1
  437.      filesystem)
  438.  
  439. +  - MariaDB (including sparse file support for [page
  440. +    compression](https://dev.mysql.com/doc/refman/8.4/en/innodb-page-compression.html))
  441. +
  442. +  - Microsoft Office (tested: Office 2016)
  443. +
  444.  # Requirements
  445.  
  446.  - Windows 10 (32bit or 64bit), Windows 11 or Windows Server 2019+2022
  447. diff --git a/docs/README.xml b/docs/README.xml
  448. index 86f783e..6fc896a 100644
  449. --- a/docs/README.xml
  450. +++ b/docs/README.xml
  451. @@ -235,11 +235,17 @@
  452.                <para>All tools from Cygwin/MSYS2/MinGW</para>
  453.              </listitem>
  454.              <listitem>
  455. -              <para>Visual Studio</para>
  456. +              <para>Visual Studio (tested: VS2019, VS2022)</para>
  457.              </listitem>
  458.              <listitem>
  459.                <para>VMware Workstation (can use VMs hosted on NFSv4.2/NFSv4.1 filesystem)</para>
  460.              </listitem>
  461. +            <listitem>
  462. +              <para>MariaDB (including sparse file support for <link xl:href="https://dev.mysql.com/doc/refman/8.4/en/innodb-page-compression.html">page compression</link>)</para>
  463. +            </listitem>
  464. +            <listitem>
  465. +              <para>Microsoft Office (tested: Office 2016)</para>
  466. +            </listitem>
  467.            </itemizedlist>
  468.          </para>
  469.        </listitem>
  470. --
  471. 2.45.1

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