pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Patches for offload copy tests, custom (non-2049) port numbers for NFSv4 referrals+misc, 2025-08-23
Posted by Anonymous on Sat 23rd Aug 2025 16:32
raw | new post

  1. From 498cbb60fc0702bd4c7744f56588bcbacea350ae Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Sat, 23 Aug 2025 12:34:09 +0200
  4. Subject: [PATCH 1/3] tests: Add --copychunksize option to winoffloadcopyfile
  5.  
  6. Add --copychunksize option to winoffloadcopyfile.
  7.  
  8. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  9. ---
  10. tests/sparsefiles/multisparsefiletest.ksh     |   2 +-
  11.  tests/winoffloadcopyfile/winoffloadcopyfile.c | 219 ++++++++++++------
  12.  2 files changed, 151 insertions(+), 70 deletions(-)
  13.  
  14. diff --git a/tests/sparsefiles/multisparsefiletest.ksh b/tests/sparsefiles/multisparsefiletest.ksh
  15. index 0d43585..0d39082 100644
  16. --- a/tests/sparsefiles/multisparsefiletest.ksh
  17. +++ b/tests/sparsefiles/multisparsefiletest.ksh
  18. @@ -309,7 +309,7 @@ function multisparsefiletest1
  19.                  'offloadcopy_1mbchunks' | 'offloadcopy_1mbchunks_64bit' | 'offloadcopy_1mbchunks_32bit')
  20.                      if $test_cloning ; then
  21.                          ${winoffloadcopyfilecmd} \
  22. -                            --clonechunksize $((1024*1024)) \
  23. +                            --copychunksize $((1024*1024)) \
  24.                              'sparsefile2.bin' \
  25.                              'sparsefile2_offloadcopy_1mbchunks.bin' 1>'/dev/null'
  26.                          c.stdout="$(lssparse -H 'sparsefile2_offloadcopy_1mbchunks.bin')"
  27. diff --git a/tests/winoffloadcopyfile/winoffloadcopyfile.c b/tests/winoffloadcopyfile/winoffloadcopyfile.c
  28. index 021037b..db1a209 100644
  29. --- a/tests/winoffloadcopyfile/winoffloadcopyfile.c
  30. +++ b/tests/winoffloadcopyfile/winoffloadcopyfile.c
  31. @@ -23,7 +23,8 @@
  32.   */
  33.  
  34.  /*
  35. - * winoffloadcopyfile.c - clone a file
  36. + * winoffloadcopyfile.c - copy a file with Win32
  37. + * |FSCTL_OFFLOAD_READ|+|FSCTL_OFFLOAD_WRITE|
  38.   *
  39.   * Written by Roland Mainz <roland.mainz@nrubsig.org>
  40.   */
  41. @@ -36,6 +37,7 @@
  42.  
  43.  #define EXIT_USAGE (2)
  44.  
  45. +/* MinGW headers are currently missing these defines and types */
  46.  #ifndef OFFLOAD_READ_FLAG_ALL_ZERO_BEYOND_CURRENT_RANGE
  47.  typedef struct _FSCTL_OFFLOAD_READ_INPUT {
  48.      DWORD Size;
  49. @@ -90,30 +92,137 @@ typedef struct _STORAGE_OFFLOAD_TOKEN {
  50.  } STORAGE_OFFLOAD_TOKEN, *PSTORAGE_OFFLOAD_TOKEN;
  51.  #endif /* STORAGE_OFFLOAD_MAX_TOKEN_LENGTH */
  52.  
  53. -int main(int argc, char* argv[])
  54. +static
  55. +void print_usage(const char *av0)
  56.  {
  57. -    int retval = EXIT_FAILURE;
  58. +    (void)fprintf(stderr,
  59. +        "Usage: %s [--copychunksize <numbytes>] <infile> <outfile>\n",
  60. +        av0);
  61. +}
  62. +
  63. +static
  64. +BOOL offloadcopy(
  65. +    HANDLE hSrc,
  66. +    HANDLE hDest,
  67. +    LONGLONG src_offset,
  68. +    LONGLONG dst_offset,
  69. +    LONGLONG copy_length,
  70. +    LONGLONG *pBytesCopied)
  71. +{
  72. +    BOOL bSuccess;
  73. +    DWORD ioctlBytesReturned = 0;
  74. +
  75. +    BYTE tokenBuffer[STORAGE_OFFLOAD_MAX_TOKEN_LENGTH] = { 0 };
  76. +    PSTORAGE_OFFLOAD_TOKEN pToken = (PSTORAGE_OFFLOAD_TOKEN)tokenBuffer;
  77.  
  78. -    if (argc != 3) {
  79. +    FSCTL_OFFLOAD_READ_INPUT readInput = { 0 };
  80. +    readInput.Size = sizeof(FSCTL_OFFLOAD_READ_INPUT);
  81. +    readInput.FileOffset = src_offset;
  82. +    readInput.CopyLength = copy_length;
  83. +
  84. +    FSCTL_OFFLOAD_READ_OUTPUT readOutput = { 0 };
  85. +    readOutput.Size = sizeof(FSCTL_OFFLOAD_READ_OUTPUT);
  86. +
  87. +    bSuccess = DeviceIoControl(
  88. +        hSrc,
  89. +        FSCTL_OFFLOAD_READ,
  90. +        &readInput,
  91. +        sizeof(readInput),
  92. +        &readOutput,
  93. +        sizeof(readOutput),
  94. +        &ioctlBytesReturned,
  95. +        NULL);
  96. +
  97. +    if (!bSuccess) {
  98.          (void)fprintf(stderr,
  99. -            "Usage: %s <source_file> <destination_file>\n",
  100. -            argv[0]);
  101. -        return EXIT_USAGE;
  102. +            "FSCTL_OFFLOAD_READ failed, lasterr=%d\n",
  103. +            (int)GetLastError());
  104. +        return FALSE;
  105. +    }
  106. +
  107. +    (void)memcpy(pToken, readOutput.Token, sizeof(tokenBuffer));
  108. +
  109. +    FSCTL_OFFLOAD_WRITE_INPUT writeInput = { 0 };
  110. +    writeInput.Size = sizeof(FSCTL_OFFLOAD_WRITE_INPUT);
  111. +    writeInput.FileOffset = dst_offset;
  112. +    writeInput.CopyLength = copy_length;
  113. +    writeInput.TransferOffset = 0LL;
  114. +    (void)memcpy(writeInput.Token, pToken, sizeof(tokenBuffer));
  115. +
  116. +    FSCTL_OFFLOAD_WRITE_OUTPUT writeOutput = { 0 };
  117. +    writeOutput.Size = sizeof(FSCTL_OFFLOAD_WRITE_OUTPUT);
  118. +
  119. +    (void)printf("Performing copy with FSCTL_OFFLOAD_WRITE...\n");
  120. +    bSuccess = DeviceIoControl(
  121. +        hDest,
  122. +        FSCTL_OFFLOAD_WRITE,
  123. +        &writeInput,
  124. +        sizeof(writeInput),
  125. +        &writeOutput,
  126. +        sizeof(writeOutput),
  127. +        &ioctlBytesReturned,
  128. +        NULL);
  129. +
  130. +    if (!bSuccess) {
  131. +        (void)fprintf(stderr,
  132. +            "FSCTL_OFFLOAD_WRITE failed, lasterr=%d\n",
  133. +            (int)GetLastError());
  134. +        return FALSE;
  135. +    }
  136. +
  137. +    *pBytesCopied = writeOutput.LengthWritten;
  138. +
  139. +    (void)printf("Offload write successful. Bytes written: %lld\n",
  140. +        (long long)*pBytesCopied);
  141. +    (void)printf("Offloaded copy completed successfully!\n");
  142. +
  143. +    return TRUE;
  144. +}
  145. +
  146. +int main(int ac, char *av[])
  147. +{
  148. +    int retval = EXIT_FAILURE;
  149. +    LONGLONG maxCopyChunkSize =
  150. +        1024LL*1024LL*1024LL*1024LL*1024LL; /* 1PB */
  151. +    const char *srcFilename;
  152. +    const char *destFilename;
  153. +
  154. +    if (ac == 3) {
  155. +        srcFilename = av[1];
  156. +        destFilename = av[2];
  157. +    }
  158. +    else if (ac == 5) {
  159. +        if (strcmp(av[1], "--copychunksize") != 0) {
  160. +            print_usage(av[0]);
  161. +            return (EXIT_USAGE);
  162. +        }
  163. +
  164. +        maxCopyChunkSize = atoll(av[2]);
  165. +        srcFilename = av[3];
  166. +        destFilename = av[4];
  167. +    }
  168. +    else {
  169. +        print_usage(av[0]);
  170. +        return (EXIT_USAGE);
  171.      }
  172.  
  173. -    const char *srcFilename = argv[1];
  174. -    const char *destFilename = argv[2];
  175.      HANDLE hSrc = INVALID_HANDLE_VALUE;
  176.      HANDLE hDest = INVALID_HANDLE_VALUE;
  177. -    BOOL bSuccess = FALSE;
  178. -    DWORD ioctlBytesReturned = 0;
  179. -
  180. -    BYTE tokenBuffer[STORAGE_OFFLOAD_MAX_TOKEN_LENGTH] = { 0 };
  181. -    PSTORAGE_OFFLOAD_TOKEN pToken = (PSTORAGE_OFFLOAD_TOKEN)tokenBuffer;
  182.  
  183. -    (void)printf("Attempting offloaded copy from '%s' to '%s'\n",
  184. -        srcFilename,
  185. -        destFilename);
  186. +    if (ac == 3) {
  187. +        (void)printf("# Attempting offloded copy from '%s' to '%s' using "
  188. +            "FSCTL_OFFLOAD_READ+FSCTL_OFFLOAD_WRITE...\n",
  189. +            srcFilename,
  190. +            destFilename);
  191. +    }
  192. +    else if (ac == 5) {
  193. +        (void)printf("# Attempting offloded copy from '%s' to '%s' in "
  194. +            "%lld byte chunks using "
  195. +            "FSCTL_OFFLOAD_READ+FSCTL_OFFLOAD_WRITE...\n",
  196. +            srcFilename,
  197. +            destFilename,
  198. +            maxCopyChunkSize);
  199. +    }
  200.  
  201.      hSrc = CreateFileA(srcFilename,
  202.          GENERIC_READ,
  203. @@ -151,31 +260,9 @@ int main(int argc, char* argv[])
  204.          goto cleanup;
  205.      }
  206.  
  207. -    FSCTL_OFFLOAD_READ_INPUT readInput = { 0 };
  208. -    readInput.Size = sizeof(FSCTL_OFFLOAD_READ_INPUT);
  209. -    readInput.FileOffset = 0;
  210. -    readInput.CopyLength = fileSize.QuadPart;
  211. -
  212. -    FSCTL_OFFLOAD_READ_OUTPUT readOutput = { 0 };
  213. -    readOutput.Size = sizeof(FSCTL_OFFLOAD_READ_OUTPUT);
  214. -
  215. -    bSuccess = DeviceIoControl(
  216. -        hSrc,
  217. -        FSCTL_OFFLOAD_READ,
  218. -        &readInput,
  219. -        sizeof(readInput),
  220. -        &readOutput,
  221. -        sizeof(readOutput),
  222. -        &ioctlBytesReturned,
  223. -        NULL);
  224. -
  225. -    if (!bSuccess) {
  226. -        (void)fprintf(stderr,
  227. -            "FSCTL_OFFLOAD_READ failed, lasterr=%d\n",
  228. -            (int)GetLastError());
  229. -        goto cleanup;
  230. -    }
  231. -
  232. +    /*
  233. +     * Extend destination file
  234. +     */
  235.      if (!SetFilePointerEx(hDest, fileSize, NULL, FILE_BEGIN)) {
  236.          (void)fprintf(stderr,
  237.              "Cannot set dest file pointer, lasterr=%d\n",
  238. @@ -190,39 +277,33 @@ int main(int argc, char* argv[])
  239.          goto cleanup;
  240.      }
  241.  
  242. -    (void)memcpy(pToken, readOutput.Token, sizeof(tokenBuffer));
  243. +    LONGLONG bytesCopied = 0LL;
  244. +    LONGLONG byteCount = fileSize.QuadPart;
  245. +    LONGLONG copyOffset = 0LL;
  246. +    BOOL bResult;
  247.  
  248. -    FSCTL_OFFLOAD_WRITE_INPUT writeInput = { 0 };
  249. -    writeInput.Size = sizeof(FSCTL_OFFLOAD_WRITE_INPUT);
  250. -    writeInput.FileOffset = 0;
  251. -    writeInput.CopyLength = fileSize.QuadPart;
  252. -    writeInput.TransferOffset = 0;
  253. -    (void)memcpy(writeInput.Token, pToken, sizeof(tokenBuffer));
  254. +    while (byteCount > 0) {
  255. +        (void)printf("# offloadcopy: copyOffset=%lld)\n",
  256. +            copyOffset);
  257.  
  258. -    FSCTL_OFFLOAD_WRITE_OUTPUT writeOutput = { 0 };
  259. -    writeOutput.Size = sizeof(FSCTL_OFFLOAD_WRITE_OUTPUT);
  260. +        bResult = offloadcopy(hSrc,
  261. +            hDest,
  262. +            copyOffset,
  263. +            copyOffset,
  264. +            __min(byteCount, maxCopyChunkSize),
  265. +            &bytesCopied);
  266.  
  267. -    (void)printf("Performing copy with FSCTL_OFFLOAD_WRITE...\n");
  268. -    bSuccess = DeviceIoControl(
  269. -        hDest,
  270. -        FSCTL_OFFLOAD_WRITE,
  271. -        &writeInput,
  272. -        sizeof(writeInput),
  273. -        &writeOutput,
  274. -        sizeof(writeOutput),
  275. -        &ioctlBytesReturned,
  276. -        NULL);
  277. +        if (!bResult) {
  278. +            goto cleanup;
  279. +        }
  280.  
  281. -    if (!bSuccess) {
  282. -        (void)fprintf(stderr,
  283. -            "FSCTL_OFFLOAD_WRITE failed, lasterr=%d\n",
  284. -            (int)GetLastError());
  285. -        goto cleanup;
  286. +        byteCount -= bytesCopied;
  287. +        copyOffset += bytesCopied;
  288.      }
  289.  
  290. -    (void)printf("Offload write successful. Bytes written: %lld\n",
  291. -        (long long)writeOutput.LengthWritten);
  292. -    (void)printf("Offloaded copy completed successfully!\n");
  293. +    (void)printf("# Successfully used offload read+write to copy '%s' to '%s'!\n",
  294. +        srcFilename,
  295. +        destFilename);
  296.      retval = EXIT_SUCCESS;
  297.  
  298.  cleanup:
  299. --
  300. 2.45.1
  301.  
  302. From c9f9bee6aaa2380b167608802e401bb77b129f05 Mon Sep 17 00:00:00 2001
  303. From: Roland Mainz <roland.mainz@nrubsig.org>
  304. Date: Sat, 23 Aug 2025 12:35:09 +0200
  305. Subject: [PATCH 2/3] tests: multisparsefiletest: offloadcopy tests should be
  306.  enabled with test_offloadcopy=true
  307.  
  308. multisparsefiletest: offloadcopy tests should be enabled with
  309. test_offloadcopy=true
  310.  
  311. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  312. ---
  313. tests/sparsefiles/multisparsefiletest.ksh | 4 ++--
  314.  1 file changed, 2 insertions(+), 2 deletions(-)
  315.  
  316. diff --git a/tests/sparsefiles/multisparsefiletest.ksh b/tests/sparsefiles/multisparsefiletest.ksh
  317. index 0d39082..b8106e4 100644
  318. --- a/tests/sparsefiles/multisparsefiletest.ksh
  319. +++ b/tests/sparsefiles/multisparsefiletest.ksh
  320. @@ -297,7 +297,7 @@ function multisparsefiletest1
  321.                      fi
  322.                      ;;
  323.                  'offloadcopy_full' | 'offloadcopy_full_64bit' | 'offloadcopy_full_32bit')
  324. -                    if $test_cloning ; then
  325. +                    if $test_offloadcopy ; then
  326.                          ${winoffloadcopyfilecmd} 'sparsefile2.bin' 'sparsefile2_offloadcopy_full.bin' 1>'/dev/null'
  327.                          c.stdout="$(lssparse -H 'sparsefile2_offloadcopy_full.bin')"
  328.                      else
  329. @@ -307,7 +307,7 @@ function multisparsefiletest1
  330.                      fi
  331.                      ;;
  332.                  'offloadcopy_1mbchunks' | 'offloadcopy_1mbchunks_64bit' | 'offloadcopy_1mbchunks_32bit')
  333. -                    if $test_cloning ; then
  334. +                    if $test_offloadcopy ; then
  335.                          ${winoffloadcopyfilecmd} \
  336.                              --copychunksize $((1024*1024)) \
  337.                              'sparsefile2.bin' \
  338. --
  339. 2.45.1
  340.  
  341. From d72d3f30b9fa50f1b144e9e676f446df06551f06 Mon Sep 17 00:00:00 2001
  342. From: Roland Mainz <roland.mainz@nrubsig.org>
  343. Date: Sat, 23 Aug 2025 17:22:59 +0200
  344. Subject: [PATCH 3/3] daemon: Implement custom NFS port support for NFSv4
  345.  referrals
  346.  
  347. Implement custom (non-2049) NFS port support for NFSv4 referrals.
  348.  
  349. Reported-by: Martin Wege <martin.l.wege@gmail.com>
  350. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  351. ---
  352. daemon/namespace.c |  12 ++++--
  353.  daemon/util.c      | 100 +++++++++++++++++++++++++++++++++++++++++++++
  354.  daemon/util.h      |  22 ++++++++++
  355.  3 files changed, 131 insertions(+), 3 deletions(-)
  356.  
  357. diff --git a/daemon/namespace.c b/daemon/namespace.c
  358. index 75bc67f..4a2b157 100644
  359. --- a/daemon/namespace.c
  360. +++ b/daemon/namespace.c
  361. @@ -535,13 +535,19 @@ static int referral_mount_location(
  362.  
  363.      /* create a client and session for the first available server */
  364.      for (i = 0; i < loc->server_count; i++) {
  365. -        DPRINTF(1,
  366. +        char addr[NFS41_HOSTNAME_LEN+1];
  367. +        unsigned short port;
  368. +
  369. +        DPRINTF(0,
  370.              ("referral_mount_location: "
  371.                  "trying loc->servers[%d].address='%s'\n",
  372.                  (int)i, loc->servers[i].address));
  373.  
  374. -        /* XXX: only deals with 'address' as a hostname with default port */
  375. -        status = nfs41_server_resolve(loc->servers[i].address, 2049, &addrs);
  376. +        status = parse_fs_location_server_address(loc->servers[i].address,
  377. +            addr, &port);
  378. +        if (status) continue;
  379. +
  380. +        status = nfs41_server_resolve(addr, port, &addrs);
  381.          if (status) continue;
  382.  
  383.          status = nfs41_root_mount_addrs(root, &addrs, 0, 0, client_out);
  384. diff --git a/daemon/util.c b/daemon/util.c
  385. index e497109..4788d85 100644
  386. --- a/daemon/util.c
  387. +++ b/daemon/util.c
  388. @@ -668,3 +668,103 @@ int nfs41_cached_getchangeattr(nfs41_open_state *state, nfs41_file_info *restric
  389.          &state->file, &change_bitmap, info);
  390.      return status;
  391.  }
  392. +
  393. +static
  394. +bool parse_last_two_numbers(
  395. +    IN const char *restrict str,
  396. +    OUT const char **begin_dot, OUT int *num1, OUT int *num2)
  397. +{
  398. +    const char *last_dot = NULL;
  399. +    const char *second_last_dot = NULL;
  400. +    char *endptr = NULL;
  401. +
  402. +    last_dot = memrchr(str, '.', strlen(str));
  403. +    if (last_dot == NULL) {
  404. +        return false;
  405. +    }
  406. +
  407. +    second_last_dot = memrchr(str, '.', last_dot - str);
  408. +    if (second_last_dot == NULL) {
  409. +        return false;
  410. +    }
  411. +
  412. +    *begin_dot = second_last_dot;
  413. +
  414. +    errno = 0;
  415. +    *num1 = (int)strtol(second_last_dot + 1, &endptr, 10);
  416. +
  417. +    if ((errno == ERANGE) ||
  418. +        (endptr != last_dot) ||
  419. +        (endptr == second_last_dot + 1)) {
  420. +        return false;
  421. +    }
  422. +
  423. +    errno = 0;
  424. +    *num2 = (int)strtol(last_dot + 1, &endptr, 10);
  425. +
  426. +    if ((errno == ERANGE) ||
  427. +        (*endptr != '\0') ||
  428. +        (endptr == last_dot + 1)) {
  429. +        return false;
  430. +    }
  431. +
  432. +    return true;
  433. +}
  434. +
  435. +static
  436. +int count_chars(IN const char *restrict s, IN int ch)
  437. +{
  438. +    int num = 0;
  439. +    unsigned char c;
  440. +
  441. +    while((c = *s++) != '\0') {
  442. +        if (c == (unsigned char)ch)
  443. +            num++;
  444. +    }
  445. +    return num;
  446. +}
  447. +
  448. +int parse_fs_location_server_address(IN const char *restrict inaddr,
  449. +    OUT char *restrict addr,
  450. +    OUT unsigned short *restrict port)
  451. +{
  452. +    /*
  453. +     * See https://datatracker.ietf.org/doc/html/rfc5665#section-5.2.3.3
  454. +     * for IPv4 and
  455. +     * https://datatracker.ietf.org/doc/html/rfc5665#section-5.2.3.4 for
  456. +     * IPv6.
  457. +     */
  458. +    int dot_count = count_chars(inaddr, '.');
  459. +    int colon_count = count_chars(inaddr, ':');
  460. +
  461. +    if (((dot_count == 5) && (colon_count == 0)) ||
  462. +        (colon_count == 7) && (dot_count == 2)) {
  463. +        int num1, num2;
  464. +        const char *begin_dot = NULL;
  465. +        if (parse_last_two_numbers(inaddr, &begin_dot, &num1, &num2)) {
  466. +            size_t len = begin_dot - inaddr;
  467. +            (void)memcpy(addr, inaddr, len);
  468. +            addr[len] = '\0';
  469. +            *port = (unsigned short)((num1 << 8) + num2);
  470. +            DPRINTF(0,
  471. +                ("parse_fs_location_server_address: "
  472. +                "addr='%s' port=%d\n",
  473. +                addr, (unsigned short)*port));
  474. +
  475. +            return NO_ERROR;
  476. +        }
  477. +        else {
  478. +            return ERROR_BAD_NET_NAME;
  479. +        }
  480. +    }
  481. +    else if (((dot_count == 3) && (colon_count == 0)) ||
  482. +        (colon_count == 5) && (dot_count == 0)) {
  483. +        (void)strcpy(addr, inaddr);
  484. +        *port = 2049;
  485. +        return NO_ERROR;
  486. +    }
  487. +
  488. +    eprintf("parse_fs_location_server_address: Unknown format addr='%s'\n",
  489. +        inaddr);
  490. +    return ERROR_BAD_NET_NAME;
  491. +}
  492. diff --git a/daemon/util.h b/daemon/util.h
  493. index 87c2315..b936ac4 100644
  494. --- a/daemon/util.h
  495. +++ b/daemon/util.h
  496. @@ -69,6 +69,24 @@ void *mempcpy(void *restrict dest, const void *restrict src, size_t n)
  497.      return (void *)((char *)dest + n);
  498.  }
  499.  
  500. +static __inline
  501. +void *memrchr(const void * restrict s, int c, size_t n)
  502. +{
  503. +    const unsigned char *cp;
  504. +
  505. +    if (n == 0UL)
  506. +        return NULL;
  507. +
  508. +    cp = (const unsigned char *)s + n;
  509. +    do {
  510. +        if (*(--cp) == (unsigned char)c) {
  511. +            return((void *)cp);
  512. +        }
  513. +    } while (--n != 0UL);
  514. +
  515. +    return NULL;
  516. +}
  517. +
  518.  int safe_read(unsigned char **pos, uint32_t *remaining, void *dest, uint32_t dest_len);
  519.  int safe_write(unsigned char **pos, uint32_t *remaining, void *dest, uint32_t dest_len);
  520.  int get_safe_write_bufferpos(unsigned char **pos, uint32_t *remaining,
  521. @@ -406,4 +424,8 @@ bool getwinntversionnnumbers(DWORD *MajorVersionPtr, DWORD *MinorVersionPtr, DWO
  522.  
  523.  int nfs41_cached_getchangeattr(nfs41_open_state *state, nfs41_file_info *restrict info);
  524.  
  525. +int parse_fs_location_server_address(IN const char *restrict inaddr,
  526. +    OUT char *restrict addr,
  527. +    OUT unsigned short *restrict port);
  528. +
  529.  #endif /* !__NFS41_DAEMON_UTIL_H__ */
  530. --
  531. 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