WIP FPC-III support
[linux/fpc-iii.git] / Documentation / filesystems / coda.rst
blobbdde7e4e010b955159ec3a9cd145dc4849f7208d
1 .. SPDX-License-Identifier: GPL-2.0
3 ===========================
4 Coda Kernel-Venus Interface
5 ===========================
7 .. Note::
9    This is one of the technical documents describing a component of
10    Coda -- this document describes the client kernel-Venus interface.
12 For more information:
14   http://www.coda.cs.cmu.edu
16 For user level software needed to run Coda:
18   ftp://ftp.coda.cs.cmu.edu
20 To run Coda you need to get a user level cache manager for the client,
21 named Venus, as well as tools to manipulate ACLs, to log in, etc.  The
22 client needs to have the Coda filesystem selected in the kernel
23 configuration.
25 The server needs a user level server and at present does not depend on
26 kernel support.
28   The Venus kernel interface
30   Peter J. Braam
32   v1.0, Nov 9, 1997
34   This document describes the communication between Venus and kernel
35   level filesystem code needed for the operation of the Coda file sys-
36   tem.  This document version is meant to describe the current interface
37   (version 1.0) as well as improvements we envisage.
39 .. Table of Contents
41   1. Introduction
43   2. Servicing Coda filesystem calls
45   3. The message layer
47      3.1 Implementation details
49   4. The interface at the call level
51      4.1 Data structures shared by the kernel and Venus
52      4.2 The pioctl interface
53      4.3 root
54      4.4 lookup
55      4.5 getattr
56      4.6 setattr
57      4.7 access
58      4.8 create
59      4.9 mkdir
60      4.10 link
61      4.11 symlink
62      4.12 remove
63      4.13 rmdir
64      4.14 readlink
65      4.15 open
66      4.16 close
67      4.17 ioctl
68      4.18 rename
69      4.19 readdir
70      4.20 vget
71      4.21 fsync
72      4.22 inactive
73      4.23 rdwr
74      4.24 odymount
75      4.25 ody_lookup
76      4.26 ody_expand
77      4.27 prefetch
78      4.28 signal
80   5. The minicache and downcalls
82      5.1 INVALIDATE
83      5.2 FLUSH
84      5.3 PURGEUSER
85      5.4 ZAPFILE
86      5.5 ZAPDIR
87      5.6 ZAPVNODE
88      5.7 PURGEFID
89      5.8 REPLACE
91   6. Initialization and cleanup
93      6.1 Requirements
95 1. Introduction
96 ===============
98   A key component in the Coda Distributed File System is the cache
99   manager, Venus.
101   When processes on a Coda enabled system access files in the Coda
102   filesystem, requests are directed at the filesystem layer in the
103   operating system. The operating system will communicate with Venus to
104   service the request for the process.  Venus manages a persistent
105   client cache and makes remote procedure calls to Coda file servers and
106   related servers (such as authentication servers) to service these
107   requests it receives from the operating system.  When Venus has
108   serviced a request it replies to the operating system with appropriate
109   return codes, and other data related to the request.  Optionally the
110   kernel support for Coda may maintain a minicache of recently processed
111   requests to limit the number of interactions with Venus.  Venus
112   possesses the facility to inform the kernel when elements from its
113   minicache are no longer valid.
115   This document describes precisely this communication between the
116   kernel and Venus.  The definitions of so called upcalls and downcalls
117   will be given with the format of the data they handle. We shall also
118   describe the semantic invariants resulting from the calls.
120   Historically Coda was implemented in a BSD file system in Mach 2.6.
121   The interface between the kernel and Venus is very similar to the BSD
122   VFS interface.  Similar functionality is provided, and the format of
123   the parameters and returned data is very similar to the BSD VFS.  This
124   leads to an almost natural environment for implementing a kernel-level
125   filesystem driver for Coda in a BSD system.  However, other operating
126   systems such as Linux and Windows 95 and NT have virtual filesystem
127   with different interfaces.
129   To implement Coda on these systems some reverse engineering of the
130   Venus/Kernel protocol is necessary.  Also it came to light that other
131   systems could profit significantly from certain small optimizations
132   and modifications to the protocol. To facilitate this work as well as
133   to make future ports easier, communication between Venus and the
134   kernel should be documented in great detail.  This is the aim of this
135   document.
137 2.  Servicing Coda filesystem calls
138 ===================================
140   The service of a request for a Coda file system service originates in
141   a process P which accessing a Coda file. It makes a system call which
142   traps to the OS kernel. Examples of such calls trapping to the kernel
143   are ``read``, ``write``, ``open``, ``close``, ``create``, ``mkdir``,
144   ``rmdir``, ``chmod`` in a Unix ontext.  Similar calls exist in the Win32
145   environment, and are named ``CreateFile``.
147   Generally the operating system handles the request in a virtual
148   filesystem (VFS) layer, which is named I/O Manager in NT and IFS
149   manager in Windows 95.  The VFS is responsible for partial processing
150   of the request and for locating the specific filesystem(s) which will
151   service parts of the request.  Usually the information in the path
152   assists in locating the correct FS drivers.  Sometimes after extensive
153   pre-processing, the VFS starts invoking exported routines in the FS
154   driver.  This is the point where the FS specific processing of the
155   request starts, and here the Coda specific kernel code comes into
156   play.
158   The FS layer for Coda must expose and implement several interfaces.
159   First and foremost the VFS must be able to make all necessary calls to
160   the Coda FS layer, so the Coda FS driver must expose the VFS interface
161   as applicable in the operating system. These differ very significantly
162   among operating systems, but share features such as facilities to
163   read/write and create and remove objects.  The Coda FS layer services
164   such VFS requests by invoking one or more well defined services
165   offered by the cache manager Venus.  When the replies from Venus have
166   come back to the FS driver, servicing of the VFS call continues and
167   finishes with a reply to the kernel's VFS. Finally the VFS layer
168   returns to the process.
170   As a result of this design a basic interface exposed by the FS driver
171   must allow Venus to manage message traffic.  In particular Venus must
172   be able to retrieve and place messages and to be notified of the
173   arrival of a new message. The notification must be through a mechanism
174   which does not block Venus since Venus must attend to other tasks even
175   when no messages are waiting or being processed.
177   **Interfaces of the Coda FS Driver**
179   Furthermore the FS layer provides for a special path of communication
180   between a user process and Venus, called the pioctl interface. The
181   pioctl interface is used for Coda specific services, such as
182   requesting detailed information about the persistent cache managed by
183   Venus. Here the involvement of the kernel is minimal.  It identifies
184   the calling process and passes the information on to Venus.  When
185   Venus replies the response is passed back to the caller in unmodified
186   form.
188   Finally Venus allows the kernel FS driver to cache the results from
189   certain services.  This is done to avoid excessive context switches
190   and results in an efficient system.  However, Venus may acquire
191   information, for example from the network which implies that cached
192   information must be flushed or replaced. Venus then makes a downcall
193   to the Coda FS layer to request flushes or updates in the cache.  The
194   kernel FS driver handles such requests synchronously.
196   Among these interfaces the VFS interface and the facility to place,
197   receive and be notified of messages are platform specific.  We will
198   not go into the calls exported to the VFS layer but we will state the
199   requirements of the message exchange mechanism.
202 3.  The message layer
203 =====================
205   At the lowest level the communication between Venus and the FS driver
206   proceeds through messages.  The synchronization between processes
207   requesting Coda file service and Venus relies on blocking and waking
208   up processes.  The Coda FS driver processes VFS- and pioctl-requests
209   on behalf of a process P, creates messages for Venus, awaits replies
210   and finally returns to the caller.  The implementation of the exchange
211   of messages is platform specific, but the semantics have (so far)
212   appeared to be generally applicable.  Data buffers are created by the
213   FS Driver in kernel memory on behalf of P and copied to user memory in
214   Venus.
216   The FS Driver while servicing P makes upcalls to Venus.  Such an
217   upcall is dispatched to Venus by creating a message structure.  The
218   structure contains the identification of P, the message sequence
219   number, the size of the request and a pointer to the data in kernel
220   memory for the request.  Since the data buffer is re-used to hold the
221   reply from Venus, there is a field for the size of the reply.  A flags
222   field is used in the message to precisely record the status of the
223   message.  Additional platform dependent structures involve pointers to
224   determine the position of the message on queues and pointers to
225   synchronization objects.  In the upcall routine the message structure
226   is filled in, flags are set to 0, and it is placed on the *pending*
227   queue.  The routine calling upcall is responsible for allocating the
228   data buffer; its structure will be described in the next section.
230   A facility must exist to notify Venus that the message has been
231   created, and implemented using available synchronization objects in
232   the OS. This notification is done in the upcall context of the process
233   P. When the message is on the pending queue, process P cannot proceed
234   in upcall.  The (kernel mode) processing of P in the filesystem
235   request routine must be suspended until Venus has replied.  Therefore
236   the calling thread in P is blocked in upcall.  A pointer in the
237   message structure will locate the synchronization object on which P is
238   sleeping.
240   Venus detects the notification that a message has arrived, and the FS
241   driver allow Venus to retrieve the message with a getmsg_from_kernel
242   call. This action finishes in the kernel by putting the message on the
243   queue of processing messages and setting flags to READ.  Venus is
244   passed the contents of the data buffer. The getmsg_from_kernel call
245   now returns and Venus processes the request.
247   At some later point the FS driver receives a message from Venus,
248   namely when Venus calls sendmsg_to_kernel.  At this moment the Coda FS
249   driver looks at the contents of the message and decides if:
252   *  the message is a reply for a suspended thread P.  If so it removes
253      the message from the processing queue and marks the message as
254      WRITTEN.  Finally, the FS driver unblocks P (still in the kernel
255      mode context of Venus) and the sendmsg_to_kernel call returns to
256      Venus.  The process P will be scheduled at some point and continues
257      processing its upcall with the data buffer replaced with the reply
258      from Venus.
260   *  The message is a ``downcall``.  A downcall is a request from Venus to
261      the FS Driver. The FS driver processes the request immediately
262      (usually a cache eviction or replacement) and when it finishes
263      sendmsg_to_kernel returns.
265   Now P awakes and continues processing upcall.  There are some
266   subtleties to take account of. First P will determine if it was woken
267   up in upcall by a signal from some other source (for example an
268   attempt to terminate P) or as is normally the case by Venus in its
269   sendmsg_to_kernel call.  In the normal case, the upcall routine will
270   deallocate the message structure and return.  The FS routine can proceed
271   with its processing.
274   **Sleeping and IPC arrangements**
276   In case P is woken up by a signal and not by Venus, it will first look
277   at the flags field.  If the message is not yet READ, the process P can
278   handle its signal without notifying Venus.  If Venus has READ, and
279   the request should not be processed, P can send Venus a signal message
280   to indicate that it should disregard the previous message.  Such
281   signals are put in the queue at the head, and read first by Venus.  If
282   the message is already marked as WRITTEN it is too late to stop the
283   processing.  The VFS routine will now continue.  (-- If a VFS request
284   involves more than one upcall, this can lead to complicated state, an
285   extra field "handle_signals" could be added in the message structure
286   to indicate points of no return have been passed.--)
290 3.1.  Implementation details
291 ----------------------------
293   The Unix implementation of this mechanism has been through the
294   implementation of a character device associated with Coda.  Venus
295   retrieves messages by doing a read on the device, replies are sent
296   with a write and notification is through the select system call on the
297   file descriptor for the device.  The process P is kept waiting on an
298   interruptible wait queue object.
300   In Windows NT and the DPMI Windows 95 implementation a DeviceIoControl
301   call is used.  The DeviceIoControl call is designed to copy buffers
302   from user memory to kernel memory with OPCODES. The sendmsg_to_kernel
303   is issued as a synchronous call, while the getmsg_from_kernel call is
304   asynchronous.  Windows EventObjects are used for notification of
305   message arrival.  The process P is kept waiting on a KernelEvent
306   object in NT and a semaphore in Windows 95.
309 4.  The interface at the call level
310 ===================================
313   This section describes the upcalls a Coda FS driver can make to Venus.
314   Each of these upcalls make use of two structures: inputArgs and
315   outputArgs.   In pseudo BNF form the structures take the following
316   form::
319         struct inputArgs {
320             u_long opcode;
321             u_long unique;     /* Keep multiple outstanding msgs distinct */
322             u_short pid;                 /* Common to all */
323             u_short pgid;                /* Common to all */
324             struct CodaCred cred;        /* Common to all */
326             <union "in" of call dependent parts of inputArgs>
327         };
329         struct outputArgs {
330             u_long opcode;
331             u_long unique;       /* Keep multiple outstanding msgs distinct */
332             u_long result;
334             <union "out" of call dependent parts of inputArgs>
335         };
339   Before going on let us elucidate the role of the various fields. The
340   inputArgs start with the opcode which defines the type of service
341   requested from Venus. There are approximately 30 upcalls at present
342   which we will discuss.   The unique field labels the inputArg with a
343   unique number which will identify the message uniquely.  A process and
344   process group id are passed.  Finally the credentials of the caller
345   are included.
347   Before delving into the specific calls we need to discuss a variety of
348   data structures shared by the kernel and Venus.
353 4.1.  Data structures shared by the kernel and Venus
354 ----------------------------------------------------
357   The CodaCred structure defines a variety of user and group ids as
358   they are set for the calling process. The vuid_t and vgid_t are 32 bit
359   unsigned integers.  It also defines group membership in an array.  On
360   Unix the CodaCred has proven sufficient to implement good security
361   semantics for Coda but the structure may have to undergo modification
362   for the Windows environment when these mature::
364         struct CodaCred {
365             vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, effective, set, fs uid */
366             vgid_t cr_gid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */
367             vgid_t cr_groups[NGROUPS];        /* Group membership for caller */
368         };
371   .. Note::
373      It is questionable if we need CodaCreds in Venus. Finally Venus
374      doesn't know about groups, although it does create files with the
375      default uid/gid.  Perhaps the list of group membership is superfluous.
378   The next item is the fundamental identifier used to identify Coda
379   files, the ViceFid.  A fid of a file uniquely defines a file or
380   directory in the Coda filesystem within a cell [1]_::
382         typedef struct ViceFid {
383             VolumeId Volume;
384             VnodeId Vnode;
385             Unique_t Unique;
386         } ViceFid;
388   .. [1] A cell is agroup of Coda servers acting under the aegis of a single
389          system control machine or SCM. See the Coda Administration manual
390          for a detailed description of the role of the SCM.
392   Each of the constituent fields: VolumeId, VnodeId and Unique_t are
393   unsigned 32 bit integers.  We envisage that a further field will need
394   to be prefixed to identify the Coda cell; this will probably take the
395   form of a Ipv6 size IP address naming the Coda cell through DNS.
397   The next important structure shared between Venus and the kernel is
398   the attributes of the file.  The following structure is used to
399   exchange information.  It has room for future extensions such as
400   support for device files (currently not present in Coda)::
403         struct coda_timespec {
404                 int64_t         tv_sec;         /* seconds */
405                 long            tv_nsec;        /* nanoseconds */
406         };
408         struct coda_vattr {
409                 enum coda_vtype va_type;        /* vnode type (for create) */
410                 u_short         va_mode;        /* files access mode and type */
411                 short           va_nlink;       /* number of references to file */
412                 vuid_t          va_uid;         /* owner user id */
413                 vgid_t          va_gid;         /* owner group id */
414                 long            va_fsid;        /* file system id (dev for now) */
415                 long            va_fileid;      /* file id */
416                 u_quad_t        va_size;        /* file size in bytes */
417                 long            va_blocksize;   /* blocksize preferred for i/o */
418                 struct coda_timespec va_atime;  /* time of last access */
419                 struct coda_timespec va_mtime;  /* time of last modification */
420                 struct coda_timespec va_ctime;  /* time file changed */
421                 u_long          va_gen;         /* generation number of file */
422                 u_long          va_flags;       /* flags defined for file */
423                 dev_t           va_rdev;        /* device special file represents */
424                 u_quad_t        va_bytes;       /* bytes of disk space held by file */
425                 u_quad_t        va_filerev;     /* file modification number */
426                 u_int           va_vaflags;     /* operations flags, see below */
427                 long            va_spare;       /* remain quad aligned */
428         };
431 4.2.  The pioctl interface
432 --------------------------
435   Coda specific requests can be made by application through the pioctl
436   interface. The pioctl is implemented as an ordinary ioctl on a
437   fictitious file /coda/.CONTROL.  The pioctl call opens this file, gets
438   a file handle and makes the ioctl call. Finally it closes the file.
440   The kernel involvement in this is limited to providing the facility to
441   open and close and pass the ioctl message and to verify that a path in
442   the pioctl data buffers is a file in a Coda filesystem.
444   The kernel is handed a data packet of the form::
446         struct {
447             const char *path;
448             struct ViceIoctl vidata;
449             int follow;
450         } data;
454   where::
457         struct ViceIoctl {
458                 caddr_t in, out;        /* Data to be transferred in, or out */
459                 short in_size;          /* Size of input buffer <= 2K */
460                 short out_size;         /* Maximum size of output buffer, <= 2K */
461         };
465   The path must be a Coda file, otherwise the ioctl upcall will not be
466   made.
468   .. Note:: The data structures and code are a mess.  We need to clean this up.
471 **We now proceed to document the individual calls**:
474 4.3.  root
475 ----------
478   Arguments
479      in
481         empty
483      out::
485                 struct cfs_root_out {
486                     ViceFid VFid;
487                 } cfs_root;
491   Description
492     This call is made to Venus during the initialization of
493     the Coda filesystem. If the result is zero, the cfs_root structure
494     contains the ViceFid of the root of the Coda filesystem. If a non-zero
495     result is generated, its value is a platform dependent error code
496     indicating the difficulty Venus encountered in locating the root of
497     the Coda filesystem.
499 4.4.  lookup
500 ------------
503   Summary
504     Find the ViceFid and type of an object in a directory if it exists.
506   Arguments
507      in::
509                 struct  cfs_lookup_in {
510                     ViceFid     VFid;
511                     char        *name;          /* Place holder for data. */
512                 } cfs_lookup;
516      out::
518                 struct cfs_lookup_out {
519                     ViceFid VFid;
520                     int vtype;
521                 } cfs_lookup;
525   Description
526     This call is made to determine the ViceFid and filetype of
527     a directory entry.  The directory entry requested carries name 'name'
528     and Venus will search the directory identified by cfs_lookup_in.VFid.
529     The result may indicate that the name does not exist, or that
530     difficulty was encountered in finding it (e.g. due to disconnection).
531     If the result is zero, the field cfs_lookup_out.VFid contains the
532     targets ViceFid and cfs_lookup_out.vtype the coda_vtype giving the
533     type of object the name designates.
535   The name of the object is an 8 bit character string of maximum length
536   CFS_MAXNAMLEN, currently set to 256 (including a 0 terminator.)
538   It is extremely important to realize that Venus bitwise ors the field
539   cfs_lookup.vtype with CFS_NOCACHE to indicate that the object should
540   not be put in the kernel name cache.
542   .. Note::
544      The type of the vtype is currently wrong.  It should be
545      coda_vtype. Linux does not take note of CFS_NOCACHE.  It should.
548 4.5.  getattr
549 -------------
552   Summary Get the attributes of a file.
554   Arguments
555      in::
557                 struct cfs_getattr_in {
558                     ViceFid VFid;
559                     struct coda_vattr attr; /* XXXXX */
560                 } cfs_getattr;
564      out::
566                 struct cfs_getattr_out {
567                     struct coda_vattr attr;
568                 } cfs_getattr;
572   Description
573     This call returns the attributes of the file identified by fid.
575   Errors
576     Errors can occur if the object with fid does not exist, is
577     unaccessible or if the caller does not have permission to fetch
578     attributes.
580   .. Note::
582      Many kernel FS drivers (Linux, NT and Windows 95) need to acquire
583      the attributes as well as the Fid for the instantiation of an internal
584      "inode" or "FileHandle".  A significant improvement in performance on
585      such systems could be made by combining the lookup and getattr calls
586      both at the Venus/kernel interaction level and at the RPC level.
588   The vattr structure included in the input arguments is superfluous and
589   should be removed.
592 4.6.  setattr
593 -------------
596   Summary
597     Set the attributes of a file.
599   Arguments
600      in::
602                 struct cfs_setattr_in {
603                     ViceFid VFid;
604                     struct coda_vattr attr;
605                 } cfs_setattr;
610      out
612         empty
614   Description
615     The structure attr is filled with attributes to be changed
616     in BSD style.  Attributes not to be changed are set to -1, apart from
617     vtype which is set to VNON. Other are set to the value to be assigned.
618     The only attributes which the FS driver may request to change are the
619     mode, owner, groupid, atime, mtime and ctime.  The return value
620     indicates success or failure.
622   Errors
623     A variety of errors can occur.  The object may not exist, may
624     be inaccessible, or permission may not be granted by Venus.
627 4.7.  access
628 ------------
631   Arguments
632      in::
634                 struct cfs_access_in {
635                     ViceFid     VFid;
636                     int flags;
637                 } cfs_access;
641      out
643         empty
645   Description
646     Verify if access to the object identified by VFid for
647     operations described by flags is permitted.  The result indicates if
648     access will be granted.  It is important to remember that Coda uses
649     ACLs to enforce protection and that ultimately the servers, not the
650     clients enforce the security of the system.  The result of this call
651     will depend on whether a token is held by the user.
653   Errors
654     The object may not exist, or the ACL describing the protection
655     may not be accessible.
658 4.8.  create
659 ------------
662   Summary
663     Invoked to create a file
665   Arguments
666      in::
668                 struct cfs_create_in {
669                     ViceFid VFid;
670                     struct coda_vattr attr;
671                     int excl;
672                     int mode;
673                     char        *name;          /* Place holder for data. */
674                 } cfs_create;
679      out::
681                 struct cfs_create_out {
682                     ViceFid VFid;
683                     struct coda_vattr attr;
684                 } cfs_create;
688   Description
689     This upcall is invoked to request creation of a file.
690     The file will be created in the directory identified by VFid, its name
691     will be name, and the mode will be mode.  If excl is set an error will
692     be returned if the file already exists.  If the size field in attr is
693     set to zero the file will be truncated.  The uid and gid of the file
694     are set by converting the CodaCred to a uid using a macro CRTOUID
695     (this macro is platform dependent).  Upon success the VFid and
696     attributes of the file are returned.  The Coda FS Driver will normally
697     instantiate a vnode, inode or file handle at kernel level for the new
698     object.
701   Errors
702     A variety of errors can occur. Permissions may be insufficient.
703     If the object exists and is not a file the error EISDIR is returned
704     under Unix.
706   .. Note::
708      The packing of parameters is very inefficient and appears to
709      indicate confusion between the system call creat and the VFS operation
710      create. The VFS operation create is only called to create new objects.
711      This create call differs from the Unix one in that it is not invoked
712      to return a file descriptor. The truncate and exclusive options,
713      together with the mode, could simply be part of the mode as it is
714      under Unix.  There should be no flags argument; this is used in open
715      (2) to return a file descriptor for READ or WRITE mode.
717   The attributes of the directory should be returned too, since the size
718   and mtime changed.
721 4.9.  mkdir
722 -----------
725   Summary
726     Create a new directory.
728   Arguments
729      in::
731                 struct cfs_mkdir_in {
732                     ViceFid     VFid;
733                     struct coda_vattr attr;
734                     char        *name;          /* Place holder for data. */
735                 } cfs_mkdir;
739      out::
741                 struct cfs_mkdir_out {
742                     ViceFid VFid;
743                     struct coda_vattr attr;
744                 } cfs_mkdir;
749   Description
750     This call is similar to create but creates a directory.
751     Only the mode field in the input parameters is used for creation.
752     Upon successful creation, the attr returned contains the attributes of
753     the new directory.
755   Errors
756     As for create.
758   .. Note::
760      The input parameter should be changed to mode instead of
761      attributes.
763   The attributes of the parent should be returned since the size and
764   mtime changes.
767 4.10.  link
768 -----------
771   Summary
772     Create a link to an existing file.
774   Arguments
775      in::
777                 struct cfs_link_in {
778                     ViceFid sourceFid;          /* cnode to link *to* */
779                     ViceFid destFid;            /* Directory in which to place link */
780                     char        *tname;         /* Place holder for data. */
781                 } cfs_link;
785      out
787         empty
789   Description
790     This call creates a link to the sourceFid in the directory
791     identified by destFid with name tname.  The source must reside in the
792     target's parent, i.e. the source must be have parent destFid, i.e. Coda
793     does not support cross directory hard links.  Only the return value is
794     relevant.  It indicates success or the type of failure.
796   Errors
797     The usual errors can occur.
800 4.11.  symlink
801 --------------
804   Summary
805     create a symbolic link
807   Arguments
808      in::
810                 struct cfs_symlink_in {
811                     ViceFid     VFid;          /* Directory to put symlink in */
812                     char        *srcname;
813                     struct coda_vattr attr;
814                     char        *tname;
815                 } cfs_symlink;
819      out
821         none
823   Description
824     Create a symbolic link. The link is to be placed in the
825     directory identified by VFid and named tname.  It should point to the
826     pathname srcname.  The attributes of the newly created object are to
827     be set to attr.
829   .. Note::
831      The attributes of the target directory should be returned since
832      its size changed.
835 4.12.  remove
836 -------------
839   Summary
840     Remove a file
842   Arguments
843      in::
845                 struct cfs_remove_in {
846                     ViceFid     VFid;
847                     char        *name;          /* Place holder for data. */
848                 } cfs_remove;
852      out
854         none
856   Description
857     Remove file named cfs_remove_in.name in directory
858     identified by   VFid.
861   .. Note::
863      The attributes of the directory should be returned since its
864      mtime and size may change.
867 4.13.  rmdir
868 ------------
871   Summary
872     Remove a directory
874   Arguments
875      in::
877                 struct cfs_rmdir_in {
878                     ViceFid     VFid;
879                     char        *name;          /* Place holder for data. */
880                 } cfs_rmdir;
884      out
886         none
888   Description
889     Remove the directory with name 'name' from the directory
890     identified by VFid.
892   .. Note:: The attributes of the parent directory should be returned since
893             its mtime and size may change.
896 4.14.  readlink
897 ---------------
900   Summary
901     Read the value of a symbolic link.
903   Arguments
904      in::
906                 struct cfs_readlink_in {
907                     ViceFid VFid;
908                 } cfs_readlink;
912      out::
914                 struct cfs_readlink_out {
915                     int count;
916                     caddr_t     data;           /* Place holder for data. */
917                 } cfs_readlink;
921   Description
922     This routine reads the contents of symbolic link
923     identified by VFid into the buffer data.  The buffer data must be able
924     to hold any name up to CFS_MAXNAMLEN (PATH or NAM??).
926   Errors
927     No unusual errors.
930 4.15.  open
931 -----------
934   Summary
935     Open a file.
937   Arguments
938      in::
940                 struct cfs_open_in {
941                     ViceFid     VFid;
942                     int flags;
943                 } cfs_open;
947      out::
949                 struct cfs_open_out {
950                     dev_t       dev;
951                     ino_t       inode;
952                 } cfs_open;
956   Description
957     This request asks Venus to place the file identified by
958     VFid in its cache and to note that the calling process wishes to open
959     it with flags as in open(2).  The return value to the kernel differs
960     for Unix and Windows systems.  For Unix systems the Coda FS Driver is
961     informed of the device and inode number of the container file in the
962     fields dev and inode.  For Windows the path of the container file is
963     returned to the kernel.
966   .. Note::
968      Currently the cfs_open_out structure is not properly adapted to
969      deal with the Windows case.  It might be best to implement two
970      upcalls, one to open aiming at a container file name, the other at a
971      container file inode.
974 4.16.  close
975 ------------
978   Summary
979     Close a file, update it on the servers.
981   Arguments
982      in::
984                 struct cfs_close_in {
985                     ViceFid     VFid;
986                     int flags;
987                 } cfs_close;
991      out
993         none
995   Description
996     Close the file identified by VFid.
998   .. Note::
1000      The flags argument is bogus and not used.  However, Venus' code
1001      has room to deal with an execp input field, probably this field should
1002      be used to inform Venus that the file was closed but is still memory
1003      mapped for execution.  There are comments about fetching versus not
1004      fetching the data in Venus vproc_vfscalls.  This seems silly.  If a
1005      file is being closed, the data in the container file is to be the new
1006      data.  Here again the execp flag might be in play to create confusion:
1007      currently Venus might think a file can be flushed from the cache when
1008      it is still memory mapped.  This needs to be understood.
1011 4.17.  ioctl
1012 ------------
1015   Summary
1016     Do an ioctl on a file. This includes the pioctl interface.
1018   Arguments
1019      in::
1021                 struct cfs_ioctl_in {
1022                     ViceFid VFid;
1023                     int cmd;
1024                     int len;
1025                     int rwflag;
1026                     char *data;                 /* Place holder for data. */
1027                 } cfs_ioctl;
1031      out::
1034                 struct cfs_ioctl_out {
1035                     int len;
1036                     caddr_t     data;           /* Place holder for data. */
1037                 } cfs_ioctl;
1041   Description
1042     Do an ioctl operation on a file.  The command, len and
1043     data arguments are filled as usual.  flags is not used by Venus.
1045   .. Note::
1047      Another bogus parameter.  flags is not used.  What is the
1048      business about PREFETCHING in the Venus code?
1052 4.18.  rename
1053 -------------
1056   Summary
1057     Rename a fid.
1059   Arguments
1060      in::
1062                 struct cfs_rename_in {
1063                     ViceFid     sourceFid;
1064                     char        *srcname;
1065                     ViceFid destFid;
1066                     char        *destname;
1067                 } cfs_rename;
1071      out
1073         none
1075   Description
1076     Rename the object with name srcname in directory
1077     sourceFid to destname in destFid.   It is important that the names
1078     srcname and destname are 0 terminated strings.  Strings in Unix
1079     kernels are not always null terminated.
1082 4.19.  readdir
1083 --------------
1086   Summary
1087     Read directory entries.
1089   Arguments
1090      in::
1092                 struct cfs_readdir_in {
1093                     ViceFid     VFid;
1094                     int count;
1095                     int offset;
1096                 } cfs_readdir;
1101      out::
1103                 struct cfs_readdir_out {
1104                     int size;
1105                     caddr_t     data;           /* Place holder for data. */
1106                 } cfs_readdir;
1110   Description
1111     Read directory entries from VFid starting at offset and
1112     read at most count bytes.  Returns the data in data and returns
1113     the size in size.
1116   .. Note::
1118      This call is not used.  Readdir operations exploit container
1119      files.  We will re-evaluate this during the directory revamp which is
1120      about to take place.
1123 4.20.  vget
1124 -----------
1127   Summary
1128     instructs Venus to do an FSDB->Get.
1130   Arguments
1131      in::
1133                 struct cfs_vget_in {
1134                     ViceFid VFid;
1135                 } cfs_vget;
1139      out::
1141                 struct cfs_vget_out {
1142                     ViceFid VFid;
1143                     int vtype;
1144                 } cfs_vget;
1148   Description
1149     This upcall asks Venus to do a get operation on an fsobj
1150     labelled by VFid.
1152   .. Note::
1154      This operation is not used.  However, it is extremely useful
1155      since it can be used to deal with read/write memory mapped files.
1156      These can be "pinned" in the Venus cache using vget and released with
1157      inactive.
1160 4.21.  fsync
1161 ------------
1164   Summary
1165     Tell Venus to update the RVM attributes of a file.
1167   Arguments
1168      in::
1170                 struct cfs_fsync_in {
1171                     ViceFid VFid;
1172                 } cfs_fsync;
1176      out
1178         none
1180   Description
1181     Ask Venus to update RVM attributes of object VFid. This
1182     should be called as part of kernel level fsync type calls.  The
1183     result indicates if the syncing was successful.
1185   .. Note:: Linux does not implement this call. It should.
1188 4.22.  inactive
1189 ---------------
1192   Summary
1193     Tell Venus a vnode is no longer in use.
1195   Arguments
1196      in::
1198                 struct cfs_inactive_in {
1199                     ViceFid VFid;
1200                 } cfs_inactive;
1204      out
1206         none
1208   Description
1209     This operation returns EOPNOTSUPP.
1211   .. Note:: This should perhaps be removed.
1214 4.23.  rdwr
1215 -----------
1218   Summary
1219     Read or write from a file
1221   Arguments
1222      in::
1224                 struct cfs_rdwr_in {
1225                     ViceFid     VFid;
1226                     int rwflag;
1227                     int count;
1228                     int offset;
1229                     int ioflag;
1230                     caddr_t     data;           /* Place holder for data. */
1231                 } cfs_rdwr;
1236      out::
1238                 struct cfs_rdwr_out {
1239                     int rwflag;
1240                     int count;
1241                     caddr_t     data;   /* Place holder for data. */
1242                 } cfs_rdwr;
1246   Description
1247     This upcall asks Venus to read or write from a file.
1250   .. Note::
1252     It should be removed since it is against the Coda philosophy that
1253     read/write operations never reach Venus.  I have been told the
1254     operation does not work.  It is not currently used.
1258 4.24.  odymount
1259 ---------------
1262   Summary
1263     Allows mounting multiple Coda "filesystems" on one Unix mount point.
1265   Arguments
1266      in::
1268                 struct ody_mount_in {
1269                     char        *name;          /* Place holder for data. */
1270                 } ody_mount;
1274      out::
1276                 struct ody_mount_out {
1277                     ViceFid VFid;
1278                 } ody_mount;
1282   Description
1283     Asks Venus to return the rootfid of a Coda system named
1284     name.  The fid is returned in VFid.
1286   .. Note::
1288      This call was used by David for dynamic sets.  It should be
1289      removed since it causes a jungle of pointers in the VFS mounting area.
1290      It is not used by Coda proper.  Call is not implemented by Venus.
1293 4.25.  ody_lookup
1294 -----------------
1297   Summary
1298     Looks up something.
1300   Arguments
1301      in
1303         irrelevant
1306      out
1308         irrelevant
1311   .. Note:: Gut it. Call is not implemented by Venus.
1314 4.26.  ody_expand
1315 -----------------
1318   Summary
1319     expands something in a dynamic set.
1321   Arguments
1322      in
1324         irrelevant
1326      out
1328         irrelevant
1330   .. Note:: Gut it. Call is not implemented by Venus.
1333 4.27.  prefetch
1334 ---------------
1337   Summary
1338     Prefetch a dynamic set.
1340   Arguments
1342      in
1344         Not documented.
1346      out
1348         Not documented.
1350   Description
1351     Venus worker.cc has support for this call, although it is
1352     noted that it doesn't work.  Not surprising, since the kernel does not
1353     have support for it. (ODY_PREFETCH is not a defined operation).
1356   .. Note:: Gut it. It isn't working and isn't used by Coda.
1360 4.28.  signal
1361 -------------
1364   Summary
1365     Send Venus a signal about an upcall.
1367   Arguments
1368      in
1370         none
1372      out
1374         not applicable.
1376   Description
1377     This is an out-of-band upcall to Venus to inform Venus
1378     that the calling process received a signal after Venus read the
1379     message from the input queue.  Venus is supposed to clean up the
1380     operation.
1382   Errors
1383     No reply is given.
1385   .. Note::
1387      We need to better understand what Venus needs to clean up and if
1388      it is doing this correctly.  Also we need to handle multiple upcall
1389      per system call situations correctly.  It would be important to know
1390      what state changes in Venus take place after an upcall for which the
1391      kernel is responsible for notifying Venus to clean up (e.g. open
1392      definitely is such a state change, but many others are maybe not).
1395 5.  The minicache and downcalls
1396 ===============================
1399   The Coda FS Driver can cache results of lookup and access upcalls, to
1400   limit the frequency of upcalls.  Upcalls carry a price since a process
1401   context switch needs to take place.  The counterpart of caching the
1402   information is that Venus will notify the FS Driver that cached
1403   entries must be flushed or renamed.
1405   The kernel code generally has to maintain a structure which links the
1406   internal file handles (called vnodes in BSD, inodes in Linux and
1407   FileHandles in Windows) with the ViceFid's which Venus maintains.  The
1408   reason is that frequent translations back and forth are needed in
1409   order to make upcalls and use the results of upcalls.  Such linking
1410   objects are called cnodes.
1412   The current minicache implementations have cache entries which record
1413   the following:
1415   1. the name of the file
1417   2. the cnode of the directory containing the object
1419   3. a list of CodaCred's for which the lookup is permitted.
1421   4. the cnode of the object
1423   The lookup call in the Coda FS Driver may request the cnode of the
1424   desired object from the cache, by passing its name, directory and the
1425   CodaCred's of the caller.  The cache will return the cnode or indicate
1426   that it cannot be found.  The Coda FS Driver must be careful to
1427   invalidate cache entries when it modifies or removes objects.
1429   When Venus obtains information that indicates that cache entries are
1430   no longer valid, it will make a downcall to the kernel.  Downcalls are
1431   intercepted by the Coda FS Driver and lead to cache invalidations of
1432   the kind described below.  The Coda FS Driver does not return an error
1433   unless the downcall data could not be read into kernel memory.
1436 5.1.  INVALIDATE
1437 ----------------
1440   No information is available on this call.
1443 5.2.  FLUSH
1444 -----------
1448   Arguments
1449     None
1451   Summary
1452     Flush the name cache entirely.
1454   Description
1455     Venus issues this call upon startup and when it dies. This
1456     is to prevent stale cache information being held.  Some operating
1457     systems allow the kernel name cache to be switched off dynamically.
1458     When this is done, this downcall is made.
1461 5.3.  PURGEUSER
1462 ---------------
1465   Arguments
1466     ::
1468           struct cfs_purgeuser_out {/* CFS_PURGEUSER is a venus->kernel call */
1469               struct CodaCred cred;
1470           } cfs_purgeuser;
1474   Description
1475     Remove all entries in the cache carrying the Cred.  This
1476     call is issued when tokens for a user expire or are flushed.
1479 5.4.  ZAPFILE
1480 -------------
1483   Arguments
1484     ::
1486           struct cfs_zapfile_out {  /* CFS_ZAPFILE is a venus->kernel call */
1487               ViceFid CodaFid;
1488           } cfs_zapfile;
1492   Description
1493     Remove all entries which have the (dir vnode, name) pair.
1494     This is issued as a result of an invalidation of cached attributes of
1495     a vnode.
1497   .. Note::
1499      Call is not named correctly in NetBSD and Mach.  The minicache
1500      zapfile routine takes different arguments. Linux does not implement
1501      the invalidation of attributes correctly.
1505 5.5.  ZAPDIR
1506 ------------
1509   Arguments
1510     ::
1512           struct cfs_zapdir_out {   /* CFS_ZAPDIR is a venus->kernel call */
1513               ViceFid CodaFid;
1514           } cfs_zapdir;
1518   Description
1519     Remove all entries in the cache lying in a directory
1520     CodaFid, and all children of this directory. This call is issued when
1521     Venus receives a callback on the directory.
1524 5.6.  ZAPVNODE
1525 --------------
1529   Arguments
1530     ::
1532           struct cfs_zapvnode_out { /* CFS_ZAPVNODE is a venus->kernel call */
1533               struct CodaCred cred;
1534               ViceFid VFid;
1535           } cfs_zapvnode;
1539   Description
1540     Remove all entries in the cache carrying the cred and VFid
1541     as in the arguments. This downcall is probably never issued.
1544 5.7.  PURGEFID
1545 --------------
1548   Arguments
1549     ::
1551           struct cfs_purgefid_out { /* CFS_PURGEFID is a venus->kernel call */
1552               ViceFid CodaFid;
1553           } cfs_purgefid;
1557   Description
1558     Flush the attribute for the file. If it is a dir (odd
1559     vnode), purge its children from the namecache and remove the file from the
1560     namecache.
1564 5.8.  REPLACE
1565 -------------
1568   Summary
1569     Replace the Fid's for a collection of names.
1571   Arguments
1572     ::
1574           struct cfs_replace_out { /* cfs_replace is a venus->kernel call */
1575               ViceFid NewFid;
1576               ViceFid OldFid;
1577           } cfs_replace;
1581   Description
1582     This routine replaces a ViceFid in the name cache with
1583     another.  It is added to allow Venus during reintegration to replace
1584     locally allocated temp fids while disconnected with global fids even
1585     when the reference counts on those fids are not zero.
1588 6.  Initialization and cleanup
1589 ==============================
1592   This section gives brief hints as to desirable features for the Coda
1593   FS Driver at startup and upon shutdown or Venus failures.  Before
1594   entering the discussion it is useful to repeat that the Coda FS Driver
1595   maintains the following data:
1598   1. message queues
1600   2. cnodes
1602   3. name cache entries
1604      The name cache entries are entirely private to the driver, so they
1605      can easily be manipulated.   The message queues will generally have
1606      clear points of initialization and destruction.  The cnodes are
1607      much more delicate.  User processes hold reference counts in Coda
1608      filesystems and it can be difficult to clean up the cnodes.
1610   It can expect requests through:
1612   1. the message subsystem
1614   2. the VFS layer
1616   3. pioctl interface
1618      Currently the pioctl passes through the VFS for Coda so we can
1619      treat these similarly.
1622 6.1.  Requirements
1623 ------------------
1626   The following requirements should be accommodated:
1628   1. The message queues should have open and close routines.  On Unix
1629      the opening of the character devices are such routines.
1631     -  Before opening, no messages can be placed.
1633     -  Opening will remove any old messages still pending.
1635     -  Close will notify any sleeping processes that their upcall cannot
1636        be completed.
1638     -  Close will free all memory allocated by the message queues.
1641   2. At open the namecache shall be initialized to empty state.
1643   3. Before the message queues are open, all VFS operations will fail.
1644      Fortunately this can be achieved by making sure than mounting the
1645      Coda filesystem cannot succeed before opening.
1647   4. After closing of the queues, no VFS operations can succeed.  Here
1648      one needs to be careful, since a few operations (lookup,
1649      read/write, readdir) can proceed without upcalls.  These must be
1650      explicitly blocked.
1652   5. Upon closing the namecache shall be flushed and disabled.
1654   6. All memory held by cnodes can be freed without relying on upcalls.
1656   7. Unmounting the file system can be done without relying on upcalls.
1658   8. Mounting the Coda filesystem should fail gracefully if Venus cannot
1659      get the rootfid or the attributes of the rootfid.  The latter is
1660      best implemented by Venus fetching these objects before attempting
1661      to mount.
1663   .. Note::
1665      NetBSD in particular but also Linux have not implemented the
1666      above requirements fully.  For smooth operation this needs to be
1667      corrected.