• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  * fs/nfs/nfs_proto.h
3  *
4  *   Copyright (C) 2012, 2018 Gregory Nutt. All rights reserved.
5  *   Copyright (C) 2012 Jose Pablo Rojas Vargas. All rights reserved.
6  *   Author: Jose Pablo Rojas Vargas <jrojas@nx-engineering.com>
7  *           Gregory Nutt <gnutt@nuttx.org>
8  *
9  * Leveraged from OpenBSD:
10  *
11  *   Copyright (c) 1989, 1993
12  *   The Regents of the University of California.  All rights reserved.
13  *
14  * This code is derived from software contributed to Berkeley by
15  * Rick Macklem at The University of Guelph.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions
19  * are met:
20  *
21  * 1. Redistributions of source code must retain the above copyright
22  *    notice, this list of conditions and the following disclaimer.
23  * 2. Redistributions in binary form must reproduce the above copyright
24  *    notice, this list of conditions and the following disclaimer in the
25  *    documentation and/or other materials provided with the distribution.
26  * 3. Neither the name of the University nor the names of its contributors
27  *    may be used to endorse or promote products derived from this software
28  *    without specific prior written permission.
29  *
30  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40  * SUCH DAMAGE.
41  *
42  ****************************************************************************/
43 
44 #ifndef __FS_NFS_NFS_PROTO_H
45 #define __FS_NFS_NFS_PROTO_H
46 
47 /****************************************************************************
48  * Included Files
49  ****************************************************************************/
50 #include <limits.h>
51 
52 #ifdef __cplusplus
53 #if __cplusplus
54 extern "C" {
55 #endif /* __cplusplus */
56 #endif /* __cplusplus */
57 
58 /****************************************************************************
59  * Pre-processor Definitions
60  ****************************************************************************/
61 
62 /* Constants as defined in the Sun NFS Version 2 and 3 specs.
63  * "NFS: Network File System Protocol Specification" RFC1094
64  * and in the "NFS: Network File System Version 3 Protocol
65  * Specification"
66  */
67 
68 #define NFS_PORT                2049
69 #define NFS_PROG                100003
70 #define NFS_VER2                2
71 #define NFS_VER3                3
72 #define NFS_VER4                4
73 #define NFS_MAXDGRAMDATA        32768
74 #define MAXBSIZE                64000
75 #define NFS_MAXDATA             MAXBSIZE
76 #define NFS_MAXPATHLEN          1024
77 #define NFS_MAXNAMLEN           255
78 #define NFS_MAXPKTHDR           404
79 #define NFS_MAXPACKET           (NFS_MAXPKTHDR + NFS_MAXDATA)
80 #define NFS_MINPACKET           20
81 #define NFS_FABLKSIZE           512   /* Size in bytes of a block wrt fa_blocks */
82 #define NFS_MOUNT_PATH_MAX_SIZE PATH_MAX
83 
84 /* Stat numbers for rpc returns (version 2 and 3) */
85 
86 #define NFS_OK                  0
87 #define NFSERR_PERM             1
88 #define NFSERR_NOENT            2
89 #define NFSERR_IO               5
90 #define NFSERR_NXIO             6
91 #define NFSERR_ACCES            13
92 #define NFSERR_EXIST            17
93 #define NFSERR_XDEV             18    /* Version 3 only */
94 #define NFSERR_NODEV            19
95 #define NFSERR_NOTDIR           20
96 #define NFSERR_ISDIR            21
97 #define NFSERR_INVAL            22    /* Version 3 only */
98 #define NFSERR_FBIG             27
99 #define NFSERR_NOSPC            28
100 #define NFSERR_ROFS             30
101 #define NFSERR_MLINK            31    /* Version 3 only */
102 #define NFSERR_NAMETOL          63
103 #define NFSERR_NOTEMPTY         66
104 #define NFSERR_DQUOT            69
105 #define NFSERR_STALE            70
106 #define NFSERR_REMOTE           71    /* Version 3 only */
107 #define NFSERR_WFLUSH           99    /* Version 2 only */
108 #define NFSERR_BADHANDLE        10001 /* The rest Version 3 only */
109 #define NFSERR_NOT_SYNC         10002
110 #define NFSERR_BAD_COOKIE       10003
111 #define NFSERR_NOTSUPP          10004
112 #define NFSERR_TOOSMALL         10005
113 #define NFSERR_SERVERFAULT      10006
114 #define NFSERR_BADTYPE          10007
115 #define NFSERR_JUKEBOX          10008
116 #define NFSERR_TRYLATER         NFSERR_JUKEBOX
117 #define NFSERR_STALEWRITEVERF   30001 /* Fake return for nfs_commit() */
118 
119 #define NFSERR_RETVOID          0x20000000    /* Return void, not error */
120 #define NFSERR_AUTHERR          0x40000000    /* Mark an authentication error */
121 #define NFSERR_RETERR           0x80000000    /* Mark an error return for V3 */
122 
123 /* Sizes in bytes of various NFS RPC components */
124 
125 #define NFSX_UNSIGNED           4
126 
127 /* Specific to NFS Version 3 */
128 
129 #define NFSX_V3FH               (sizeof (fhandle_t))  /* size this server uses */
130 #define NFSX_V3FHMAX            64    /* max. allowed by protocol */
131 #define NFSX_V3FATTR            84
132 #define NFSX_V3SATTR            60    /* max. all fields filled in */
133 #define NFSX_V3SRVSATTR         (sizeof (struct nfsv3_sattr))
134 #define NFSX_V3POSTOPATTR       (NFSX_V3FATTR + NFSX_UNSIGNED)
135 #define NFSX_V3WCCDATA          (NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
136 #define NFSX_V3COOKIEVERF       8
137 #define NFSX_V3WRITEVERF        8
138 #define NFSX_V3CREATEVERF       8
139 #define NFSX_V3STATFS           52
140 #define NFSX_V3FSINFO           48
141 #define NFSX_V3PATHCONF         24
142 
143 /* NFS RPC procedure numbers (before version mapping) */
144 
145 #define NFSPROC_NULL            0
146 #define NFSPROC_GETATTR         1
147 #define NFSPROC_SETATTR         2
148 #define NFSPROC_LOOKUP          3
149 #define NFSPROC_ACCESS          4
150 #define NFSPROC_READLINK        5
151 #define NFSPROC_READ            6
152 #define NFSPROC_WRITE           7
153 #define NFSPROC_CREATE          8
154 #define NFSPROC_MKDIR           9
155 #define NFSPROC_SYMLINK         10
156 #define NFSPROC_MKNOD           11
157 #define NFSPROC_REMOVE          12
158 #define NFSPROC_RMDIR           13
159 #define NFSPROC_RENAME          14
160 #define NFSPROC_LINK            15
161 #define NFSPROC_READDIR         16
162 #define NFSPROC_READDIRPLUS     17
163 #define NFSPROC_FSSTAT          18
164 #define NFSPROC_FSINFO          19
165 #define NFSPROC_PATHCONF        20
166 #define NFSPROC_COMMIT          21
167 #define NFSPROC_NOOP            22
168 #define NFS_NPROCS              23
169 
170 /* Constants used by the Version 3 protocol for various RPCs */
171 
172 #define NFSV3SATTRTIME_DONTCHANGE 0
173 #define NFSV3SATTRTIME_TOSERVER   1
174 #define NFSV3SATTRTIME_TOCLIENT   2
175 
176 #define NFSV3ACCESS_READ         0x01
177 #define NFSV3ACCESS_LOOKUP       0x02
178 #define NFSV3ACCESS_MODIFY       0x04
179 #define NFSV3ACCESS_EXTEND       0x08
180 #define NFSV3ACCESS_DELETE       0x10
181 #define NFSV3ACCESS_EXECUTE      0x20
182 
183 #define NFSV3WRITE_UNSTABLE      0
184 #define NFSV3WRITE_DATASYNC      1
185 #define NFSV3WRITE_FILESYNC      2
186 
187 #define NFSV3CREATE_UNCHECKED    0
188 #define NFSV3CREATE_GUARDED      1
189 #define NFSV3CREATE_EXCLUSIVE    2
190 
191 #define NFSV3FSINFO_LINK         0x01
192 #define NFSV3FSINFO_SYMLINK      0x02
193 #define NFSV3FSINFO_HOMOGENEOUS  0x08
194 #define NFSV3FSINFO_CANSETTIME   0x10
195 
196 /* Conversion macros */
197 
198 #define vtonfsv3_mode(m)         txdr_unsigned((m) & 07777)
199 #define nfstov_mode(a)           (fxdr_unsigned(u_int16_t, (a))&07777)
200 #define vtonfsv3_type(a)         txdr_unsigned(nfsv3_type[((int32_t)(a))])
201 #define nfsv3tov_type(a)         nv3tov_type[fxdr_unsigned(uint32_t,(a))&0x7]
202 
203 /* Mode bit values */
204 
205 #define NFSMODE_IXOTH            (1 << 0)      /* Execute permission for others on a file */
206 #define NFSMODE_IWOTH            (1 << 1)      /* Write permission for others */
207 #define NFSMODE_IROTH            (1 << 2)      /* Read permission for others */
208 #define NFSMODE_IXGRP            (1 << 3)      /* Execute permission for group on a file */
209 #define NFSMODE_IWGRP            (1 << 4)      /* Write permission for group */
210 #define NFSMODE_IRGRP            (1 << 5)      /* Read permission for group */
211 #define NFSMODE_IXUSR            (1 << 6)      /* Execute permission for owner on a file */
212 #define NFSMODE_IWUSR            (1 << 7)      /* Write permission for owner */
213 #define NFSMODE_IRUSR            (1 << 8)      /* Read permission for owner */
214 #define NFSMODE_SAVETEXT         (1 << 9)      /* Save swapped text */
215 #define NFSMODE_ISGID            (1 << 10)     /* Set group ID on execution */
216 #define NFSMODE_ISUID            (1 << 11)     /* Set user ID on execution */
217 
218 #define DIRENT_NFS_MAXHANDLE     64   /* Maximum length of an NFSv3 file handle */
219 #define DIRENT_NFS_VERFLEN       8    /* Length of the copy verifier */
220 
221 /* File identifier */
222 
223 #define MAXFIDSZ                 16
224 
225 /****************************************************************************
226  * Public Types
227  ****************************************************************************/
228 
229 /* File types */
230 
231 typedef enum
232 {
233   NFNON  = 0,                  /* Unknown type */
234   NFREG  = 1,                  /* Regular file */
235   NFDIR  = 2,                  /* Directory */
236   NFBLK  = 3,                  /* Block special device file */
237   NFCHR  = 4,                  /* Character special device file */
238   NFLNK  = 5,                  /* Symbolic link */
239   NFSOCK = 6,                  /* Socket */
240   NFFIFO = 7                   /* Named FIFO */
241 } nfstype;
242 
243 /* File Handle variable is up to 64 bytes for version 3. This structures a
244  * ariable sized and are provided only for setting aside maximum memory
245  * allocations for a file handle.
246  */
247 
248 struct nfsfh
249 {
250   uint8_t fh_bytes[NFSX_V3FHMAX];
251 };
252 typedef struct nfsfh nfsfh_t;
253 #define SIZEOF_nfsfh_t(n) (n)
254 
255 struct nfsv3_time
256 {
257   uint32_t nfsv3_sec;
258   uint32_t nfsv3_nsec;
259 };
260 typedef struct nfsv3_time nfstime3;
261 
262 /* Quads are defined as arrays of 2 longs to ensure dense packing for the
263  * protocol and to facilitate xdr conversion.
264  */
265 
266 struct nfs_uquad
267 {
268   uint32_t nfsuquad[2];
269 };
270 typedef struct nfs_uquad nfsuint64;
271 
272 /* NFS Version 3 special file number. */
273 
274 struct nfsv3_spec
275 {
276   uint32_t specdata1;
277   uint32_t specdata2;
278 };
279 typedef struct nfsv3_spec nfsv3spec;
280 
281 /* File attributes and setable attributes. These structures cover both
282  * NFS version 2 and the version 3 protocol. Note that the union is only
283  * used so that one pointer can refer to both variants. These structures
284  * go out on the wire and must be densely packed, so no quad data types
285  * are used. (all fields are longs or u_longs or structures of same)
286  */
287 
288 struct nfs_fattr
289 {
290   uint32_t           fa_type;
291   uint32_t           fa_mode;
292   uint32_t           fa_nlink;
293   uint32_t           fa_uid;
294   uint32_t           fa_gid;
295   nfsuint64          fa_size;
296   nfsuint64          fa_used;
297   nfsv3spec          fa_rdev;
298   nfsuint64          fa_fsid;
299   nfsuint64          fa_fileid;
300   nfstime3           fa_atime;
301   nfstime3           fa_mtime;
302   nfstime3           fa_ctime;
303 };
304 
305 /* NFS Version 3 sattr structure for the new node creation case.  This is the
306  * maximum size of the attributes; the actual size may vary if values are not
307  * include.
308  */
309 
310 struct nfsv3_sattr
311 {
312   uint32_t           sa_modefollows;   /* TRUE: Mode value follows */
313   uint32_t           sa_mode;          /* Mode value */
314   uint32_t           sa_uidfollows;    /* TRUE: Uid value follows */
315   uint32_t           sa_uid;           /* Uid value */
316   uint32_t           sa_gidfollows;    /* TRUE: Mode value follows */
317   uint32_t           sa_gid;           /* Mode value */
318   uint32_t           sa_sizefollows;   /* TRUE: Size value follows */
319   uint32_t           sa_size;          /* Size value */
320   uint32_t           sa_atimetype;     /* Don't change, use server timer, or use client time  */
321   nfstime3           sa_atime;         /* Client time */
322   uint32_t           sa_mtimetype;     /* Don't change, use server timer, or use client time  */
323   nfstime3           sa_mtime;         /* Client time */
324 };
325 
326 struct nfs_statfs
327 {
328   uint32_t           attributes_follow;
329   struct nfs_fattr   obj_attributes;
330   nfsuint64          sf_tbytes;
331   nfsuint64          sf_fbytes;
332   nfsuint64          sf_abytes;
333   nfsuint64          sf_tfiles;
334   nfsuint64          sf_ffiles;
335   nfsuint64          sf_afiles;
336   uint32_t           sf_invarsec;
337 };
338 
339 struct nfs_statfs_ctx
340 {
341   nfsuint64          sf_tbytes;
342   nfsuint64          sf_fbytes;
343   nfsuint64          sf_abytes;
344   nfsuint64          sf_tfiles;
345   nfsuint64          sf_ffiles;
346   nfsuint64          sf_afiles;
347   uint32_t           sf_invarsec;
348 };
349 
350 
351 struct entry3
352 {
353   uint32_t        file_id[2];
354   uint32_t        name_len;
355   uint8_t         *contents;
356   uint32_t        cookie[2];
357   struct entry3   *next;
358 };
359 
360 struct nfsdir_s
361 {
362   struct nfsdir_s*   nfs_next;                            /* A list of opened directories. */
363   uint8_t            nfs_fhsize;                          /* Length of the file handle */
364   uint8_t            nfs_fhandle[DIRENT_NFS_MAXHANDLE];   /* File handle (max size allocated) */
365   uint8_t            nfs_verifier[DIRENT_NFS_VERFLEN];    /* Cookie verifier */
366   uint32_t           nfs_cookie[2];                       /* Cookie */
367   struct fs_dirent_s *nfs_dir;                            /* Directory pointer from VFS */
368   struct entry3      *nfs_entries;                        /* Directory pointer from VFS */
369 };
370 
371 struct post_attr
372 {
373   uint32_t           obj_attribute_follow;
374   struct nfs_fattr   attributes;
375 };
376 
377 struct nfsv3_fsinfo
378 {
379   struct post_attr   obj_attributes;
380   uint32_t           fs_rtmax;
381   uint32_t           fs_rtpref;
382   uint32_t           fs_rtmult;
383   uint32_t           fs_wtmax;
384   uint32_t           fs_wtpref;
385   uint32_t           fs_wtmult;
386   uint32_t           fs_dtpref;
387   nfsuint64          fs_maxfilesize;
388   nfstime3           fs_timedelta;
389   uint32_t           fs_properties;
390 };
391 
392 struct nfs_fsinfo
393 {
394   uint32_t           fs_rtmax;
395   uint32_t           fs_rtpref;
396   uint32_t           fs_rtmult;
397   uint32_t           fs_wtmax;
398   uint32_t           fs_wtpref;
399   uint32_t           fs_wtmult;
400   uint32_t           fs_dtpref;
401   nfsuint64          fs_maxfilesize;
402   nfstime3           fs_timedelta;
403   uint32_t           fs_properties;
404 };
405 
406 /* NFS procedures args */
407 
408 struct wcc_attr
409 {
410   nfsuint64          size;
411   nfstime3           mtime;
412   nfstime3           ctime;
413 };
414 
415 struct wcc_data
416 {
417   uint32_t           wcc_attr_follows;       /* True if data follows */
418   struct wcc_attr    before;
419   uint32_t           nfs_attr_follow;        /* True if attributes present */
420   struct nfs_fattr   after;
421 };
422 
423 struct file_handle
424 {
425   uint32_t           length;
426   nfsfh_t            handle;
427 };
428 #define SIZEOF_file_handle(n) (sizeof(uint32_t) + SIZEOF_nfsfh_t(n))
429 
430 struct diropargs3
431 {
432   struct file_handle fhandle;                  /* Variable length */
433   uint32_t           length;                   /* Size of name[] */
434   uint32_t           name[(NAME_MAX+3) >> 2];  /* Variable length */
435 };
436 
437 struct CREATE3args
438 {
439   struct diropargs3  where;
440   uint32_t           create_mode;
441   struct nfsv3_sattr how;
442 };
443 
444 struct CREATE3resok
445 {
446   uint32_t           handle_follows;           /* True, handle follows */
447   struct file_handle fhandle;                  /* Variable length */
448   uint32_t           attributes_follows;       /* True, attributes follows */
449   struct nfs_fattr   attributes;               /* File attributes */
450   struct wcc_data    dir_wcc;
451 };
452 
453 /* The actual size of the lookup argument is variable.  These structures are, therefore,
454  * only useful in setting aside maximum memory usage for the LOOKUP arguments.
455  */
456 
457 struct LOOKUP3filename
458 {
459   uint32_t           namelen;                  /* Size of name[] */
460   uint32_t           name[(NAME_MAX+3) >> 2];  /* Variable length */
461 };
462 
463 struct LOOKUP3args
464 {
465   struct file_handle     dirhandle;            /* Variable length */
466   struct LOOKUP3filename name;                 /* Variable length  */
467 };
468 
469 struct SETATTR3args
470 {
471   struct file_handle     fhandle;              /* Variable length */
472   struct nfsv3_sattr     new_attributes;       /* Variable length */
473   uint32_t               guard;                /* Guard value */
474 };
475 
476 struct SETATTR3resok
477 {
478   struct wcc_data         wcc_data;
479 };
480 
481 /* Actual size of LOOKUP3args */
482 
483 #define SIZEOF_LOOKUP3filename(b) (sizeof(uint32_t) + (((b)+3) & ~3))
484 #define SIZEOF_LOOKUP3args(a,b)   (SIZEOF_file_handle(a) + SIZEOF_LOOKUP3filename(b))
485 
486 struct LOOKUP3resok
487 {
488   struct file_handle fhandle;
489   uint32_t           obj_attributes_follow;
490   struct nfs_fattr   obj_attributes;
491   uint32_t           dir_attributes_follow;
492   struct nfs_fattr   dir_attributes;
493 };
494 
495 struct READ3args
496 {
497   struct file_handle fhandle;      /* Variable length */
498   uint64_t           offset;
499   uint32_t           count;
500 };
501 
502 struct nfs_rdhdr_s
503 {
504   uint32_t           attributes_follow;
505   struct nfs_fattr   attributes;   /* Will not be present if attributes_follow == 0 */
506   uint32_t           count;        /* Number of bytes read */
507   uint32_t           eof;          /* Non-zero if at the end of file */
508   uint32_t           length;       /* Length of data (same as count?) */
509 };
510 
511 struct READ3resok
512 {
513   struct nfs_rdhdr_s hdr;
514   uint8_t            data[1];      /* Actual data size depends on count */
515 };
516 #define SIZEOF_READ3resok(n) (sizeof(struct nfs_rdhdr_s) + (n))
517 
518 struct nfs_wrhdr_s
519 {
520   struct file_handle fhandle;     /* Variable length */
521   uint64_t           offset;
522   uint32_t           count;
523   uint32_t           stable;
524 };
525 
526 struct WRITE3args
527 {
528   struct nfs_wrhdr_s hdr;
529   uint8_t            data[1]; /* Actual data size depends on count */
530 };
531 #define SIZEOF_WRITE3args(n) (sizeof(struct nfs_wrhdr_s) + (n))
532 
533 struct WRITE3resok
534 {
535   struct wcc_data    file_wcc;
536   uint32_t           count;
537   uint32_t           committed;
538   uint8_t            verf[NFSX_V3WRITEVERF];
539 };
540 
541 struct REMOVE3args
542 {
543   struct diropargs3  object;
544 };
545 
546 struct REMOVE3resok
547 {
548   struct wcc_data    dir_wcc;
549 };
550 
551 struct RENAME3args
552 {
553   struct diropargs3  from;
554   struct diropargs3  to;
555 };
556 
557 struct RENAME3resok
558 {
559   struct wcc_data    fromdir_wcc;
560   struct wcc_data    todir_wcc;
561 };
562 
563 struct MKDIR3args
564 {
565   struct diropargs3  where;
566   struct nfsv3_sattr how;
567 };
568 
569 struct MKDIR3resok
570 {
571   uint32_t           handle_follows;           /* True, handle follows */
572   struct file_handle fhandle;                  /* Variable length */
573   uint32_t           attributes_follows;       /* True, attributes follows */
574   struct nfs_fattr   attributes;               /* Directory attributes */
575   struct wcc_data    dir_wcc;
576 };
577 
578 struct RMDIR3args
579 {
580   struct diropargs3  object;
581 };
582 
583 struct RMDIR3resok
584 {
585   struct wcc_data    dir_wcc;
586 };
587 
588 /* The actual size of the lookup argument is variable.  This structures is, therefore,
589  * only useful in setting aside maximum memory usage for the LOOKUP arguments.
590  */
591 
592 struct READDIR3args
593 {
594   struct file_handle dir;                      /* Variable length */
595   nfsuint64          cookie;
596   uint8_t            cookieverf[NFSX_V3COOKIEVERF];
597   uint32_t           count;
598 };
599 
600 /* The READDIR reply is variable length and consists of multiple entries, each
601  * of form:
602  *
603  *  EOF - OR -
604  *
605  *  File ID (8 bytes)
606  *  Name length (4 bytes)
607  *  Name string (varaiable size but in multiples of 4 bytes)
608  *  Cookie (8 bytes)
609  *  next entry (4 bytes)
610  */
611 
612 struct READDIR3resok
613 {
614   uint32_t           attributes_follow;
615   struct nfs_fattr   dir_attributes;
616   uint8_t            cookieverf[NFSX_V3COOKIEVERF];
617   uint32_t           value_follows;
618   uint32_t           reply[1]; /* Variable length reply begins here */
619 };
620 
621 #define SIZEOF_READDIR3resok(n) \
622    (sizeof(uint32_t) + sizeof(struct nfs_fattr) + \
623     NFSX_V3COOKIEVERF + sizeof(uint32_t) + (n))
624 
625 struct FS3args
626 {
627   struct file_handle fsroot;
628 };
629 
630 #ifdef __cplusplus
631 #if __cplusplus
632 }
633 #endif /* __cplusplus */
634 #endif /* __cplusplus */
635 
636 #endif /* __FS_NFS_NFS_PROTO_H */
637 
638