1 /*
2 You may distribute this file under either of the two licenses that
3 follow at your discretion.
4 */
5
6 /* BLURB lgpl
7
8 Coda File System
9 Release 5
10
11 Copyright (c) 1987-1999 Carnegie Mellon University
12 Additional copyrights listed below
13
14 This code is distributed "AS IS" without warranty of any kind under
15 the terms of the GNU Library General Public Licence Version 2, as
16 shown in the file LICENSE, or under the license shown below. The
17 technical and financial contributors to Coda are listed in the file
18 CREDITS.
19
20 Additional copyrights
21 */
22
23 /*
24
25 Coda: an Experimental Distributed File System
26 Release 4.0
27
28 Copyright (c) 1987-1999 Carnegie Mellon University
29 All Rights Reserved
30
31 Permission to use, copy, modify and distribute this software and its
32 documentation is hereby granted, provided that both the copyright
33 notice and this permission notice appear in all copies of the
34 software, derivative works or modified versions, and any portions
35 thereof, and that both notices appear in supporting documentation, and
36 that credit is given to Carnegie Mellon University in all documents
37 and publicity pertaining to direct or indirect use of this code or its
38 derivatives.
39
40 CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS KNOWN TO HAVE BUGS,
41 SOME OF WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON ALLOWS
42 FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON
43 DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER
44 RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE OR OF
45 ANY DERIVATIVE WORK.
46
47 Carnegie Mellon encourages users of this software to return any
48 improvements or extensions that they make, and to grant Carnegie
49 Mellon the rights to redistribute these changes without encumbrance.
50 */
51
52 /*
53 *
54 * Based on cfs.h from Mach, but revamped for increased simplicity.
55 * Linux modifications by
56 * Peter Braam, Aug 1996
57 */
58
59 #ifndef _CODA_HEADER_
60 #define _CODA_HEADER_
61
62
63 /* Catch new _KERNEL defn for NetBSD and DJGPP/__CYGWIN32__ */
64 #if defined(__NetBSD__) || \
65 ((defined(DJGPP) || defined(__CYGWIN32__)) && !defined(KERNEL))
66 #include <sys/types.h>
67 #endif
68
69 #ifndef CODA_MAXSYMLINKS
70 #define CODA_MAXSYMLINKS 10
71 #endif
72
73 #if defined(DJGPP) || defined(__CYGWIN32__)
74 #ifdef KERNEL
75 typedef unsigned long u_long;
76 typedef unsigned int u_int;
77 typedef unsigned short u_short;
78 typedef u_long ino_t;
79 typedef u_long dev_t;
80 typedef void * caddr_t;
81 #ifdef DOS
82 typedef unsigned __int64 u_quad_t;
83 #else
84 typedef unsigned long long u_quad_t;
85 #endif
86
87 #define inline
88
89 struct timespec {
90 long ts_sec;
91 long ts_nsec;
92 };
93 #else /* DJGPP but not KERNEL */
94 #include <sys/time.h>
95 typedef unsigned long long u_quad_t;
96 #endif /* !KERNEL */
97 #endif /* !DJGPP */
98
99
100 #if defined(__linux__)
101 #include <linux/time.h>
102 #define cdev_t u_quad_t
103 #if !defined(_UQUAD_T_) && (!defined(__GLIBC__) || __GLIBC__ < 2)
104 #define _UQUAD_T_ 1
105 typedef unsigned long long u_quad_t;
106 #endif
107 #else
108 #define cdev_t dev_t
109 #endif
110
111 #ifdef __CYGWIN32__
112 struct timespec {
113 time_t tv_sec; /* seconds */
114 long tv_nsec; /* nanoseconds */
115 };
116 #endif
117
118 #ifndef __BIT_TYPES_DEFINED__
119 #define __BIT_TYPES_DEFINED__
120 typedef signed char int8_t;
121 typedef unsigned char u_int8_t;
122 typedef short int16_t;
123 typedef unsigned short u_int16_t;
124 typedef int int32_t;
125 typedef unsigned int u_int32_t;
126 #endif
127
128
129 /*
130 * Cfs constants
131 */
132 #define CODA_MAXNAMLEN 255
133 #define CODA_MAXPATHLEN 1024
134 #define CODA_MAXSYMLINK 10
135
136 /* these are Coda's version of O_RDONLY etc combinations
137 * to deal with VFS open modes
138 */
139 #define C_O_READ 0x001
140 #define C_O_WRITE 0x002
141 #define C_O_TRUNC 0x010
142 #define C_O_EXCL 0x100
143 #define C_O_CREAT 0x200
144
145 /* these are to find mode bits in Venus */
146 #define C_M_READ 00400
147 #define C_M_WRITE 00200
148
149 /* for access Venus will use */
150 #define C_A_C_OK 8 /* Test for writing upon create. */
151 #define C_A_R_OK 4 /* Test for read permission. */
152 #define C_A_W_OK 2 /* Test for write permission. */
153 #define C_A_X_OK 1 /* Test for execute permission. */
154 #define C_A_F_OK 0 /* Test for existence. */
155
156
157
158 #ifndef _VENUS_DIRENT_T_
159 #define _VENUS_DIRENT_T_ 1
160 struct venus_dirent {
161 u_int32_t d_fileno; /* file number of entry */
162 u_int16_t d_reclen; /* length of this record */
163 u_int8_t d_type; /* file type, see below */
164 u_int8_t d_namlen; /* length of string in d_name */
165 char d_name[CODA_MAXNAMLEN + 1];/* name must be no longer than this */
166 };
167 #undef DIRSIZ
168 #define DIRSIZ(dp) ((sizeof (struct venus_dirent) - (CODA_MAXNAMLEN+1)) + \
169 (((dp)->d_namlen+1 + 3) &~ 3))
170
171 /*
172 * File types
173 */
174 #define CDT_UNKNOWN 0
175 #define CDT_FIFO 1
176 #define CDT_CHR 2
177 #define CDT_DIR 4
178 #define CDT_BLK 6
179 #define CDT_REG 8
180 #define CDT_LNK 10
181 #define CDT_SOCK 12
182 #define CDT_WHT 14
183
184 /*
185 * Convert between stat structure types and directory types.
186 */
187 #define IFTOCDT(mode) (((mode) & 0170000) >> 12)
188 #define CDTTOIF(dirtype) ((dirtype) << 12)
189
190 #endif
191
192 #ifndef _VUID_T_
193 #define _VUID_T_
194 typedef u_int32_t vuid_t;
195 typedef u_int32_t vgid_t;
196 #endif /*_VUID_T_ */
197
198 #ifdef CONFIG_CODA_FS_OLD_API
199 struct CodaFid {
200 u_int32_t opaque[3];
201 };
202
coda_f2i(struct CodaFid * fid)203 static __inline__ ino_t coda_f2i(struct CodaFid *fid)
204 {
205 if ( ! fid )
206 return 0;
207 if (fid->opaque[1] == 0xfffffffe || fid->opaque[1] == 0xffffffff)
208 return ((fid->opaque[0] << 20) | (fid->opaque[2] & 0xfffff));
209 else
210 return (fid->opaque[2] + (fid->opaque[1]<<10) + (fid->opaque[0]<<20));
211 }
212
213 struct coda_cred {
214 vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/
215 vgid_t cr_groupid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */
216 };
217
218 #else /* not defined(CONFIG_CODA_FS_OLD_API) */
219
220 struct CodaFid {
221 u_int32_t opaque[4];
222 };
223
224 #define coda_f2i(fid)\
225 (fid ? (fid->opaque[3] ^ (fid->opaque[2]<<10) ^ (fid->opaque[1]<<20) ^ fid->opaque[0]) : 0)
226
227 #endif
228
229 #ifndef _VENUS_VATTR_T_
230 #define _VENUS_VATTR_T_
231 /*
232 * Vnode types. VNON means no type.
233 */
234 enum coda_vtype { C_VNON, C_VREG, C_VDIR, C_VBLK, C_VCHR, C_VLNK, C_VSOCK, C_VFIFO, C_VBAD };
235
236 struct coda_vattr {
237 long va_type; /* vnode type (for create) */
238 u_short va_mode; /* files access mode and type */
239 short va_nlink; /* number of references to file */
240 vuid_t va_uid; /* owner user id */
241 vgid_t va_gid; /* owner group id */
242 long va_fileid; /* file id */
243 u_quad_t va_size; /* file size in bytes */
244 long va_blocksize; /* blocksize preferred for i/o */
245 struct timespec va_atime; /* time of last access */
246 struct timespec va_mtime; /* time of last modification */
247 struct timespec va_ctime; /* time file changed */
248 u_long va_gen; /* generation number of file */
249 u_long va_flags; /* flags defined for file */
250 cdev_t va_rdev; /* device special file represents */
251 u_quad_t va_bytes; /* bytes of disk space held by file */
252 u_quad_t va_filerev; /* file modification number */
253 };
254
255 #endif
256
257 /* structure used by CODA_STATFS for getting cache information from venus */
258 struct coda_statfs {
259 int32_t f_blocks;
260 int32_t f_bfree;
261 int32_t f_bavail;
262 int32_t f_files;
263 int32_t f_ffree;
264 };
265
266 /*
267 * Kernel <--> Venus communications.
268 */
269
270 #define CODA_ROOT 2
271 #define CODA_OPEN_BY_FD 3
272 #define CODA_OPEN 4
273 #define CODA_CLOSE 5
274 #define CODA_IOCTL 6
275 #define CODA_GETATTR 7
276 #define CODA_SETATTR 8
277 #define CODA_ACCESS 9
278 #define CODA_LOOKUP 10
279 #define CODA_CREATE 11
280 #define CODA_REMOVE 12
281 #define CODA_LINK 13
282 #define CODA_RENAME 14
283 #define CODA_MKDIR 15
284 #define CODA_RMDIR 16
285 #define CODA_SYMLINK 18
286 #define CODA_READLINK 19
287 #define CODA_FSYNC 20
288 #define CODA_VGET 22
289 #define CODA_SIGNAL 23
290 #define CODA_REPLACE 24 /* DOWNCALL */
291 #define CODA_FLUSH 25 /* DOWNCALL */
292 #define CODA_PURGEUSER 26 /* DOWNCALL */
293 #define CODA_ZAPFILE 27 /* DOWNCALL */
294 #define CODA_ZAPDIR 28 /* DOWNCALL */
295 #define CODA_PURGEFID 30 /* DOWNCALL */
296 #define CODA_OPEN_BY_PATH 31
297 #define CODA_RESOLVE 32
298 #define CODA_REINTEGRATE 33
299 #define CODA_STATFS 34
300 #define CODA_STORE 35
301 #define CODA_RELEASE 36
302 #define CODA_NCALLS 37
303
304 #define DOWNCALL(opcode) (opcode >= CODA_REPLACE && opcode <= CODA_PURGEFID)
305
306 #define VC_MAXDATASIZE 8192
307 #define VC_MAXMSGSIZE sizeof(union inputArgs)+sizeof(union outputArgs) +\
308 VC_MAXDATASIZE
309
310 #define CIOC_KERNEL_VERSION _IOWR('c', 10, size_t)
311
312 #if 0
313 #define CODA_KERNEL_VERSION 0 /* don't care about kernel version number */
314 #define CODA_KERNEL_VERSION 1 /* The old venus 4.6 compatible interface */
315 #endif
316 #ifdef CONFIG_CODA_FS_OLD_API
317 #define CODA_KERNEL_VERSION 2 /* venus_lookup got an extra parameter */
318 #else
319 #define CODA_KERNEL_VERSION 3 /* 128-bit file identifiers */
320 #endif
321
322 /*
323 * Venus <-> Coda RPC arguments
324 */
325 struct coda_in_hdr {
326 u_int32_t opcode;
327 u_int32_t unique; /* Keep multiple outstanding msgs distinct */
328 #ifdef CONFIG_CODA_FS_OLD_API
329 u_int16_t pid; /* Common to all */
330 u_int16_t pgid; /* Common to all */
331 u_int16_t sid; /* Common to all */
332 struct coda_cred cred; /* Common to all */
333 #else
334 pid_t pid;
335 pid_t pgid;
336 vuid_t uid;
337 #endif
338 };
339
340 /* Really important that opcode and unique are 1st two fields! */
341 struct coda_out_hdr {
342 u_int32_t opcode;
343 u_int32_t unique;
344 u_int32_t result;
345 };
346
347 /* coda_root: NO_IN */
348 struct coda_root_out {
349 struct coda_out_hdr oh;
350 struct CodaFid VFid;
351 };
352
353 struct coda_root_in {
354 struct coda_in_hdr in;
355 };
356
357 /* coda_open: */
358 struct coda_open_in {
359 struct coda_in_hdr ih;
360 struct CodaFid VFid;
361 int flags;
362 };
363
364 struct coda_open_out {
365 struct coda_out_hdr oh;
366 cdev_t dev;
367 ino_t inode;
368 };
369
370
371 /* coda_store: */
372 struct coda_store_in {
373 struct coda_in_hdr ih;
374 struct CodaFid VFid;
375 int flags;
376 };
377
378 struct coda_store_out {
379 struct coda_out_hdr out;
380 };
381
382 /* coda_release: */
383 struct coda_release_in {
384 struct coda_in_hdr ih;
385 struct CodaFid VFid;
386 int flags;
387 };
388
389 struct coda_release_out {
390 struct coda_out_hdr out;
391 };
392
393 /* coda_close: */
394 struct coda_close_in {
395 struct coda_in_hdr ih;
396 struct CodaFid VFid;
397 int flags;
398 };
399
400 struct coda_close_out {
401 struct coda_out_hdr out;
402 };
403
404 /* coda_ioctl: */
405 struct coda_ioctl_in {
406 struct coda_in_hdr ih;
407 struct CodaFid VFid;
408 int cmd;
409 int len;
410 int rwflag;
411 char *data; /* Place holder for data. */
412 };
413
414 struct coda_ioctl_out {
415 struct coda_out_hdr oh;
416 int len;
417 caddr_t data; /* Place holder for data. */
418 };
419
420
421 /* coda_getattr: */
422 struct coda_getattr_in {
423 struct coda_in_hdr ih;
424 struct CodaFid VFid;
425 };
426
427 struct coda_getattr_out {
428 struct coda_out_hdr oh;
429 struct coda_vattr attr;
430 };
431
432
433 /* coda_setattr: NO_OUT */
434 struct coda_setattr_in {
435 struct coda_in_hdr ih;
436 struct CodaFid VFid;
437 struct coda_vattr attr;
438 };
439
440 struct coda_setattr_out {
441 struct coda_out_hdr out;
442 };
443
444 /* coda_access: NO_OUT */
445 struct coda_access_in {
446 struct coda_in_hdr ih;
447 struct CodaFid VFid;
448 int flags;
449 };
450
451 struct coda_access_out {
452 struct coda_out_hdr out;
453 };
454
455
456 /* lookup flags */
457 #define CLU_CASE_SENSITIVE 0x01
458 #define CLU_CASE_INSENSITIVE 0x02
459
460 /* coda_lookup: */
461 struct coda_lookup_in {
462 struct coda_in_hdr ih;
463 struct CodaFid VFid;
464 int name; /* Place holder for data. */
465 int flags;
466 };
467
468 struct coda_lookup_out {
469 struct coda_out_hdr oh;
470 struct CodaFid VFid;
471 int vtype;
472 };
473
474
475 /* coda_create: */
476 struct coda_create_in {
477 struct coda_in_hdr ih;
478 struct CodaFid VFid;
479 struct coda_vattr attr;
480 int excl;
481 int mode;
482 int name; /* Place holder for data. */
483 };
484
485 struct coda_create_out {
486 struct coda_out_hdr oh;
487 struct CodaFid VFid;
488 struct coda_vattr attr;
489 };
490
491
492 /* coda_remove: NO_OUT */
493 struct coda_remove_in {
494 struct coda_in_hdr ih;
495 struct CodaFid VFid;
496 int name; /* Place holder for data. */
497 };
498
499 struct coda_remove_out {
500 struct coda_out_hdr out;
501 };
502
503 /* coda_link: NO_OUT */
504 struct coda_link_in {
505 struct coda_in_hdr ih;
506 struct CodaFid sourceFid; /* cnode to link *to* */
507 struct CodaFid destFid; /* Directory in which to place link */
508 int tname; /* Place holder for data. */
509 };
510
511 struct coda_link_out {
512 struct coda_out_hdr out;
513 };
514
515
516 /* coda_rename: NO_OUT */
517 struct coda_rename_in {
518 struct coda_in_hdr ih;
519 struct CodaFid sourceFid;
520 int srcname;
521 struct CodaFid destFid;
522 int destname;
523 };
524
525 struct coda_rename_out {
526 struct coda_out_hdr out;
527 };
528
529 /* coda_mkdir: */
530 struct coda_mkdir_in {
531 struct coda_in_hdr ih;
532 struct CodaFid VFid;
533 struct coda_vattr attr;
534 int name; /* Place holder for data. */
535 };
536
537 struct coda_mkdir_out {
538 struct coda_out_hdr oh;
539 struct CodaFid VFid;
540 struct coda_vattr attr;
541 };
542
543
544 /* coda_rmdir: NO_OUT */
545 struct coda_rmdir_in {
546 struct coda_in_hdr ih;
547 struct CodaFid VFid;
548 int name; /* Place holder for data. */
549 };
550
551 struct coda_rmdir_out {
552 struct coda_out_hdr out;
553 };
554
555 /* coda_symlink: NO_OUT */
556 struct coda_symlink_in {
557 struct coda_in_hdr ih;
558 struct CodaFid VFid; /* Directory to put symlink in */
559 int srcname;
560 struct coda_vattr attr;
561 int tname;
562 };
563
564 struct coda_symlink_out {
565 struct coda_out_hdr out;
566 };
567
568 /* coda_readlink: */
569 struct coda_readlink_in {
570 struct coda_in_hdr ih;
571 struct CodaFid VFid;
572 };
573
574 struct coda_readlink_out {
575 struct coda_out_hdr oh;
576 int count;
577 caddr_t data; /* Place holder for data. */
578 };
579
580
581 /* coda_fsync: NO_OUT */
582 struct coda_fsync_in {
583 struct coda_in_hdr ih;
584 struct CodaFid VFid;
585 };
586
587 struct coda_fsync_out {
588 struct coda_out_hdr out;
589 };
590
591 /* coda_vget: */
592 struct coda_vget_in {
593 struct coda_in_hdr ih;
594 struct CodaFid VFid;
595 };
596
597 struct coda_vget_out {
598 struct coda_out_hdr oh;
599 struct CodaFid VFid;
600 int vtype;
601 };
602
603
604 /* CODA_SIGNAL is out-of-band, doesn't need data. */
605 /* CODA_INVALIDATE is a venus->kernel call */
606 /* CODA_FLUSH is a venus->kernel call */
607
608 /* coda_purgeuser: */
609 /* CODA_PURGEUSER is a venus->kernel call */
610 struct coda_purgeuser_out {
611 struct coda_out_hdr oh;
612 #ifdef CONFIG_CODA_FS_OLD_API
613 struct coda_cred cred;
614 #else
615 vuid_t uid;
616 #endif
617 };
618
619 /* coda_zapfile: */
620 /* CODA_ZAPFILE is a venus->kernel call */
621 struct coda_zapfile_out {
622 struct coda_out_hdr oh;
623 struct CodaFid CodaFid;
624 };
625
626 /* coda_zapdir: */
627 /* CODA_ZAPDIR is a venus->kernel call */
628 struct coda_zapdir_out {
629 struct coda_out_hdr oh;
630 struct CodaFid CodaFid;
631 };
632
633 /* coda_purgefid: */
634 /* CODA_PURGEFID is a venus->kernel call */
635 struct coda_purgefid_out {
636 struct coda_out_hdr oh;
637 struct CodaFid CodaFid;
638 };
639
640 /* coda_replace: */
641 /* CODA_REPLACE is a venus->kernel call */
642 struct coda_replace_out { /* coda_replace is a venus->kernel call */
643 struct coda_out_hdr oh;
644 struct CodaFid NewFid;
645 struct CodaFid OldFid;
646 };
647
648 /* coda_open_by_fd: */
649 struct coda_open_by_fd_in {
650 struct coda_in_hdr ih;
651 struct CodaFid VFid;
652 int flags;
653 };
654
655 struct coda_open_by_fd_out {
656 struct coda_out_hdr oh;
657 int fd;
658
659 };
660
661 /* coda_open_by_path: */
662 struct coda_open_by_path_in {
663 struct coda_in_hdr ih;
664 struct CodaFid VFid;
665 int flags;
666 };
667
668 struct coda_open_by_path_out {
669 struct coda_out_hdr oh;
670 int path;
671 };
672
673 /* coda_statfs: NO_IN */
674 struct coda_statfs_in {
675 struct coda_in_hdr in;
676 };
677
678 struct coda_statfs_out {
679 struct coda_out_hdr oh;
680 struct coda_statfs stat;
681 };
682
683 /*
684 * Occasionally, we don't cache the fid returned by CODA_LOOKUP.
685 * For instance, if the fid is inconsistent.
686 * This case is handled by setting the top bit of the type result parameter.
687 */
688 #define CODA_NOCACHE 0x80000000
689
690 union inputArgs {
691 struct coda_in_hdr ih; /* NB: every struct below begins with an ih */
692 struct coda_open_in coda_open;
693 struct coda_store_in coda_store;
694 struct coda_release_in coda_release;
695 struct coda_close_in coda_close;
696 struct coda_ioctl_in coda_ioctl;
697 struct coda_getattr_in coda_getattr;
698 struct coda_setattr_in coda_setattr;
699 struct coda_access_in coda_access;
700 struct coda_lookup_in coda_lookup;
701 struct coda_create_in coda_create;
702 struct coda_remove_in coda_remove;
703 struct coda_link_in coda_link;
704 struct coda_rename_in coda_rename;
705 struct coda_mkdir_in coda_mkdir;
706 struct coda_rmdir_in coda_rmdir;
707 struct coda_symlink_in coda_symlink;
708 struct coda_readlink_in coda_readlink;
709 struct coda_fsync_in coda_fsync;
710 struct coda_vget_in coda_vget;
711 struct coda_open_by_fd_in coda_open_by_fd;
712 struct coda_open_by_path_in coda_open_by_path;
713 struct coda_statfs_in coda_statfs;
714 };
715
716 union outputArgs {
717 struct coda_out_hdr oh; /* NB: every struct below begins with an oh */
718 struct coda_root_out coda_root;
719 struct coda_open_out coda_open;
720 struct coda_ioctl_out coda_ioctl;
721 struct coda_getattr_out coda_getattr;
722 struct coda_lookup_out coda_lookup;
723 struct coda_create_out coda_create;
724 struct coda_mkdir_out coda_mkdir;
725 struct coda_readlink_out coda_readlink;
726 struct coda_vget_out coda_vget;
727 struct coda_purgeuser_out coda_purgeuser;
728 struct coda_zapfile_out coda_zapfile;
729 struct coda_zapdir_out coda_zapdir;
730 struct coda_purgefid_out coda_purgefid;
731 struct coda_replace_out coda_replace;
732 struct coda_open_by_fd_out coda_open_by_fd;
733 struct coda_open_by_path_out coda_open_by_path;
734 struct coda_statfs_out coda_statfs;
735 };
736
737 union coda_downcalls {
738 /* CODA_INVALIDATE is a venus->kernel call */
739 /* CODA_FLUSH is a venus->kernel call */
740 struct coda_purgeuser_out purgeuser;
741 struct coda_zapfile_out zapfile;
742 struct coda_zapdir_out zapdir;
743 struct coda_purgefid_out purgefid;
744 struct coda_replace_out replace;
745 };
746
747
748 /*
749 * Used for identifying usage of "Control" and pioctls
750 */
751
752 #define PIOCPARM_MASK 0x0000ffff
753 struct ViceIoctl {
754 void *in; /* Data to be transferred in */
755 void *out; /* Data to be transferred out */
756 u_short in_size; /* Size of input buffer <= 2K */
757 u_short out_size; /* Maximum size of output buffer, <= 2K */
758 };
759
760 struct PioctlData {
761 const char *path;
762 int follow;
763 struct ViceIoctl vi;
764 };
765
766 #define CODA_CONTROL ".CONTROL"
767 #define CODA_CONTROLLEN 8
768 #define CTL_INO -1
769
770 /* Data passed to mount */
771
772 #define CODA_MOUNT_VERSION 1
773
774 struct coda_mount_data {
775 int version;
776 int fd; /* Opened device */
777 };
778
779 #endif
780
781