Subversion Repositories shark

Rev

Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed

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