pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Patches for |get_token_*name()| SID cache, disable broken 8dot3 shortname generation, performance optimisations, misc, 2024-04-29
Posted by Anonymous on Mon 29th Apr 2024 15:39
raw | new post

  1. From ebf00739d84a205a0d5567258cbddac0f6a8e0a5 Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Mon, 29 Apr 2024 12:44:54 +0200
  4. Subject: [PATCH 1/7] daemon: |dprintf_out()| should protect itself from
  5.  recursion
  6.  
  7. |dprintf_out()| should protect itself from recursion, in case
  8. we call |DPRINTF()| from functions which are used by |dprintf_out()|
  9. (e.g. |get_token_user_name(), |get_token_primarygroup_name()| etc.).
  10.  
  11. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  12. ---
  13. daemon/daemon_debug.c | 20 ++++++++++++++++----
  14.  1 file changed, 16 insertions(+), 4 deletions(-)
  15.  
  16. diff --git a/daemon/daemon_debug.c b/daemon/daemon_debug.c
  17. index ffc6ee2..183a398 100644
  18. --- a/daemon/daemon_debug.c
  19. +++ b/daemon/daemon_debug.c
  20. @@ -85,6 +85,8 @@ void dprintf_out(LPCSTR format, ...)
  21.      HANDLE tok;
  22.      const char *tok_src;
  23.      bool free_tok = false;
  24. +    /* |in_dprintf_out| - protect against recursive calls */
  25. +    __declspec(thread) static bool in_dprintf_out = false;
  26.  
  27.      if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &tok)) {
  28.          tok_src = "impersonated_user";
  29. @@ -102,11 +104,21 @@ void dprintf_out(LPCSTR format, ...)
  30.          tok = GetCurrentProcessToken();
  31.      }
  32.  
  33. -    if (!get_token_user_name(tok, username)) {
  34. -        (void)strcpy(username, "<unknown>");
  35. +    if (in_dprintf_out) {
  36. +        (void)strcpy(username, "<unknown-recursive>");
  37. +        (void)strcpy(groupname, "<unknown-recursive>");
  38.      }
  39. -    if (!get_token_primarygroup_name(tok, groupname)) {
  40. -        (void)strcpy(groupname, "<unknown>");
  41. +    else {
  42. +        in_dprintf_out = true;
  43. +
  44. +        if (!get_token_user_name(tok, username)) {
  45. +            (void)strcpy(username, "<unknown>");
  46. +        }
  47. +        if (!get_token_primarygroup_name(tok, groupname)) {
  48. +            (void)strcpy(groupname, "<unknown>");
  49. +        }
  50. +
  51. +        in_dprintf_out = false;
  52.      }
  53.  
  54.      (void)fprintf(dlog_file, "%04x/%s='%s'/%s' ",
  55. --
  56. 2.43.0
  57.  
  58. From 621eecbdac52dd2886cef92d5b54a2d4073cc33d Mon Sep 17 00:00:00 2001
  59. From: Roland Mainz <roland.mainz@nrubsig.org>
  60. Date: Mon, 29 Apr 2024 12:52:47 +0200
  61. Subject: [PATCH 2/7] daemon:
  62.  |get_token_user_name()|/|get_token_primarygroup_name()| always call lsass.exe
  63.  
  64. |get_token_user_name()| and |get_token_primarygroup_name()| should use
  65. the SID cache, otherwise we have to do a |LookupAccountSidA()| each time,
  66. which will do call into the lsass.exe daemon (Local Security Authority
  67. Subsystem Service) - which is bad for performance as we need to do such a
  68. lookup for EACH request we receive from the kernel module.
  69.  
  70. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  71. ---
  72. daemon/nfs41_daemon.c |  5 ++---
  73.  daemon/sid.c          | 36 ++++++++++++++++++++++++++++++++----
  74.  daemon/sid.h          | 10 ++++++++++
  75.  daemon/util.c         | 25 +++++++++++++++++++++++++
  76.  4 files changed, 69 insertions(+), 7 deletions(-)
  77.  
  78. diff --git a/daemon/nfs41_daemon.c b/daemon/nfs41_daemon.c
  79. index 633f035..bca8f0a 100644
  80. --- a/daemon/nfs41_daemon.c
  81. +++ b/daemon/nfs41_daemon.c
  82. @@ -701,12 +701,11 @@ VOID ServiceStart(DWORD argc, LPTSTR *argv)
  83.          exit(1);
  84.      set_debug_level(cmd_args.debug_level);
  85.      open_log_files();
  86. +    sidcache_init();
  87.      nfsd_crt_debug_init();
  88.      (void)winsock_init();
  89.      init_version_string();
  90. -#ifdef NFS41_DRIVER_SID_CACHE
  91. -    sidcache_init();
  92. -#else
  93. +#ifndef NFS41_DRIVER_SID_CACHE
  94.      DPRINTF(0, ("SID cache disabled\n"));
  95.  #endif /* NFS41_DRIVER_SID_CACHE */
  96.  
  97. diff --git a/daemon/sid.c b/daemon/sid.c
  98. index db0df3a..1716fd5 100644
  99. --- a/daemon/sid.c
  100. +++ b/daemon/sid.c
  101. @@ -204,7 +204,6 @@ sidcache group_sidcache = { 0 };
  102.  
  103.  void sidcache_init(void)
  104.  {
  105. -    DPRINTF(1, ("SID cache init\n"));
  106.      InitializeCriticalSection(&user_sidcache.lock);
  107.      InitializeCriticalSection(&group_sidcache.lock);
  108.  }
  109. @@ -268,7 +267,7 @@ done:
  110.  }
  111.  
  112.  /* return |malloc()|'ed copy of SID from cache entry */
  113. -PSID *sidcache_getcached(sidcache *cache, const char *win32name)
  114. +PSID *sidcache_getcached_byname(sidcache *cache, const char *win32name)
  115.  {
  116.      int i;
  117.      time_t currentTimestamp;
  118. @@ -302,6 +301,35 @@ done:
  119.      LeaveCriticalSection(&cache->lock);
  120.      return ret_sid;
  121.  }
  122. +
  123. +bool sidcache_getcached_bysid(sidcache *cache, PSID sid, char *out_win32name)
  124. +{
  125. +    int i;
  126. +    time_t currentTimestamp;
  127. +    sidcache_entry *e;
  128. +    bool ret = false;
  129. +
  130. +    EnterCriticalSection(&cache->lock);
  131. +    currentTimestamp = time(NULL);
  132. +
  133. +    for (i = 0; i < SIDCACHE_SIZE; i++) {
  134. +        e = &cache->entries[i];
  135. +
  136. +        if ((e->sid != NULL) &&
  137. +            (EqualSid(sid, e->sid) &&
  138. +            ((currentTimestamp - e->timestamp) < SIDCACHE_TTL))) {
  139. +
  140. +            (void)strcpy(out_win32name, e->win32name);
  141. +
  142. +            ret = true;
  143. +            goto done;
  144. +        }
  145. +    }
  146. +
  147. +done:
  148. +    LeaveCriticalSection(&cache->lock);
  149. +    return ret;
  150. +}
  151.  #endif /* NFS41_DRIVER_SID_CACHE */
  152.  
  153.  
  154. @@ -329,7 +357,7 @@ int map_nfs4servername_2_sid(nfs41_daemon_globals *nfs41dg, int query, DWORD *si
  155.          gid_t gdummy = -1;
  156.  
  157.  #ifdef NFS41_DRIVER_SID_CACHE
  158. -        if (*sid = sidcache_getcached(&user_sidcache, nfsname)) {
  159. +        if (*sid = sidcache_getcached_byname(&user_sidcache, nfsname)) {
  160.              *sid_len = GetLengthSid(*sid);
  161.              DPRINTF(1, ("map_nfs4servername_2_sid: returning cached sid for user '%s'\n", nfsname));
  162.              status = 0;
  163. @@ -359,7 +387,7 @@ int map_nfs4servername_2_sid(nfs41_daemon_globals *nfs41dg, int query, DWORD *si
  164.          gid_t gdummy = -1;
  165.  
  166.  #ifdef NFS41_DRIVER_SID_CACHE
  167. -        if (*sid = sidcache_getcached(&group_sidcache, nfsname)) {
  168. +        if (*sid = sidcache_getcached_byname(&group_sidcache, nfsname)) {
  169.              *sid_len = GetLengthSid(*sid);
  170.              DPRINTF(1, ("map_nfs4servername_2_sid: returning cached sid for group '%s'\n", nfsname));
  171.              status = 0;
  172. diff --git a/daemon/sid.h b/daemon/sid.h
  173. index e6d87c5..ab04294 100644
  174. --- a/daemon/sid.h
  175. +++ b/daemon/sid.h
  176. @@ -26,10 +26,20 @@
  177.  
  178.  #include "nfs41_build_features.h"
  179.  #include "nfs41_daemon.h"
  180. +#include <stdbool.h>
  181. +
  182. +typedef struct _sidcache sidcache;
  183. +
  184. +extern sidcache user_sidcache;
  185. +extern sidcache group_sidcache;
  186.  
  187.  /* prototypes */
  188.  int create_unknownsid(WELL_KNOWN_SID_TYPE type, PSID *sid, DWORD *sid_len);
  189.  void sidcache_init(void);
  190. +void sidcache_add(sidcache *cache, const char* win32name, PSID value);
  191. +PSID *sidcache_getcached_byname(sidcache *cache, const char *win32name);
  192. +bool sidcache_getcached_bysid(sidcache *cache, PSID sid, char *out_win32name);
  193. +
  194.  int map_nfs4servername_2_sid(nfs41_daemon_globals *nfs41dg, int query, DWORD *sid_len, PSID *sid, LPCSTR name);
  195.  
  196.  #endif /* !__NFS41_DAEMON_SID_H */
  197. diff --git a/daemon/util.c b/daemon/util.c
  198. index ba753d9..fe863c0 100644
  199. --- a/daemon/util.c
  200. +++ b/daemon/util.c
  201. @@ -29,6 +29,7 @@
  202.  
  203.  #include "daemon_debug.h"
  204.  #include "util.h"
  205. +#include "sid.h"
  206.  #include "nfs41_ops.h"
  207.  
  208.  
  209. @@ -754,6 +755,13 @@ bool get_token_user_name(HANDLE tok, char *out_buffer)
  210.  
  211.      pusid = ptuser->User.Sid;
  212.  
  213. +#ifdef NFS41_DRIVER_SID_CACHE
  214. +    if (sidcache_getcached_bysid(&user_sidcache, pusid, out_buffer)) {
  215. +        DPRINTF(2, ("get_token_user_name: cached '%s'\n", out_buffer));
  216. +        return true;
  217. +    }
  218. +#endif /* NFS41_DRIVER_SID_CACHE */
  219. +
  220.      if (!LookupAccountSidA(NULL, pusid, out_buffer, &namesize,
  221.          domainbuffer, &domainbuffer_size, &name_use)) {
  222.          eprintf("get_token_user_name: "
  223. @@ -762,6 +770,11 @@ bool get_token_user_name(HANDLE tok, char *out_buffer)
  224.          return false;
  225.      }
  226.  
  227. +#ifdef NFS41_DRIVER_SID_CACHE
  228. +    DPRINTF(2, ("get_token_user_name: NOT cached '%s'\n", out_buffer));
  229. +    sidcache_add(&user_sidcache, out_buffer, pusid);
  230. +#endif /* NFS41_DRIVER_SID_CACHE */
  231. +
  232.      return true;
  233.  }
  234.  
  235. @@ -788,6 +801,13 @@ bool get_token_primarygroup_name(HANDLE tok, char *out_buffer)
  236.  
  237.      pgsid = ptpgroup->PrimaryGroup;
  238.  
  239. +#ifdef NFS41_DRIVER_SID_CACHE
  240. +    if (sidcache_getcached_bysid(&group_sidcache, pgsid, out_buffer)) {
  241. +        DPRINTF(2, ("get_token_primarygroup_name: cached '%s'\n", out_buffer));
  242. +        return true;
  243. +    }
  244. +#endif /* NFS41_DRIVER_SID_CACHE */
  245. +
  246.      if (!LookupAccountSidA(NULL, pgsid, out_buffer, &namesize,
  247.          domainbuffer, &domainbuffer_size, &name_use)) {
  248.          eprintf("get_token_username: "
  249. @@ -796,6 +816,11 @@ bool get_token_primarygroup_name(HANDLE tok, char *out_buffer)
  250.          return false;
  251.      }
  252.  
  253. +#ifdef NFS41_DRIVER_SID_CACHE
  254. +    DPRINTF(2, ("get_token_primarygroup_name: NOT cached '%s'\n", out_buffer));
  255. +    sidcache_add(&group_sidcache, out_buffer, pgsid);
  256. +#endif /* NFS41_DRIVER_SID_CACHE */
  257. +
  258.      return true;
  259.  }
  260.  
  261. --
  262. 2.43.0
  263.  
  264. From 82b7c4f5a761d917cd530c7af9dc374e25999fe2 Mon Sep 17 00:00:00 2001
  265. From: Roland Mainz <roland.mainz@nrubsig.org>
  266. Date: Mon, 29 Apr 2024 13:36:39 +0200
  267. Subject: [PATCH 3/7] cygwin: Fix typo in msnfs41client.bash
  268.  
  269. Fix typo in msnfs41client.bash
  270.  
  271. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  272. ---
  273. cygwin/devel/msnfs41client.bash | 4 ++--
  274.  1 file changed, 2 insertions(+), 2 deletions(-)
  275.  
  276. diff --git a/cygwin/devel/msnfs41client.bash b/cygwin/devel/msnfs41client.bash
  277. index 207153f..41a2b4f 100644
  278. --- a/cygwin/devel/msnfs41client.bash
  279. +++ b/cygwin/devel/msnfs41client.bash
  280. @@ -247,7 +247,7 @@ function nfsclient_rundeamon
  281.                         "/loadConfig:$(cygpath -w "${vsdiagnostics_path}/AgentConfigs/CpuUsageHigh.json")"
  282.                 printf '#\n'
  283.                 printf '# use\n'
  284. -               printf '# $ "%s" stop %d /output:nfsd_debug%d # to correct profiling data\n#\n' \
  285. +               printf '# $ "%s" stop %d /output:nfsd_debug%d # to collect profiling data\n#\n' \
  286.                         "$(which -a 'VSDiagnostics.exe')" \
  287.                         "${vsdiagnostics_id}" "$$"
  288.         else
  289. @@ -350,7 +350,7 @@ function nfsclient_system_rundeamon
  290.                         "/loadConfig:$(cygpath -w "${vsdiagnostics_path}/AgentConfigs/CpuUsageHigh.json")"
  291.                 printf '#\n'
  292.                 printf '# use\n'
  293. -               printf '# $ "%s" stop %d /output:nfsd_debug%d # to correct profiling data\n#\n' \
  294. +               printf '# $ "%s" stop %d /output:nfsd_debug%d # to collect profiling data\n#\n' \
  295.                         "$(which -a 'VSDiagnostics.exe')" \
  296.                         "${vsdiagnostics_id}" "$$"
  297.         else
  298. --
  299. 2.43.0
  300.  
  301. From 92aec122526a33575b02ac2733289f4669cf801e Mon Sep 17 00:00:00 2001
  302. From: Roland Mainz <roland.mainz@nrubsig.org>
  303. Date: Mon, 29 Apr 2024 13:38:40 +0200
  304. Subject: [PATCH 4/7] daemon: Fix debug message in
  305.  |get_token_primarygroup_name()|
  306.  
  307. Fix debug message in |get_token_primarygroup_name()|
  308.  
  309. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  310. ---
  311. daemon/util.c | 2 +-
  312.  1 file changed, 1 insertion(+), 1 deletion(-)
  313.  
  314. diff --git a/daemon/util.c b/daemon/util.c
  315. index fe863c0..82d15f4 100644
  316. --- a/daemon/util.c
  317. +++ b/daemon/util.c
  318. @@ -810,7 +810,7 @@ bool get_token_primarygroup_name(HANDLE tok, char *out_buffer)
  319.  
  320.      if (!LookupAccountSidA(NULL, pgsid, out_buffer, &namesize,
  321.          domainbuffer, &domainbuffer_size, &name_use)) {
  322. -        eprintf("get_token_username: "
  323. +        eprintf("get_token_primarygroup_name: "
  324.              "LookupAccountSidA() failed, status=%d\n",
  325.              (int)GetLastError());
  326.          return false;
  327. --
  328. 2.43.0
  329.  
  330. From 5eb2c520b89d96a5aca6188b4fe8187a99c2a17e Mon Sep 17 00:00:00 2001
  331. From: Roland Mainz <roland.mainz@nrubsig.org>
  332. Date: Mon, 29 Apr 2024 14:12:05 +0200
  333. Subject: [PATCH 5/7] tests: Document how to disable the "Microsoft
  334.  Compatibility Telemetry" daemon
  335.  
  336. Document how to disable the "Microsoft Compatibility Telemetry" daemon,
  337. as it can ruin profiling sessions.
  338.  
  339. Reported-by: Martin Wege <martin.l.wege@gmail.com>
  340. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  341. ---
  342. tests/manual_testing.txt | 7 +++++++
  343.  1 file changed, 7 insertions(+)
  344.  
  345. diff --git a/tests/manual_testing.txt b/tests/manual_testing.txt
  346. index fe40f2c..0359cb9 100644
  347. --- a/tests/manual_testing.txt
  348. +++ b/tests/manual_testing.txt
  349. @@ -28,6 +28,13 @@
  350.  #   disabled, e.g. disable it like this from an "Adminstrator" terminal:
  351.  #   $ powershell -Command 'Set-MpPreference -DisableRealtimeMonitoring 1' #
  352.  #
  353. +# - Microsoft Compatibility Telemetry daemon should be disabled,
  354. +#   as it can ruin profiling runs.
  355. +#   The daemon can be disabled from a Cygwin Adminstrator shell like this:
  356. +#   ---- snip ----
  357. +#   regtool -i set '/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/DataCollection/AllowTelemetry' 0
  358. +#   ---- snip ----
  359. +#
  360.  # - A timeserver shoud be running on both Windows (NFSv4.1 client and
  361.  #   NFSv4.1 server).
  362.  #   For example on Windows add timeserver 10.49.0.6 like this:
  363. --
  364. 2.43.0
  365.  
  366. From a15501c0f26295936ffbdec8ead74c251b21e965 Mon Sep 17 00:00:00 2001
  367. From: Roland Mainz <roland.mainz@nrubsig.org>
  368. Date: Mon, 29 Apr 2024 14:18:29 +0200
  369. Subject: [PATCH 6/7] daemon: Optimize |create_open_state()|
  370.  
  371. Optimize |create_open_state()|: Both |StringCchCopyA()| and
  372. |StringCchPrintfA()| are in the VC19 profiler's "hot codepaths"
  373. list, and can be replaced by code which doesn't check the buffer size
  374. as we do that anyway before doing the copies.
  375.  
  376. Reported-by: Martin Wege <martin.l.wege@gmail.com>
  377. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  378. ---
  379. daemon/open.c | 20 ++++++++++++++++----
  380.  1 file changed, 16 insertions(+), 4 deletions(-)
  381.  
  382. diff --git a/daemon/open.c b/daemon/open.c
  383. index 814354f..bd21d73 100644
  384. --- a/daemon/open.c
  385. +++ b/daemon/open.c
  386. @@ -42,6 +42,8 @@ static int create_open_state(
  387.  {
  388.      int status;
  389.      nfs41_open_state *state;
  390. +    size_t path_len;
  391. +
  392.  
  393.      state = calloc(1, sizeof(nfs41_open_state));
  394.      if (state == NULL) {
  395. @@ -50,18 +52,28 @@ static int create_open_state(
  396.      }
  397.  
  398.      InitializeSRWLock(&state->path.lock);
  399. -    if (FAILED(StringCchCopyA(state->path.path, NFS41_MAX_PATH_LEN, path))) {
  400. +
  401. +    path_len = strlen(path);
  402. +    if (path_len >= NFS41_MAX_PATH_LEN) {
  403.          status = ERROR_FILENAME_EXCED_RANGE;
  404.          goto out_free;
  405.      }
  406. -    state->path.len = (unsigned short)strlen(state->path.path);
  407. +
  408. +    (void)strcpy(state->path.path, path);
  409. +    state->path.len = (unsigned short)path_len;
  410. +
  411.      path_fh_init(&state->file, &state->path);
  412.      path_fh_init(&state->parent, &state->path);
  413.      last_component(state->path.path, state->file.name.name, &state->parent.name);
  414.  
  415. -    StringCchPrintfA((LPSTR)state->owner.owner, NFS4_OPAQUE_LIMIT, "%u",
  416. -        open_owner_id);
  417. +    /*
  418. +     * We use |_ultoa()| as optimised version of this code:
  419. +     * |StringCchPrintfA((LPSTR)state->owner.owner, NFS4_OPAQUE_LIMIT, "%u",
  420. +     * open_owner_id);|
  421. +     */
  422. +    (void)_ultoa(open_owner_id, (LPSTR)state->owner.owner, 10);
  423.      state->owner.owner_len = (uint32_t)strlen((const char*)state->owner.owner);
  424. +
  425.      InitializeSRWLock(&state->lock);
  426.      state->ref_count = 1; /* will be released in |cleanup_close()| */
  427.      list_init(&state->locks.list);
  428. --
  429. 2.43.0
  430.  
  431. From 86a78253fba8b3e5009b7ca1e4de9b364ed75907 Mon Sep 17 00:00:00 2001
  432. From: Roland Mainz <roland.mainz@nrubsig.org>
  433. Date: Mon, 29 Apr 2024 16:26:38 +0200
  434. Subject: [PATCH 7/7] daemon: Disable 8dot3 ShortName filename generation
  435.  
  436. Disable 8dot3 ShortName filename generation, the code does currently
  437. not work as expected and |GetShortPathNameW()| in this codepath
  438. eats ~~3% CPU time when building bash.git.
  439.  
  440. In general Windows is moving away fro generating 8dot3 short names,
  441. but we might need this in the future for compatibility to older
  442. DOS&&Windows applications.
  443.  
  444. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  445. ---
  446. daemon/readdir.c       | 7 +++++++
  447.  nfs41_build_features.h | 7 +++++++
  448.  2 files changed, 14 insertions(+)
  449.  
  450. diff --git a/daemon/readdir.c b/daemon/readdir.c
  451. index 544084f..6eae316 100644
  452. --- a/daemon/readdir.c
  453. +++ b/daemon/readdir.c
  454. @@ -375,6 +375,7 @@ static void readdir_copy_dir_info(
  455.          &entry->attr_info);
  456.  }
  457.  
  458. +#ifndef NFS41_DRIVER_DISABLE_8DOT3_SHORTNAME_GENERATION
  459.  static void readdir_copy_shortname(
  460.      IN LPCWSTR name,
  461.      OUT LPWSTR name_out,
  462. @@ -387,6 +388,7 @@ static void readdir_copy_shortname(
  463.          *name_size_out *= sizeof(WCHAR);
  464.      }
  465.  }
  466. +#endif /* !NFS41_DRIVER_DISABLE_8DOT3_SHORTNAME_GENERATION */
  467.  
  468.  static void readdir_copy_full_dir_info(
  469.      IN nfs41_readdir_entry *entry,
  470. @@ -408,8 +410,13 @@ static void readdir_copy_both_dir_info(
  471.      IN PFILE_DIR_INFO_UNION info)
  472.  {
  473.      readdir_copy_full_dir_info(entry, info);
  474. +#ifdef NFS41_DRIVER_DISABLE_8DOT3_SHORTNAME_GENERATION
  475. +    info->fbdi.ShortName[0] = L'\0';
  476. +    info->fbdi.ShortNameLength = 0;
  477. +#else
  478.      readdir_copy_shortname(wname, info->fbdi.ShortName,
  479.          &info->fbdi.ShortNameLength);
  480. +#endif /* NFS41_DRIVER_DISABLE_8DOT3_SHORTNAME_GENERATION */
  481.  }
  482.  
  483.  static void readdir_copy_filename(
  484. diff --git a/nfs41_build_features.h b/nfs41_build_features.h
  485. index 7b607ea..d197668 100644
  486. --- a/nfs41_build_features.h
  487. +++ b/nfs41_build_features.h
  488. @@ -99,4 +99,11 @@
  489.   */
  490.  #define NFS41_DRIVER_SETGID_NEWGRP_SUPPORT 1
  491.  
  492. +/*
  493. + * Disable 8DOT3 ShortName filename generation.
  494. + * The current code is broken anyway,so we disable it until we
  495. + * can implement it better..
  496. + */
  497. +#define NFS41_DRIVER_DISABLE_8DOT3_SHORTNAME_GENERATION 1
  498. +
  499.  #endif /* !_NFS41_DRIVER_BUILDFEATURES_ */
  500. --
  501. 2.43.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