pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Patches for Win32 named stream renaming support, fix NFS named attr Win32 named stream filename prefix, tests+misc, 2026-01-17
Posted by Anonymous on Sat 17th Jan 2026 17:57
raw | new post

  1. From 045502ef2d60b0f3c9f939a12df9839a14de6289 Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Sat, 17 Jan 2026 14:34:58 +0100
  4. Subject: [PATCH 1/6] sys: |map_queryfile_error()|+|map_setfile_error()| should
  5.  handle |ERROR_INVALID_NAME|
  6.  
  7. |map_queryfile_error()|+|map_setfile_error()| should map |ERROR_INVALID_NAME|
  8. to |STATUS_OBJECT_NAME_INVALID|.
  9.  
  10. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  11. ---
  12. sys/nfs41sys_fileinfo.c | 2 ++
  13.  1 file changed, 2 insertions(+)
  14.  
  15. diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
  16. index 2945a42..ded8df4 100644
  17. --- a/sys/nfs41sys_fileinfo.c
  18. +++ b/sys/nfs41sys_fileinfo.c
  19. @@ -198,6 +198,7 @@ NTSTATUS map_queryfile_error(
  20.      switch (error) {
  21.      case ERROR_ACCESS_DENIED:       return STATUS_ACCESS_DENIED;
  22.      case ERROR_NETNAME_DELETED:     return STATUS_NETWORK_NAME_DELETED;
  23. +    case ERROR_INVALID_NAME:        return STATUS_OBJECT_NAME_INVALID;
  24.      case ERROR_INVALID_PARAMETER:   return STATUS_INVALID_PARAMETER;
  25.      case ERROR_NOT_SUPPORTED:       return STATUS_NOT_SUPPORTED;
  26.      case ERROR_INTERNAL_ERROR:      return STATUS_INTERNAL_ERROR;
  27. @@ -590,6 +591,7 @@ NTSTATUS map_setfile_error(
  28.      case ERROR_FILE_TOO_LARGE:          return STATUS_FILE_TOO_LARGE;
  29.      case ERROR_INSUFFICIENT_BUFFER:     return STATUS_BUFFER_TOO_SMALL;
  30.      case ERROR_MORE_DATA:               return STATUS_BUFFER_OVERFLOW;
  31. +    case ERROR_INVALID_NAME:            return STATUS_OBJECT_NAME_INVALID;
  32.      case ERROR_INTERNAL_ERROR:          return STATUS_INTERNAL_ERROR;
  33.      default:
  34.          print_error("map_setfile_error: "
  35. --
  36. 2.51.0
  37.  
  38. From 93ebad22488b14b9e82cab85399a01b4689e053b Mon Sep 17 00:00:00 2001
  39. From: Roland Mainz <roland.mainz@nrubsig.org>
  40. Date: Sat, 17 Jan 2026 14:37:01 +0100
  41. Subject: [PATCH 2/6] daemon: NFS named attr filename prefix for Win32 named
  42.  streams should be "win32.stream."
  43.  
  44. NFS named attr filename prefix for Win32 named streams should be "win32.stream.",
  45. not "win32.streams.".
  46.  
  47. Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
  48. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  49. ---
  50. daemon/winstreams.c | 4 ++--
  51.  1 file changed, 2 insertions(+), 2 deletions(-)
  52.  
  53. diff --git a/daemon/winstreams.c b/daemon/winstreams.c
  54. index df620e5..8e3f2f8 100644
  55. --- a/daemon/winstreams.c
  56. +++ b/daemon/winstreams.c
  57. @@ -45,8 +45,8 @@
  58.   * "SUNWattr_ro" will fail, because the attribute file is
  59.   * read-only).
  60.   */
  61. -#define WIN_NFS4_STREAMS_NAME_PREFIX "win32.streams."
  62. -#define WIN_NFS4_STREAMS_NAME_PREFIX_LEN (14)
  63. +#define WIN_NFS4_STREAMS_NAME_PREFIX "win32.stream."
  64. +#define WIN_NFS4_STREAMS_NAME_PREFIX_LEN (13)
  65.  
  66.  
  67.  static
  68. --
  69. 2.51.0
  70.  
  71. From 526476c0ad640912372cdded8ca756dee1dd2cee Mon Sep 17 00:00:00 2001
  72. From: Roland Mainz <roland.mainz@nrubsig.org>
  73. Date: Sat, 17 Jan 2026 16:31:27 +0100
  74. Subject: [PATCH 3/6] daemon,tests: Implement NTFS-style Win32 named stream
  75.  renaming support
  76.  
  77. Implement NTFS-style Win32 named stream renaming support, e.g.
  78. |FileRenameInformation| with "relative stream name", e.g.
  79. ':mystrname1:$DATA'.
  80.  
  81. Reported-by: Dan Shelton <dan.f.shelton@gmail.com>
  82. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  83. ---
  84. daemon/lookup.c          |   3 +-
  85.  daemon/nfs41_ops.c       | 142 ++++++++++++++++++++++++++++++++++-----
  86.  daemon/setattr.c         |  47 ++++++++++++-
  87.  daemon/winstreams.c      |  14 +++-
  88.  daemon/winstreams.h      |   1 +
  89.  tests/manual_testing.txt |   3 +-
  90.  6 files changed, 189 insertions(+), 21 deletions(-)
  91.  
  92. diff --git a/daemon/lookup.c b/daemon/lookup.c
  93. index 6dd5905..53517ae 100644
  94. --- a/daemon/lookup.c
  95. +++ b/daemon/lookup.c
  96. @@ -514,7 +514,8 @@ int nfs41_lookup(
  97.          bool is_stream = false;
  98.  
  99.          /* Parse the stream syntax */
  100. -        status = parse_win32stream_name(path.path, &is_stream, base_name, stream_name);
  101. +        status = parse_win32stream_name(path.path, false,
  102. +            &is_stream, base_name, stream_name);
  103.          if (status)
  104.              goto out;
  105.  
  106. diff --git a/daemon/nfs41_ops.c b/daemon/nfs41_ops.c
  107. index 3476484..9d3d720 100644
  108. --- a/daemon/nfs41_ops.c
  109. +++ b/daemon/nfs41_ops.c
  110. @@ -36,9 +36,7 @@
  111.  #include "delegation.h"
  112.  #include "daemon_debug.h"
  113.  #include "util.h"
  114. -#ifdef NFS41_WINSTREAMS_SUPPORT
  115.  #include "winstreams.h"
  116. -#endif /* NFS41_WINSTREAMS_SUPPORT */
  117.  
  118.  #ifdef NFS41_DRIVER_STABILITY_HACKS
  119.  /*
  120. @@ -492,7 +490,7 @@ int nfs41_open(
  121.  #ifdef NFS41_WINSTREAMS_SUPPORT
  122.      if (file->name.name) {
  123.          if (is_stream_path_fh(file)) {
  124. -            status = parse_win32stream_name(file->name.name,
  125. +            status = parse_win32stream_name(file->name.name, false,
  126.                  &is_stream, base_buf, stream_buf);
  127.              if (status)
  128.                  goto out;
  129. @@ -711,7 +709,7 @@ int nfs41_create(
  130.  
  131.      if (file->name.name) {
  132.          if (is_stream_path_fh(file)) {
  133. -            status = parse_win32stream_name(file->name.name,
  134. +            status = parse_win32stream_name(file->name.name, false,
  135.                  &is_stream, base_buf, stream_buf);
  136.              if (status)
  137.                  goto out;
  138. @@ -1436,7 +1434,7 @@ int nfs41_remove(
  139.  
  140.      if (target->name) {
  141.          if (is_stream_component(target)) {
  142. -            status = parse_win32stream_name(target->name,
  143. +            status = parse_win32stream_name(target->name, false,
  144.                  &is_stream, base_buf, stream_buf);
  145.              if (status)
  146.                  goto out;
  147. @@ -1527,8 +1525,8 @@ int nfs41_rename(
  148.  {
  149.      int status;
  150.      nfs41_compound compound;
  151. -    nfs_argop4 argops[8];
  152. -    nfs_resop4 resops[8];
  153. +    nfs_argop4 argops[16];
  154. +    nfs_resop4 resops[16];
  155.      nfs41_sequence_args sequence_args;
  156.      nfs41_sequence_res sequence_res;
  157.      nfs41_putfh_args src_putfh_args;
  158. @@ -1542,16 +1540,74 @@ int nfs41_rename(
  159.      nfs41_getattr_res src_getattr_res NDSH(= { 0 }), dst_getattr_res NDSH(= { 0 });
  160.      nfs41_file_info src_info, dst_info;
  161.      bitmap4 attr_request;
  162. -    nfs41_restorefh_res restorefh_res;
  163. +
  164. +    DPRINTF(1, ("--> nfs41_rename("
  165. +        "src_dir=(path='%.*s' name='%.*s'), src_name='%.*s', "
  166. +        "dst_dir=(path='%.*s' name='%.*s'), dst_name='%.*s')\n",
  167. +        (int)src_dir->path->len, src_dir->path->path,
  168. +        (int)src_dir->name.len,  src_dir->name.name,
  169. +        (int)src_name->len,      src_name->name,
  170. +        (int)dst_dir->path->len, dst_dir->path->path,
  171. +        (int)dst_dir->name.len,  dst_dir->name.name,
  172. +        (int)dst_name->len,      dst_name->name));
  173.  
  174.  #ifdef NFS41_WINSTREAMS_SUPPORT
  175. +    char src_base_buf[NFS41_MAX_PATH_LEN+1];
  176. +    char src_stream_buf[NFS41_MAX_COMPONENT_LEN+1];
  177. +    char dst_base_buf[NFS41_MAX_PATH_LEN+1];
  178. +    char dst_stream_buf[NFS41_MAX_COMPONENT_LEN+1];
  179. +    bool src_is_stream = false;
  180. +    bool dst_is_stream = false;
  181. +    nfs41_component src_base_comp = {0};
  182. +    nfs41_component src_stream_comp = {0};
  183. +    nfs41_lookup_args src_lookup_args;
  184. +    nfs41_lookup_res src_lookup_res;
  185. +    nfs41_openattr_args src_openattr_args;
  186. +    nfs41_openattr_res src_openattr_res;
  187. +    nfs41_component dst_base_comp = {0};
  188. +    nfs41_component dst_stream_comp = {0};
  189. +    nfs41_lookup_args dst_lookup_args;
  190. +    nfs41_lookup_res dst_lookup_res;
  191. +    nfs41_openattr_args dst_openattr_args;
  192. +    nfs41_openattr_res dst_openattr_res;
  193. +
  194.      if (src_name->name) {
  195. -        EASSERT_MSG(is_stream_component(src_name) == false,
  196. -            ("nfs41_rename: Streams not implemented yet\n"));
  197. +        if (is_stream_component(src_name)) {
  198. +            status = parse_win32stream_name(src_name->name, false,
  199. +                &src_is_stream, src_base_buf, src_stream_buf);
  200. +            if (status)
  201. +                goto out;
  202. +
  203. +            if (src_is_stream) {
  204. +                src_base_comp.name = src_base_buf;
  205. +                src_base_comp.len = (unsigned short)strlen(src_base_buf);
  206. +                src_stream_comp.name = src_stream_buf;
  207. +                src_stream_comp.len = (unsigned short)strlen(src_stream_buf);
  208. +            }
  209. +        }
  210.      }
  211. +
  212.      if (dst_name->name) {
  213. -        EASSERT_MSG(is_stream_component(dst_name) == false,
  214. -            ("nfs41_rename: Streams not implemented yet\n"));
  215. +        if (is_stream_component(dst_name)) {
  216. +            status = parse_win32stream_name(dst_name->name, false,
  217. +                &dst_is_stream, dst_base_buf, dst_stream_buf);
  218. +            if (status)
  219. +                goto out;
  220. +
  221. +            if (dst_is_stream) {
  222. +                dst_base_comp.name = dst_base_buf;
  223. +                dst_base_comp.len = (unsigned short)strlen(dst_base_buf);
  224. +                dst_stream_comp.name = dst_stream_buf;
  225. +                dst_stream_comp.len = (unsigned short)strlen(dst_stream_buf);
  226. +            }
  227. +        }
  228. +    }
  229. +
  230. +    if (src_is_stream && dst_is_stream) {
  231. +        if (dst_dir->name.len == 0) {
  232. +            DPRINTF(1, ("nfs41_rename: dst_dir = src_dir\n"));
  233. +            dst_dir = src_dir;
  234. +        }
  235.      }
  236.  #endif /* NFS41_WINSTREAMS_SUPPORT */
  237.  
  238. @@ -1567,22 +1623,76 @@ int nfs41_rename(
  239.      src_putfh_args.file = src_dir;
  240.      src_putfh_args.in_recovery = 0;
  241.  
  242. +#ifdef NFS41_WINSTREAMS_SUPPORT
  243. +    if (src_is_stream && (src_stream_comp.len > 0)) {
  244. +        compound_add_op(&compound, OP_LOOKUP, &src_lookup_args, &src_lookup_res);
  245. +        src_lookup_args.name = &src_base_comp;
  246. +        compound_add_op(&compound, OP_OPENATTR, &src_openattr_args, &src_openattr_res);
  247. +        /* Do not create the src named attr dir */
  248. +        src_openattr_args.createdir = FALSE;
  249. +    }
  250. +#endif /* NFS41_WINSTREAMS_SUPPORT */
  251. +
  252.      compound_add_op(&compound, OP_SAVEFH, NULL, &savefh_res);
  253.  
  254.      compound_add_op(&compound, OP_PUTFH, &dst_putfh_args, &dst_putfh_res);
  255.      dst_putfh_args.file = dst_dir;
  256.      dst_putfh_args.in_recovery = 0;
  257.  
  258. +#ifdef NFS41_WINSTREAMS_SUPPORT
  259. +    if (dst_is_stream && (dst_stream_comp.len > 0)) {
  260. +        compound_add_op(&compound, OP_LOOKUP, &dst_lookup_args, &dst_lookup_res);
  261. +        dst_lookup_args.name = &dst_base_comp;
  262. +        compound_add_op(&compound, OP_OPENATTR, &dst_openattr_args, &dst_openattr_res);
  263. +        /*
  264. +         * Create the dst named attr dir.
  265. +         * (Technically the NFS spec does not allow renaming between different
  266. +         * src and dst named attr dirs, but we do this for correctness reasons)
  267. +         */
  268. +        dst_openattr_args.createdir = TRUE;
  269. +    }
  270. +#endif /* NFS41_WINSTREAMS_SUPPORT */
  271. +
  272.      compound_add_op(&compound, OP_RENAME, &rename_args, &rename_res);
  273. -    rename_args.oldname = src_name;
  274. -    rename_args.newname = dst_name;
  275. +
  276. +#ifdef NFS41_WINSTREAMS_SUPPORT
  277. +    if (src_is_stream) {
  278. +        if (src_stream_comp.len > 0)
  279. +            rename_args.oldname = &src_stream_comp;
  280. +        else
  281. +            rename_args.oldname = &src_base_comp;
  282. +    }
  283. +    else
  284. +#endif /* NFS41_WINSTREAMS_SUPPORT */
  285. +    {
  286. +        rename_args.oldname = src_name;
  287. +    }
  288. +
  289. +#ifdef NFS41_WINSTREAMS_SUPPORT
  290. +    if (dst_is_stream) {
  291. +        if (dst_stream_comp.len > 0)
  292. +            rename_args.newname = &dst_stream_comp;
  293. +        else
  294. +            rename_args.newname = &dst_base_comp;
  295. +    }
  296. +    else
  297. +#endif /* NFS41_WINSTREAMS_SUPPORT */
  298. +    {
  299. +        rename_args.newname = dst_name;
  300. +    }
  301. +
  302. +    compound_add_op(&compound, OP_PUTFH, &dst_putfh_args, &dst_putfh_res);
  303. +    dst_putfh_args.file = dst_dir;
  304. +    dst_putfh_args.in_recovery = 0;
  305.  
  306.      compound_add_op(&compound, OP_GETATTR, &getattr_args, &dst_getattr_res);
  307.      getattr_args.attr_request = &attr_request;
  308.      dst_getattr_res.obj_attributes.attr_vals_len = NFS4_OPAQUE_LIMIT_ATTR;
  309.      dst_getattr_res.info = &dst_info;
  310.  
  311. -    compound_add_op(&compound, OP_RESTOREFH, NULL, &restorefh_res);
  312. +    compound_add_op(&compound, OP_PUTFH, &src_putfh_args, &src_putfh_res);
  313. +    src_putfh_args.file = src_dir;
  314. +    src_putfh_args.in_recovery = 0;
  315.  
  316.      compound_add_op(&compound, OP_GETATTR, &getattr_args, &src_getattr_res);
  317.      src_getattr_res.obj_attributes.attr_vals_len = NFS4_OPAQUE_LIMIT_ATTR;
  318. @@ -1630,6 +1740,8 @@ int nfs41_rename(
  319.          ReleaseSRWLockShared(&dst_dir->path->lock);
  320.      }
  321.  out:
  322. +    DPRINTF(1, ("<-- nfs41_rename(), status=%d\n", (int)status));
  323. +
  324.      return status;
  325.  }
  326.  
  327. diff --git a/daemon/setattr.c b/daemon/setattr.c
  328. index 20a81e3..81737a7 100644
  329. --- a/daemon/setattr.c
  330. +++ b/daemon/setattr.c
  331. @@ -1,6 +1,6 @@
  332.  /* NFSv4.1 client for Windows
  333.   * Copyright (C) 2012 The Regents of the University of Michigan
  334. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  335. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  336.   *
  337.   * Olga Kornievskaia <aglo@umich.edu>
  338.   * Casey Bodley <cbodley@umich.edu>
  339. @@ -489,6 +489,51 @@ static int handle_nfs41_rename(void *daemon_context, setattr_upcall_args *args)
  340.          status = ERROR_INVALID_PARAMETER;
  341.          goto out;
  342.      }
  343. +
  344. +#ifdef NFS41_WINSTREAMS_SUPPORT
  345. +    /*
  346. +     * Handle NTFS-style renaming of a Win32 named stream to another stream
  347. +     * name of the same base filename, e.g.
  348. +     * $ renamestream 'F:\namedstreamtest\file1:stream9' ':stream9_rename1' #
  349. +     * (this is the only known way for NTFS on Win10 to rename a stream)
  350. +     *
  351. +     * |rename->FileName| will contain a "relative stream name", i.e. starting
  352. +     * with ":<streamname>", and we have to add the base filename from the src
  353. +     * filename.
  354. +     */
  355. +    if ((dst_path.len > 1) && (dst_path.path[0] == ':')) {
  356. +        char *s;
  357. +        s = strchr(src_name->name, ':');
  358. +        if (s == NULL) {
  359. +            eprintf("handle_nfs41_rename: dst is stream, src is '%s'\n",
  360. +                src_name->name);
  361. +            status = ERROR_INVALID_PARAMETER;
  362. +            goto out;
  363. +        }
  364. +
  365. +        size_t len = s - src_name->name;
  366. +
  367. +        if ((dst_path.len+len+1) >= NFS41_MAX_COMPONENT_LEN) {
  368. +            eprintf("handle_nfs41_rename: "
  369. +                "(dst_path.len(=%d)+len=(=%d)+1) >= NFS41_MAX_COMPONENT_LEN, "
  370. +                "src is '%s'\n",
  371. +                (int)dst_path.len,
  372. +                (int)len,
  373. +                src_name->name);
  374. +            status = ERROR_INVALID_PARAMETER;
  375. +            goto out;
  376. +        }
  377. +
  378. +        (void)memmove(&dst_path.path[len], &dst_path.path[0], dst_path.len+1);
  379. +        (void)memcpy(&dst_path.path[0], src_name->name, len);
  380. +        dst_path.len += (unsigned short)len;
  381. +        DPRINTF(1,
  382. +            ("handle_nfs41_rename: "
  383. +            "streams: src_name->name='%s' dst_path.name='%s'\n",
  384. +            src_name->name, dst_path.path));
  385. +    }
  386. +#endif /* NFS41_WINSTREAMS_SUPPORT */
  387. +
  388.      path_fh_init(&dst_dir, &dst_path);
  389.  
  390.      /* the destination path is absolute, so start from the root session */
  391. diff --git a/daemon/winstreams.c b/daemon/winstreams.c
  392. index 8e3f2f8..5f3e5af 100644
  393. --- a/daemon/winstreams.c
  394. +++ b/daemon/winstreams.c
  395. @@ -91,9 +91,11 @@ int parse_stream_filename_streamname_streamtype(
  396.          return NO_ERROR;
  397.      }
  398.  
  399. -    /* First colon exists: filename before ':' must be non-empty */
  400. -    if (c1 == base)
  401. -        return ERROR_INVALID_NAME;
  402. +    /*
  403. +     * First colon exists: filename before ':' can be empty in case if a
  404. +     * rename destination. |filename| should then be obtained from the
  405. +     * rename src filename
  406. +     */
  407.  
  408.      /*
  409.       * One colon case
  410. @@ -143,6 +145,7 @@ int parse_stream_filename_streamname_streamtype(
  411.  
  412.  int parse_win32stream_name(
  413.      IN const char *restrict path,
  414. +    IN bool allow_empty_base_name,
  415.      OUT bool *restrict is_stream,
  416.      OUT char *restrict base_name,
  417.      OUT char *restrict stream_name)
  418. @@ -163,6 +166,11 @@ int parse_win32stream_name(
  419.          return status;
  420.      }
  421.  
  422. +    if ((allow_empty_base_name == false) &&
  423. +        (filenamebuff[0] == '\0')) {
  424. +        return ERROR_INVALID_NAME;
  425. +    }
  426. +
  427.      DPRINTF(WINSTRLVL,
  428.          ("parse_win32stream_name: "
  429.          "parse_stream_filename_streamname_streamtype(path='%s') returned "
  430. diff --git a/daemon/winstreams.h b/daemon/winstreams.h
  431. index 3f9a117..5500c3a 100644
  432. --- a/daemon/winstreams.h
  433. +++ b/daemon/winstreams.h
  434. @@ -59,6 +59,7 @@ bool is_stream_component(const nfs41_component *restrict comp)
  435.  
  436.  int parse_win32stream_name(
  437.      IN const char *restrict path,
  438. +    IN bool allow_empty_base_name,
  439.      OUT bool *restrict is_stream,
  440.      OUT char *restrict base_name,
  441.      OUT char *restrict stream_name);
  442. diff --git a/tests/manual_testing.txt b/tests/manual_testing.txt
  443. index 7e44ca7..691d627 100644
  444. --- a/tests/manual_testing.txt
  445. +++ b/tests/manual_testing.txt
  446. @@ -1,5 +1,5 @@
  447.  #
  448. -# ms-nfs41-client manual testing sequence, 2026-01-15
  449. +# ms-nfs41-client manual testing sequence, 2026-01-17
  450.  #
  451.  # Draft version, needs to be turned into automated tests
  452.  # if possible
  453. @@ -235,6 +235,7 @@ rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:files
  454.  powershell -Command 'Get-Item -LiteralPath file1 -Stream * | Select *'
  455.  
  456.  # FIXME: tests for stream removal, enumeration and sparse data
  457. +# FIXME: Add tests for stream NTFS-style renaming (e.g. FileRenameInformation with "relative stream name", e.g. ':mystrname1:$DATA')
  458.  
  459.  
  460.  #
  461. --
  462. 2.51.0
  463.  
  464. From c8ce1e9d81476bd2d9f5718157a1f23b95d9a8f4 Mon Sep 17 00:00:00 2001
  465. From: Roland Mainz <roland.mainz@nrubsig.org>
  466. Date: Sat, 17 Jan 2026 16:36:32 +0100
  467. Subject: [PATCH 4/6] tests: manual_testing.txt: Fix typos in Win32 named
  468.  stream tests
  469.  
  470. manual_testing.txt: Fix typos in Win32 named stream tests.
  471.  
  472. Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
  473. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  474. ---
  475. tests/manual_testing.txt | 4 ++--
  476.  1 file changed, 2 insertions(+), 2 deletions(-)
  477.  
  478. diff --git a/tests/manual_testing.txt b/tests/manual_testing.txt
  479. index 691d627..4cf0bb2 100644
  480. --- a/tests/manual_testing.txt
  481. +++ b/tests/manual_testing.txt
  482. @@ -227,10 +227,10 @@ rm -Rf dir1 && mkdir dir1 && cmd /c 'echo dir_line1 >>dir1:dirstr1 & echo dir_li
  483.  
  484.  # these five tests should print $'file1data\nfile1_line1\nfile1_line2\n'
  485.  rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1 & echo file1_line2 >>file1:filestr1:$DATA & C:\cygwin64\bin\cat.exe <file1 & C:\cygwin64\bin\cat.exe <file1:filestr1'
  486. -rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1 & echo file1_line2 >>file1:filestr1:$DATA && type file1' && powershell -Command 'Get-Content -Path .\file1 -Stream filestr1'# this should list stream "filestr1"
  487. +rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1 & echo file1_line2 >>file1:filestr1:$DATA && type file1' && powershell -Command 'Get-Content -Path .\file1 -Stream filestr1'
  488.  rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1 & type file1' && powershell -Command 'Add-Content .\file1 -Stream filestr1 -Value "file1_line2" ; Get-Content -Path .\file1 -Stream filestr1'
  489.  rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1 & type file1' && powershell -Command 'Add-Content .\file1:filestr1 -Value "file1_line2" ; Get-Content -Path .\file1 -Stream filestr1'
  490. -rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1' && powershell -Command 'Add-Content .\file1:filestr1 -Value "file1_line2" ; Get-Content -Path .\file1 -Stream ":DATA" ; Get-Content -Path .\file1 -Stream filestr1'
  491. +rm -f file1 && echo "file1data" >file1 && cmd /c 'echo file1_line1 >>file1:filestr1' && powershell -Command 'Add-Content .\file1:filestr1 -Value "file1_line2" ; Get-Content -Path .\file1 -Stream "$DATA" ; Get-Content -Path .\file1 -Stream filestr1'
  492.  # list all streams for file "file1" (should be "filestr1")
  493.  powershell -Command 'Get-Item -LiteralPath file1 -Stream * | Select *'
  494.  
  495. --
  496. 2.51.0
  497.  
  498. From e464e62065fdf592710057e143892e71a803916a Mon Sep 17 00:00:00 2001
  499. From: Roland Mainz <roland.mainz@nrubsig.org>
  500. Date: Sat, 17 Jan 2026 18:32:50 +0100
  501. Subject: [PATCH 5/6] sys: Add more upcall buffer size debug output in case the
  502.  buffer is too small
  503.  
  504. Add more upcall buffer size debug output in case the buffer is too small.
  505.  
  506. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  507. ---
  508. sys/nfs41sys_acl.c       |  8 +++++++-
  509.  sys/nfs41sys_dir.c       |  5 ++++-
  510.  sys/nfs41sys_driver.c    |  8 +++++++-
  511.  sys/nfs41sys_ea.c        |  8 +++++++-
  512.  sys/nfs41sys_fileinfo.c  |  6 ++++++
  513.  sys/nfs41sys_fsctl.c     | 11 ++++++++++-
  514.  sys/nfs41sys_lock.c      |  8 +++++++-
  515.  sys/nfs41sys_mount.c     |  5 ++++-
  516.  sys/nfs41sys_openclose.c |  6 ++++++
  517.  sys/nfs41sys_readwrite.c |  5 ++++-
  518.  sys/nfs41sys_symlink.c   |  5 ++++-
  519.  sys/nfs41sys_volinfo.c   |  5 ++++-
  520.  12 files changed, 70 insertions(+), 10 deletions(-)
  521.  
  522. diff --git a/sys/nfs41sys_acl.c b/sys/nfs41sys_acl.c
  523. index e9b0a6e..52eb845 100644
  524. --- a/sys/nfs41sys_acl.c
  525. +++ b/sys/nfs41sys_acl.c
  526. @@ -1,6 +1,6 @@
  527.  /* NFSv4.1 client for Windows
  528.   * Copyright (C) 2012 The Regents of the University of Michigan
  529. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  530. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  531.   *
  532.   * Olga Kornievskaia <aglo@umich.edu>
  533.   * Casey Bodley <cbodley@umich.edu>
  534. @@ -87,6 +87,9 @@ NTSTATUS marshal_nfs41_getacl(
  535.  
  536.      header_len = *len + sizeof(SECURITY_INFORMATION);
  537.      if (header_len > buf_len) {
  538. +        DbgP("marshal_nfs41_getacl: "
  539. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  540. +            (long)header_len, (long)buf_len);
  541.          status = STATUS_INSUFFICIENT_RESOURCES;
  542.          goto out;
  543.      }
  544. @@ -129,6 +132,9 @@ NTSTATUS marshal_nfs41_setacl(
  545.      header_len = *len + sizeof(SECURITY_INFORMATION) +
  546.          sizeof(ULONG) + entry->u.Acl.buf_len;
  547.      if (header_len > buf_len) {
  548. +        DbgP("marshal_nfs41_setacl: "
  549. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  550. +            (long)header_len, (long)buf_len);
  551.          status = STATUS_INSUFFICIENT_RESOURCES;
  552.          goto out;
  553.      }
  554. diff --git a/sys/nfs41sys_dir.c b/sys/nfs41sys_dir.c
  555. index 77c2aca..e3c0925 100644
  556. --- a/sys/nfs41sys_dir.c
  557. +++ b/sys/nfs41sys_dir.c
  558. @@ -1,6 +1,6 @@
  559.  /* NFSv4.1 client for Windows
  560.   * Copyright (C) 2012 The Regents of the University of Michigan
  561. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  562. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  563.   *
  564.   * Olga Kornievskaia <aglo@umich.edu>
  565.   * Casey Bodley <cbodley@umich.edu>
  566. @@ -86,6 +86,9 @@ NTSTATUS marshal_nfs41_dirquery(
  567.      header_len = *len + 2 * sizeof(ULONG) + sizeof(HANDLE) +
  568.          length_as_utf8(entry->u.QueryFile.filter) + 3 * sizeof(BOOLEAN);
  569.      if (header_len > buf_len) {
  570. +        DbgP("marshal_nfs41_dirquery: "
  571. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  572. +            (long)header_len, (long)buf_len);
  573.          status = STATUS_INSUFFICIENT_RESOURCES;
  574.          goto out;
  575.      }
  576. diff --git a/sys/nfs41sys_driver.c b/sys/nfs41sys_driver.c
  577. index 6e2c583..7c48137 100644
  578. --- a/sys/nfs41sys_driver.c
  579. +++ b/sys/nfs41sys_driver.c
  580. @@ -1,6 +1,6 @@
  581.  /* NFSv4.1 client for Windows
  582.   * Copyright (C) 2012 The Regents of the University of Michigan
  583. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  584. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  585.   *
  586.   * Olga Kornievskaia <aglo@umich.edu>
  587.   * Casey Bodley <cbodley@umich.edu>
  588. @@ -275,6 +275,9 @@ NTSTATUS marshal_nfs41_header(
  589.      header_len = sizeof(entry->version) + sizeof(entry->xid) +
  590.          sizeof(entry->opcode) + 2 * sizeof(HANDLE);
  591.      if (header_len > buf_len) {
  592. +        DbgP("marshal_nfs41_header: "
  593. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  594. +            (long)header_len, (long)buf_len);
  595.          status = STATUS_INSUFFICIENT_RESOURCES;
  596.          goto out;
  597.      }
  598. @@ -375,6 +378,9 @@ NTSTATUS marshal_nfs41_set_daemon_debuglevel(
  599.  
  600.      header_len = *len + sizeof(LONG);
  601.      if (header_len > buf_len) {
  602. +        DbgP("marshal_nfs41_set_daemon_debuglevel: "
  603. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  604. +            (long)header_len, (long)buf_len);
  605.          status = STATUS_INSUFFICIENT_RESOURCES;
  606.          goto out;
  607.      }
  608. diff --git a/sys/nfs41sys_ea.c b/sys/nfs41sys_ea.c
  609. index 8499cbc..0d821f8 100644
  610. --- a/sys/nfs41sys_ea.c
  611. +++ b/sys/nfs41sys_ea.c
  612. @@ -1,6 +1,6 @@
  613.  /* NFSv4.1 client for Windows
  614.   * Copyright (C) 2012 The Regents of the University of Michigan
  615. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  616. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  617.   *
  618.   * Olga Kornievskaia <aglo@umich.edu>
  619.   * Casey Bodley <cbodley@umich.edu>
  620. @@ -86,6 +86,9 @@ NTSTATUS marshal_nfs41_easet(
  621.      header_len = *len + length_as_utf8(entry->filename) +
  622.          sizeof(ULONG) + entry->u.SetEa.buf_len  + sizeof(DWORD);
  623.      if (header_len > buf_len) {
  624. +        DbgP("marshal_nfs41_easet: "
  625. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  626. +            (long)header_len, (long)buf_len);
  627.          status = STATUS_INSUFFICIENT_RESOURCES;
  628.          goto out;
  629.      }
  630. @@ -136,6 +139,9 @@ NTSTATUS marshal_nfs41_eaget(
  631.          3 * sizeof(ULONG) + entry->u.QueryEa.EaListLength + 2 * sizeof(BOOLEAN);
  632.  
  633.      if (header_len > buf_len) {
  634. +        DbgP("marshal_nfs41_eaget: "
  635. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  636. +            (long)header_len, (long)buf_len);
  637.          status = STATUS_INSUFFICIENT_RESOURCES;
  638.          goto out;
  639.      }
  640. diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
  641. index ded8df4..6de73b5 100644
  642. --- a/sys/nfs41sys_fileinfo.c
  643. +++ b/sys/nfs41sys_fileinfo.c
  644. @@ -86,6 +86,9 @@ NTSTATUS marshal_nfs41_filequery(
  645.  
  646.      header_len = *len + 2 * sizeof(ULONG);
  647.      if (header_len > buf_len) {
  648. +        DbgP("marshal_nfs41_filequery: "
  649. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  650. +            (long)header_len, (long)buf_len);
  651.          status = STATUS_INSUFFICIENT_RESOURCES;
  652.          goto out;
  653.      }
  654. @@ -127,6 +130,9 @@ NTSTATUS marshal_nfs41_fileset(
  655.      header_len = *len + length_as_utf8(entry->filename) +
  656.          2 * sizeof(ULONG) + entry->u.SetFile.buf_len;
  657.      if (header_len > buf_len) {
  658. +        DbgP("marshal_nfs41_fileset: "
  659. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  660. +            (long)header_len, (long)buf_len);
  661.          status = STATUS_INSUFFICIENT_RESOURCES;
  662.          goto out;
  663.      }
  664. diff --git a/sys/nfs41sys_fsctl.c b/sys/nfs41sys_fsctl.c
  665. index 204631e..27c0946 100644
  666. --- a/sys/nfs41sys_fsctl.c
  667. +++ b/sys/nfs41sys_fsctl.c
  668. @@ -1,6 +1,6 @@
  669.  /* NFSv4.1 client for Windows
  670.   * Copyright (C) 2012 The Regents of the University of Michigan
  671. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  672. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  673.   *
  674.   * Olga Kornievskaia <aglo@umich.edu>
  675.   * Casey Bodley <cbodley@umich.edu>
  676. @@ -273,6 +273,9 @@ NTSTATUS marshal_nfs41_queryallocatedranges(
  677.          sizeof(ULONG) +
  678.          sizeof(HANDLE);
  679.      if (header_len > buf_len) {
  680. +        DbgP("marshal_nfs41_queryallocatedranges: "
  681. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  682. +            (long)header_len, (long)buf_len);
  683.          status = STATUS_INSUFFICIENT_RESOURCES;
  684.          goto out;
  685.      }
  686. @@ -568,6 +571,9 @@ NTSTATUS marshal_nfs41_setzerodata(
  687.  
  688.      header_len = *len + sizeof(FILE_ZERO_DATA_INFORMATION);
  689.      if (header_len > buf_len) {
  690. +        DbgP("marshal_nfs41_setzerodata: "
  691. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  692. +            (long)header_len, (long)buf_len);
  693.          status = STATUS_INSUFFICIENT_RESOURCES;
  694.          goto out;
  695.      }
  696. @@ -894,6 +900,9 @@ NTSTATUS marshal_nfs41_duplicatedata(
  697.          sizeof(void *) +
  698.          3*sizeof(LONGLONG);
  699.      if (header_len > buf_len) {
  700. +        DbgP("marshal_nfs41_duplicatedata: "
  701. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  702. +            (long)header_len, (long)buf_len);
  703.          status = STATUS_INSUFFICIENT_RESOURCES;
  704.          goto out;
  705.      }
  706. diff --git a/sys/nfs41sys_lock.c b/sys/nfs41sys_lock.c
  707. index 85d6c32..be7bcb5 100644
  708. --- a/sys/nfs41sys_lock.c
  709. +++ b/sys/nfs41sys_lock.c
  710. @@ -1,6 +1,6 @@
  711.  /* NFSv4.1 client for Windows
  712.   * Copyright (C) 2012 The Regents of the University of Michigan
  713. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  714. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  715.   *
  716.   * Olga Kornievskaia <aglo@umich.edu>
  717.   * Casey Bodley <cbodley@umich.edu>
  718. @@ -87,6 +87,9 @@ NTSTATUS marshal_nfs41_lock(
  719.  
  720.      header_len = *len + 2 * sizeof(LONGLONG) + 2 * sizeof(BOOLEAN);
  721.      if (header_len > buf_len) {
  722. +        DbgP("marshal_nfs41_lock: "
  723. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  724. +            (long)header_len, (long)buf_len);
  725.          status = STATUS_INSUFFICIENT_RESOURCES;
  726.          goto out;
  727.      }
  728. @@ -138,6 +141,9 @@ NTSTATUS marshal_nfs41_unlock(
  729.      header_len = *len + sizeof(ULONG) +
  730.          ((size_t)entry->u.Unlock.count * 2) * sizeof(LONGLONG);
  731.      if (header_len > buf_len) {
  732. +        DbgP("marshal_nfs41_unlock: "
  733. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  734. +            (long)header_len, (long)buf_len);
  735.          status = STATUS_INSUFFICIENT_RESOURCES;
  736.          goto out;
  737.      }
  738. diff --git a/sys/nfs41sys_mount.c b/sys/nfs41sys_mount.c
  739. index c25a132..0fd84c5 100644
  740. --- a/sys/nfs41sys_mount.c
  741. +++ b/sys/nfs41sys_mount.c
  742. @@ -1,6 +1,6 @@
  743.  /* NFSv4.1 client for Windows
  744.   * Copyright (C) 2012 The Regents of the University of Michigan
  745. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  746. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  747.   *
  748.   * Olga Kornievskaia <aglo@umich.edu>
  749.   * Casey Bodley <cbodley@umich.edu>
  750. @@ -115,6 +115,9 @@ NTSTATUS marshal_nfs41_mount(
  751.  #endif /* NFS41_DRIVER_HACK_FORCE_FILENAME_CASE_MOUNTOPTIONS */
  752.          ;
  753.      if (header_len > buf_len) {
  754. +        DbgP("marshal_nfs41_mount: "
  755. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  756. +            (long)header_len, (long)buf_len);
  757.          status = STATUS_INSUFFICIENT_RESOURCES;
  758.          goto out;
  759.      }
  760. diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
  761. index f1db990..dba6017 100644
  762. --- a/sys/nfs41sys_openclose.c
  763. +++ b/sys/nfs41sys_openclose.c
  764. @@ -133,6 +133,9 @@ NTSTATUS marshal_nfs41_open(
  765.  #endif /* NFS41_DRIVER_ALLOW_CREATEFILE_ACLS */
  766.          length_as_utf8(&entry->u.Open.symlink);
  767.      if (header_len > buf_len) {
  768. +        DbgP("marshal_nfs41_open: "
  769. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  770. +            (long)header_len, (long)buf_len);
  771.          status = STATUS_INSUFFICIENT_RESOURCES;
  772.          goto out;
  773.      }
  774. @@ -236,6 +239,9 @@ NTSTATUS marshal_nfs41_close(
  775.              sizeof(BOOLEAN);
  776.  
  777.      if (header_len > buf_len) {
  778. +        DbgP("marshal_nfs41_close: "
  779. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  780. +            (long)header_len, (long)buf_len);
  781.          status = STATUS_INSUFFICIENT_RESOURCES;
  782.          goto out;
  783.      }
  784. diff --git a/sys/nfs41sys_readwrite.c b/sys/nfs41sys_readwrite.c
  785. index f8b2090..41b40b9 100644
  786. --- a/sys/nfs41sys_readwrite.c
  787. +++ b/sys/nfs41sys_readwrite.c
  788. @@ -1,6 +1,6 @@
  789.  /* NFSv4.1 client for Windows
  790.   * Copyright (C) 2012 The Regents of the University of Michigan
  791. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  792. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  793.   *
  794.   * Olga Kornievskaia <aglo@umich.edu>
  795.   * Casey Bodley <cbodley@umich.edu>
  796. @@ -101,6 +101,9 @@ NTSTATUS marshal_nfs41_rw(
  797.      header_len = *len + sizeof(entry->u.ReadWrite.buf_len) +
  798.          sizeof(entry->u.ReadWrite.offset) + sizeof(HANDLE);
  799.      if (header_len > buf_len) {
  800. +        DbgP("marshal_nfs41_rw: "
  801. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  802. +            (long)header_len, (long)buf_len);
  803.          status = STATUS_INSUFFICIENT_RESOURCES;
  804.          goto out;
  805.      }
  806. diff --git a/sys/nfs41sys_symlink.c b/sys/nfs41sys_symlink.c
  807. index 5ed5cfe..d8f9c3d 100644
  808. --- a/sys/nfs41sys_symlink.c
  809. +++ b/sys/nfs41sys_symlink.c
  810. @@ -1,6 +1,6 @@
  811.  /* NFSv4.1 client for Windows
  812.   * Copyright (C) 2012 The Regents of the University of Michigan
  813. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  814. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  815.   *
  816.   * Olga Kornievskaia <aglo@umich.edu>
  817.   * Casey Bodley <cbodley@umich.edu>
  818. @@ -91,6 +91,9 @@ NTSTATUS marshal_nfs41_symlink(
  819.      if (entry->opcode == NFS41_SYSOP_SYMLINK_SET)
  820.          header_len += length_as_utf8(entry->u.Symlink.target);
  821.      if (header_len > buf_len) {
  822. +        DbgP("marshal_nfs41_symlink: "
  823. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  824. +            (long)header_len, (long)buf_len);
  825.          status = STATUS_INSUFFICIENT_RESOURCES;
  826.          goto out;
  827.      }
  828. diff --git a/sys/nfs41sys_volinfo.c b/sys/nfs41sys_volinfo.c
  829. index d2484b6..ed4444c 100644
  830. --- a/sys/nfs41sys_volinfo.c
  831. +++ b/sys/nfs41sys_volinfo.c
  832. @@ -1,6 +1,6 @@
  833.  /* NFSv4.1 client for Windows
  834.   * Copyright (C) 2012 The Regents of the University of Michigan
  835. - * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  836. + * Copyright (C) 2023-2026 Roland Mainz <roland.mainz@nrubsig.org>
  837.   *
  838.   * Olga Kornievskaia <aglo@umich.edu>
  839.   * Casey Bodley <cbodley@umich.edu>
  840. @@ -86,6 +86,9 @@ NTSTATUS marshal_nfs41_volume(
  841.  
  842.      header_len = *len + sizeof(FS_INFORMATION_CLASS);
  843.      if (header_len > buf_len) {
  844. +        DbgP("marshal_nfs41_volume: "
  845. +            "upcall buffer too small: header_len(=%ld) > buf_len(=%ld)\n",
  846. +            (long)header_len, (long)buf_len);
  847.          status = STATUS_INSUFFICIENT_RESOURCES;
  848.          goto out;
  849.      }
  850. --
  851. 2.51.0
  852.  
  853. From 01180ec31a8eb873e594e6ed3f39567b373abe7a Mon Sep 17 00:00:00 2001
  854. From: Roland Mainz <roland.mainz@nrubsig.org>
  855. Date: Sat, 17 Jan 2026 18:48:38 +0100
  856. Subject: [PATCH 6/6] daemon: Add "Windows features" section to superblock
  857.  properties logging
  858.  
  859. Add "Windows features" section to superblock properties logging.
  860.  
  861. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  862. ---
  863. daemon/nfs41_superblock.c | 13 +++++++++++++
  864.  1 file changed, 13 insertions(+)
  865.  
  866. diff --git a/daemon/nfs41_superblock.c b/daemon/nfs41_superblock.c
  867. index 4095ca0..fb84865 100644
  868. --- a/daemon/nfs41_superblock.c
  869. +++ b/daemon/nfs41_superblock.c
  870. @@ -225,6 +225,19 @@ static int get_superblock_attrs(
  871.              superblock->fsid.major, superblock->fsid.minor);
  872.      }
  873.  
  874. +    /* Windows features */
  875. +    is = infobuff;
  876. +    *is = '\0';
  877. +    if (superblock->nfs_namedattr_support) {
  878. +        is = stpcpy(is, "Win32 named streams");
  879. +        *is++ = ',';
  880. +        is = stpcpy(is, "Win32 extended attributes");
  881. +    }
  882. +    logprintf("get_superblock_attrs(fsid=(%llu,%llu)): "
  883. +        "Supported Windows features: { %s }\n",
  884. +        superblock->fsid.major, superblock->fsid.minor,
  885. +        infobuff);
  886. +
  887.      /* Windows/DOS attributes */
  888.      is = infobuff;
  889.      *is = '\0';
  890. --
  891. 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