.. SPDX-License-Identifier: GPL-2.0

===========================
Coda Kernel-Venus Interface
===========================

.. Note::

   This is one of the technical documents describing a component of
   Coda -- this document describes the client kernel-Venus interface.

For more information:

  http://www.coda.cs.cmu.edu

For user level software needed to run Coda:

  ftp://ftp.coda.cs.cmu.edu

To run Coda you need to get a user level cache manager for the client,
named Venus, as well as tools to manipulate ACLs, to log in, etc.  The
client needs to have the Coda filesystem selected in the kernel
configuration.

The server needs a user level server and at present does not depend on
kernel support.

  The Venus kernel interface

  Peter J. Braam

  v1.0, Nov 9, 1997

  This document describes the communication between Venus and kernel
  level filesystem code needed for the operation of the Coda file sys-
  tem.  This document version is meant to describe the current interface
  (version 1.0) as well as improvements we envisage.

.. Table of Contents

  1. Introduction

  2. Servicing Coda filesystem calls

  3. The message layer

     3.1 Implementation details

  4. The interface at the call level

     4.1 Data structures shared by the kernel and Venus
     4.2 The pioctl interface
     4.3 root
     4.4 lookup
     4.5 getattr
     4.6 setattr
     4.7 access
     4.8 create
     4.9 mkdir
     4.10 link
     4.11 symlink
     4.12 remove
     4.13 rmdir
     4.14 readlink
     4.15 open
     4.16 close
     4.17 ioctl
     4.18 rename
     4.19 readdir
     4.20 vget
     4.21 fsync
     4.22 inactive
     4.23 rdwr
     4.24 odymount
     4.25 ody_lookup
     4.26 ody_expand
     4.27 prefetch
     4.28 signal

  5. The minicache and downcalls

     5.1 INVALIDATE
     5.2 FLUSH
     5.3 PURGEUSER
     5.4 ZAPFILE
     5.5 ZAPDIR
     5.6 ZAPVNODE
     5.7 PURGEFID
     5.8 REPLACE

  6. Initialization and cleanup

     6.1 Requirements

1. Introduction
===============

  A key component in the Coda Distributed File System is the cache
  manager, Venus.

  When processes on a Coda enabled system access files in the Coda
  filesystem, requests are directed at the filesystem layer in the
  operating system. The operating system will communicate with Venus to
  service the request for the process.  Venus manages a persistent
  client cache and makes remote procedure calls to Coda file servers and
  related servers (such as authentication servers) to service these
  requests it receives from the operating system.  When Venus has
  serviced a request it replies to the operating system with appropriate
  return codes, and other data related to the request.  Optionally the
  kernel support for Coda may maintain a minicache of recently processed
  requests to limit the number of interactions with Venus.  Venus
  possesses the facility to inform the kernel when elements from its
  minicache are no longer valid.

  This document describes precisely this communication between the
  kernel and Venus.  The definitions of so called upcalls and downcalls
  will be given with the format of the data they handle. We shall also
  describe the semantic invariants resulting from the calls.

  Historically Coda was implemented in a BSD file system in Mach 2.6.
  The interface between the kernel and Venus is very similar to the BSD
  VFS interface.  Similar functionality is provided, and the format of
  the parameters and returned data is very similar to the BSD VFS.  This
  leads to an almost natural environment for implementing a kernel-level
  filesystem driver for Coda in a BSD system.  However, other operating
  systems such as Linux and Windows 95 and NT have virtual filesystem
  with different interfaces.

  To implement Coda on these systems some reverse engineering of the
  Venus/Kernel protocol is necessary.  Also it came to light that other
  systems could profit significantly from certain small optimizations
  and modifications to the protocol. To facilitate this work as well as
  to make future ports easier, communication between Venus and the
  kernel should be documented in great detail.  This is the aim of this
  document.

2.  Servicing Coda filesystem calls
===================================

  The service of a request for a Coda file system service originates in
  a process P which accessing a Coda file. It makes a system call which
  traps to the OS kernel. Examples of such calls trapping to the kernel
  are ``read``, ``write``, ``open``, ``close``, ``create``, ``mkdir``,
  ``rmdir``, ``chmod`` in a Unix ontext.  Similar calls exist in the Win32
  environment, and are named ``CreateFile``.

  Generally the operating system handles the request in a virtual
  filesystem (VFS) layer, which is named I/O Manager in NT and IFS
  manager in Windows 95.  The VFS is responsible for partial processing
  of the request and for locating the specific filesystem(s) which will
  service parts of the request.  Usually the information in the path
  assists in locating the correct FS drivers.  Sometimes after extensive
  pre-processing, the VFS starts invoking exported routines in the FS
  driver.  This is the point where the FS specific processing of the
  request starts, and here the Coda specific kernel code comes into
  play.

  The FS layer for Coda must expose and implement several interfaces.
  First and foremost the VFS must be able to make all necessary calls to
  the Coda FS layer, so the Coda FS driver must expose the VFS interface
  as applicable in the operating system. These differ very significantly
  among operating systems, but share features such as facilities to
  read/write and create and remove objects.  The Coda FS layer services
  such VFS requests by invoking one or more well defined services
  offered by the cache manager Venus.  When the replies from Venus have
  come back to the FS driver, servicing of the VFS call continues and
  finishes with a reply to the kernel's VFS. Finally the VFS layer
  returns to the process.

  As a result of this design a basic interface exposed by the FS driver
  must allow Venus to manage message traffic.  In particular Venus must
  be able to retrieve and place messages and to be notified of the
  arrival of a new message. The notification must be through a mechanism
  which does not block Venus since Venus must attend to other tasks even
  when no messages are waiting or being processed.

  **Interfaces of the Coda FS Driver**

  Furthermore the FS layer provides for a special path of communication
  between a user process and Venus, called the pioctl interface. The
  pioctl interface is used for Coda specific services, such as
  requesting detailed information about the persistent cache managed by
  Venus. Here the involvement of the kernel is minimal.  It identifies
  the calling process and passes the information on to Venus.  When
  Venus replies the response is passed back to the caller in unmodified
  form.

  Finally Venus allows the kernel FS driver to cache the results from
  certain services.  This is done to avoid excessive context switches
  and results in an efficient system.  However, Venus may acquire
  information, for example from the network which implies that cached
  information must be flushed or replaced. Venus then makes a downcall
  to the Coda FS layer to request flushes or updates in the cache.  The
  kernel FS driver handles such requests synchronously.

  Among these interfaces the VFS interface and the facility to place,
  receive and be notified of messages are platform specific.  We will
  not go into the calls exported to the VFS layer but we will state the
  requirements of the message exchange mechanism.


3.  The message layer
=====================

  At the lowest level the communication between Venus and the FS driver
  proceeds through messages.  The synchronization between processes
  requesting Coda file service and Venus relies on blocking and waking
  up processes.  The Coda FS driver processes VFS- and pioctl-requests
  on behalf of a process P, creates messages for Venus, awaits replies
  and finally returns to the caller.  The implementation of the exchange
  of messages is platform specific, but the semantics have (so far)
  appeared to be generally applicable.  Data buffers are created by the
  FS Driver in kernel memory on behalf of P and copied to user memory in
  Venus.

  The FS Driver while servicing P makes upcalls to Venus.  Such an
  upcall is dispatched to Venus by creating a message structure.  The
  structure contains the identification of P, the message sequence
  number, the size of the request and a pointer to the data in kernel
  memory for the request.  Since the data buffer is re-used to hold the
  reply from Venus, there is a field for the size of the reply.  A flags
  field is used in the message to precisely record the status of the
  message.  Additional platform dependent structures involve pointers to
  determine the position of the message on queues and pointers to
  synchronization objects.  In the upcall routine the message structure
  is filled in, flags are set to 0, and it is placed on the *pending*
  queue.  The routine calling upcall is responsible for allocating the
  data buffer; its structure will be described in the next section.

  A facility must exist to notify Venus that the message has been
  created, and implemented using available synchronization objects in
  the OS. This notification is done in the upcall context of the process
  P. When the message is on the pending queue, process P cannot proceed
  in upcall.  The (kernel mode) processing of P in the filesystem
  request routine must be suspended until Venus has replied.  Therefore
  the calling thread in P is blocked in upcall.  A pointer in the
  message structure will locate the synchronization object on which P is
  sleeping.

  Venus detects the notification that a message has arrived, and the FS
  driver allow Venus to retrieve the message with a getmsg_from_kernel
  call. This action finishes in the kernel by putting the message on the
  queue of processing messages and setting flags to READ.  Venus is
  passed the contents of the data buffer. The getmsg_from_kernel call
  now returns and Venus processes the request.

  At some later point the FS driver receives a message from Venus,
  namely when Venus calls sendmsg_to_kernel.  At this moment the Coda FS
  driver looks at the contents of the message and decides if:


  *  the message is a reply for a suspended thread P.  If so it removes
     the message from the processing queue and marks the message as
     WRITTEN.  Finally, the FS driver unblocks P (still in the kernel
     mode context of Venus) and the sendmsg_to_kernel call returns to
     Venus.  The process P will be scheduled at some point and continues
     processing its upcall with the data buffer replaced with the reply
     from Venus.

  *  The message is a ``downcall``.  A downcall is a request from Venus to
     the FS Driver. The FS driver processes the request immediately
     (usually a cache eviction or replacement) and when it finishes
     sendmsg_to_kernel returns.

  Now P awakes and continues processing upcall.  There are some
  subtleties to take account of. First P will determine if it was woken
  up in upcall by a signal from some other source (for example an
  attempt to terminate P) or as is normally the case by Venus in its
  sendmsg_to_kernel call.  In the normal case, the upcall routine will
  deallocate the message structure and return.  The FS routine can proceed
  with its processing.


  **Sleeping and IPC arrangements**

  In case P is woken up by a signal and not by Venus, it will first look
  at the flags field.  If the message is not yet READ, the process P can
  handle its signal without notifying Venus.  If Venus has READ, and
  the request should not be processed, P can send Venus a signal message
  to indicate that it should disregard the previous message.  Such
  signals are put in the queue at the head, and read first by Venus.  If
  the message is already marked as WRITTEN it is too late to stop the
  processing.  The VFS routine will now continue.  (-- If a VFS request
  involves more than one upcall, this can lead to complicated state, an
  extra field "handle_signals" could be added in the message structure
  to indicate points of no return have been passed.--)



3.1.  Implementation details
----------------------------

  The Unix implementation of this mechanism has been through the
  implementation of a character device associated with Coda.  Venus
  retrieves messages by doing a read on the device, replies are sent
  with a write and notification is through the select system call on the
  file descriptor for the device.  The process P is kept waiting on an
  interruptible wait queue object.

  In Windows NT and the DPMI Windows 95 implementation a DeviceIoControl
  call is used.  The DeviceIoControl call is designed to copy buffers
  from user memory to kernel memory with OPCODES. The sendmsg_to_kernel
  is issued as a synchronous call, while the getmsg_from_kernel call is
  asynchronous.  Windows EventObjects are used for notification of
  message arrival.  The process P is kept waiting on a KernelEvent
  object in NT and a semaphore in Windows 95.


4.  The interface at the call level
===================================


  This section describes the upcalls a Coda FS driver can make to Venus.
  Each of these upcalls make use of two structures: inputArgs and
  outputArgs.   In pseudo BNF form the structures take the following
  form::


	struct inputArgs {
	    u_long opcode;
	    u_long unique;     /* Keep multiple outstanding msgs distinct */
	    u_short pid;                 /* Common to all */
	    u_short pgid;                /* Common to all */
	    struct CodaCred cred;        /* Common to all */

	    <union "in" of call dependent parts of inputArgs>
	};

	struct outputArgs {
	    u_long opcode;
	    u_long unique;       /* Keep multiple outstanding msgs distinct */
	    u_long result;

	    <union "out" of call dependent parts of inputArgs>
	};



  Before going on let us elucidate the role of the various fields. The
  inputArgs start with the opcode which defines the type of service
  requested from Venus. There are approximately 30 upcalls at present
  which we will discuss.   The unique field labels the inputArg with a
  unique number which will identify the message uniquely.  A process and
  process group id are passed.  Finally the credentials of the caller
  are included.

  Before delving into the specific calls we need to discuss a variety of
  data structures shared by the kernel and Venus.




4.1.  Data structures shared by the kernel and Venus
----------------------------------------------------


  The CodaCred structure defines a variety of user and group ids as
  they are set for the calling process. The vuid_t and vgid_t are 32 bit
  unsigned integers.  It also defines group membership in an array.  On
  Unix the CodaCred has proven sufficient to implement good security
  semantics for Coda but the structure may have to undergo modification
  for the Windows environment when these mature::

	struct CodaCred {
	    vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, effective, set, fs uid */
	    vgid_t cr_gid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */
	    vgid_t cr_groups[NGROUPS];        /* Group membership for caller */
	};


  .. Note::

     It is questionable if we need CodaCreds in Venus. Finally Venus
     doesn't know about groups, although it does create files with the
     default uid/gid.  Perhaps the list of group membership is superfluous.


  The next item is the fundamental identifier used to identify Coda
  files, the ViceFid.  A fid of a file uniquely defines a file or
  directory in the Coda filesystem within a cell [1]_::

	typedef struct ViceFid {
	    VolumeId Volume;
	    VnodeId Vnode;
	    Unique_t Unique;
	} ViceFid;

  .. [1] A cell is agroup of Coda servers acting under the aegis of a single
	 system control machine or SCM. See the Coda Administration manual
	 for a detailed description of the role of the SCM.

  Each of the constituent fields: VolumeId, VnodeId and Unique_t are
  unsigned 32 bit integers.  We envisage that a further field will need
  to be prefixed to identify the Coda cell; this will probably take the
  form of a Ipv6 size IP address naming the Coda cell through DNS.

  The next important structure shared between Venus and the kernel is
  the attributes of the file.  The following structure is used to
  exchange information.  It has room for future extensions such as
  support for device files (currently not present in Coda)::


	struct coda_timespec {
		int64_t         tv_sec;         /* seconds */
		long            tv_nsec;        /* nanoseconds */
	};

	struct coda_vattr {
		enum coda_vtype va_type;        /* vnode type (for create) */
		u_short         va_mode;        /* files access mode and type */
		short           va_nlink;       /* number of references to file */
		vuid_t          va_uid;         /* owner user id */
		vgid_t          va_gid;         /* owner group id */
		long            va_fsid;        /* file system id (dev for now) */
		long            va_fileid;      /* file id */
		u_quad_t        va_size;        /* file size in bytes */
		long            va_blocksize;   /* blocksize preferred for i/o */
		struct coda_timespec va_atime;  /* time of last access */
		struct coda_timespec va_mtime;  /* time of last modification */
		struct coda_timespec va_ctime;  /* time file changed */
		u_long          va_gen;         /* generation number of file */
		u_long          va_flags;       /* flags defined for file */
		dev_t           va_rdev;        /* device special file represents */
		u_quad_t        va_bytes;       /* bytes of disk space held by file */
		u_quad_t        va_filerev;     /* file modification number */
		u_int           va_vaflags;     /* operations flags, see below */
		long            va_spare;       /* remain quad aligned */
	};


4.2.  The pioctl interface
--------------------------


  Coda specific requests can be made by application through the pioctl
  interface. The pioctl is implemented as an ordinary ioctl on a
  fictitious file /coda/.CONTROL.  The pioctl call opens this file, gets
  a file handle and makes the ioctl call. Finally it closes the file.

  The kernel involvement in this is limited to providing the facility to
  open and close and pass the ioctl message and to verify that a path in
  the pioctl data buffers is a file in a Coda filesystem.

  The kernel is handed a data packet of the form::

	struct {
	    const char *path;
	    struct ViceIoctl vidata;
	    int follow;
	} data;



  where::


	struct ViceIoctl {
		caddr_t in, out;        /* Data to be transferred in, or out */
		short in_size;          /* Size of input buffer <= 2K */
		short out_size;         /* Maximum size of output buffer, <= 2K */
	};



  The path must be a Coda file, otherwise the ioctl upcall will not be
  made.

  .. Note:: The data structures and code are a mess.  We need to clean this up.


**We now proceed to document the individual calls**:


4.3.  root
----------


  Arguments
     in

	empty

     out::

		struct cfs_root_out {
		    ViceFid VFid;
		} cfs_root;



  Description
    This call is made to Venus during the initialization of
    the Coda filesystem. If the result is zero, the cfs_root structure
    contains the ViceFid of the root of the Coda filesystem. If a non-zero
    result is generated, its value is a platform dependent error code
    indicating the difficulty Venus encountered in locating the root of
    the Coda filesystem.

4.4.  lookup
------------


  Summary
    Find the ViceFid and type of an object in a directory if it exists.

  Arguments
     in::

		struct  cfs_lookup_in {
		    ViceFid     VFid;
		    char        *name;          /* Place holder for data. */
		} cfs_lookup;



     out::

		struct cfs_lookup_out {
		    ViceFid VFid;
		    int vtype;
		} cfs_lookup;



  Description
    This call is made to determine the ViceFid and filetype of
    a directory entry.  The directory entry requested carries name name
    and Venus will search the directory identified by cfs_lookup_in.VFid.
    The result may indicate that the name does not exist, or that
    difficulty was encountered in finding it (e.g. due to disconnection).
    If the result is zero, the field cfs_lookup_out.VFid contains the
    targets ViceFid and cfs_lookup_out.vtype the coda_vtype giving the
    type of object the name designates.

  The name of the object is an 8 bit character string of maximum length
  CFS_MAXNAMLEN, currently set to 256 (including a 0 terminator.)

  It is extremely important to realize that Venus bitwise ors the field
  cfs_lookup.vtype with CFS_NOCACHE to indicate that the object should
  not be put in the kernel name cache.

  .. Note::

     The type of the vtype is currently wrong.  It should be
     coda_vtype. Linux does not take note of CFS_NOCACHE.  It should.


4.5.  getattr
-------------


  Summary Get the attributes of a file.

  Arguments
     in::

		struct cfs_getattr_in {
		    ViceFid VFid;
		    struct coda_vattr attr; /* XXXXX */
		} cfs_getattr;



     out::

		struct cfs_getattr_out {
		    struct coda_vattr attr;
		} cfs_getattr;



  Description
    This call returns the attributes of the file identified by fid.

  Errors
    Errors can occur if the object with fid does not exist, is
    unaccessible or if the caller does not have permission to fetch
    attributes.

  .. Note::

     Many kernel FS drivers (Linux, NT and Windows 95) need to acquire
     the attributes as well as the Fid for the instantiation of an internal
     "inode" or "FileHandle".  A significant improvement in performance on
     such systems could be made by combining the lookup and getattr calls
     both at the Venus/kernel interaction level and at the RPC level.

  The vattr structure included in the input arguments is superfluous and
  should be removed.


4.6.  setattr
-------------


  Summary
    Set the attributes of a file.

  Arguments
     in::

		struct cfs_setattr_in {
		    ViceFid VFid;
		    struct coda_vattr attr;
		} cfs_setattr;




     out

	empty

  Description
    The structure attr is filled with attributes to be changed
    in BSD style.  Attributes not to be changed are set to -1, apart from
    vtype which is set to VNON. Other are set to the value to be assigned.
    The only attributes which the FS driver may request to change are the
    mode, owner, groupid, atime, mtime and ctime.  The return value
    indicates success or failure.

  Errors
    A variety of errors can occur.  The object may not exist, may
    be inaccessible, or permission may not be granted by Venus.


4.7.  access
------------


  Arguments
     in::

		struct cfs_access_in {
		    ViceFid     VFid;
		    int flags;
		} cfs_access;



     out

	empty

  Description
    Verify if access to the object identified by VFid for
    operations described by flags is permitted.  The result indicates if
    access will be granted.  It is important to remember that Coda uses
    ACLs to enforce protection and that ultimately the servers, not the
    clients enforce the security of the system.  The result of this call
    will depend on whether a token is held by the user.

  Errors
    The object may not exist, or the ACL describing the protection
    may not be accessible.


4.8.  create
------------


  Summary
    Invoked to create a file

  Arguments
     in::

		struct cfs_create_in {
		    ViceFid VFid;
		    struct coda_vattr attr;
		    int excl;
		    int mode;
		    char        *name;          /* Place holder for data. */
		} cfs_create;




     out::

		struct cfs_create_out {
		    ViceFid VFid;
		    struct coda_vattr attr;
		} cfs_create;



  Description
    This upcall is invoked to request creation of a file.
    The file will be created in the directory identified by VFid, its name
    will be name, and the mode will be mode.  If excl is set an error will
    be returned if the file already exists.  If the size field in attr is
    set to zero the file will be truncated.  The uid and gid of the file
    are set by converting the CodaCred to a uid using a macro CRTOUID
    (this macro is platform dependent).  Upon success the VFid and
    attributes of the file are returned.  The Coda FS Driver will normally
    instantiate a vnode, inode or file handle at kernel level for the new
    object.


  Errors
    A variety of errors can occur. Permissions may be insufficient.
    If the object exists and is not a file the error EISDIR is returned
    under Unix.

  .. Note::

     The packing of parameters is very inefficient and appears to
     indicate confusion between the system call creat and the VFS operation
     create. The VFS operation create is only called to create new objects.
     This create call differs from the Unix one in that it is not invoked
     to return a file descriptor. The truncate and exclusive options,
     together with the mode, could simply be part of the mode as it is
     under Unix.  There should be no flags argument; this is used in open
     (2) to return a file descriptor for READ or WRITE mode.

  The attributes of the directory should be returned too, since the size
  and mtime changed.


4.9.  mkdir
-----------


  Summary
    Create a new directory.

  Arguments
     in::

		struct cfs_mkdir_in {
		    ViceFid     VFid;
		    struct coda_vattr attr;
		    char        *name;          /* Place holder for data. */
		} cfs_mkdir;



     out::

		struct cfs_mkdir_out {
		    ViceFid VFid;
		    struct coda_vattr attr;
		} cfs_mkdir;




  Description
    This call is similar to create but creates a directory.
    Only the mode field in the input parameters is used for creation.
    Upon successful creation, the attr returned contains the attributes of
    the new directory.

  Errors
    As for create.

  .. Note::

     The input parameter should be changed to mode instead of
     attributes.

  The attributes of the parent should be returned since the size and
  mtime changes.


4.10.  link
-----------


  Summary
    Create a link to an existing file.

  Arguments
     in::

		struct cfs_link_in {
		    ViceFid sourceFid;          /* cnode to link *to* */
		    ViceFid destFid;            /* Directory in which to place link */
		    char        *tname;         /* Place holder for data. */
		} cfs_link;



     out

	empty

  Description
    This call creates a link to the sourceFid in the directory
    identified by destFid with name tname.  The source must reside in the
    target's parent, i.e. the source must be have parent destFid, i.e. Coda
    does not support cross directory hard links.  Only the return value is
    relevant.  It indicates success or the type of failure.

  Errors
    The usual errors can occur.


4.11.  symlink
--------------


  Summary
    create a symbolic link

  Arguments
     in::

		struct cfs_symlink_in {
		    ViceFid     VFid;          /* Directory to put symlink in */
		    char        *srcname;
		    struct coda_vattr attr;
		    char        *tname;
		} cfs_symlink;



     out

	none

  Description
    Create a symbolic link. The link is to be placed in the
    directory identified by VFid and named tname.  It should point to the
    pathname srcname.  The attributes of the newly created object are to
    be set to attr.

  .. Note::

     The attributes of the target directory should be returned since
     its size changed.


4.12.  remove
-------------


  Summary
    Remove a file

  Arguments
     in::

		struct cfs_remove_in {
		    ViceFid     VFid;
		    char        *name;          /* Place holder for data. */
		} cfs_remove;



     out

	none

  Description
    Remove file named cfs_remove_in.name in directory
    identified by   VFid.


  .. Note::

     The attributes of the directory should be returned since its
     mtime and size may change.


4.13.  rmdir
------------


  Summary
    Remove a directory

  Arguments
     in::

		struct cfs_rmdir_in {
		    ViceFid     VFid;
		    char        *name;          /* Place holder for data. */
		} cfs_rmdir;



     out

	none

  Description
    Remove the directory with name name from the directory
    identified by VFid.

  .. Note:: The attributes of the parent directory should be returned since
	    its mtime and size may change.


4.14.  readlink
---------------


  Summary
    Read the value of a symbolic link.

  Arguments
     in::

		struct cfs_readlink_in {
		    ViceFid VFid;
		} cfs_readlink;



     out::

		struct cfs_readlink_out {
		    int count;
		    caddr_t     data;           /* Place holder for data. */
		} cfs_readlink;



  Description
    This routine reads the contents of symbolic link
    identified by VFid into the buffer data.  The buffer data must be able
    to hold any name up to CFS_MAXNAMLEN (PATH or NAM??).

  Errors
    No unusual errors.


4.15.  open
-----------


  Summary
    Open a file.

  Arguments
     in::

		struct cfs_open_in {
		    ViceFid     VFid;
		    int flags;
		} cfs_open;



     out::

		struct cfs_open_out {
		    dev_t       dev;
		    ino_t       inode;
		} cfs_open;



  Description
    This request asks Venus to place the file identified by
    VFid in its cache and to note that the calling process wishes to open
    it with flags as in open(2).  The return value to the kernel differs
    for Unix and Windows systems.  For Unix systems the Coda FS Driver is
    informed of the device and inode number of the container file in the
    fields dev and inode.  For Windows the path of the container file is
    returned to the kernel.


  .. Note::

     Currently the cfs_open_out structure is not properly adapted to
     deal with the Windows case.  It might be best to implement two
     upcalls, one to open aiming at a container file name, the other at a
     container file inode.


4.16.  close
------------


  Summary
    Close a file, update it on the servers.

  Arguments
     in::

		struct cfs_close_in {
		    ViceFid     VFid;
		    int flags;
		} cfs_close;



     out

	none

  Description
    Close the file identified by VFid.

  .. Note::

     The flags argument is bogus and not used.  However, Venus' code
     has room to deal with an execp input field, probably this field should
     be used to inform Venus that the file was closed but is still memory
     mapped for execution.  There are comments about fetching versus not
     fetching the data in Venus vproc_vfscalls.  This seems silly.  If a
     file is being closed, the data in the container file is to be the new
     data.  Here again the execp flag might be in play to create confusion:
     currently Venus might think a file can be flushed from the cache when
     it is still memory mapped.  This needs to be understood.


4.17.  ioctl
------------


  Summary
    Do an ioctl on a file. This includes the pioctl interface.

  Arguments
     in::

		struct cfs_ioctl_in {
		    ViceFid VFid;
		    int cmd;
		    int len;
		    int rwflag;
		    char *data;                 /* Place holder for data. */
		} cfs_ioctl;



     out::


		struct cfs_ioctl_out {
		    int len;
		    caddr_t     data;           /* Place holder for data. */
		} cfs_ioctl;



  Description
    Do an ioctl operation on a file.  The command, len and
    data arguments are filled as usual.  flags is not used by Venus.

  .. Note::

     Another bogus parameter.  flags is not used.  What is the
     business about PREFETCHING in the Venus code?



4.18.  rename
-------------


  Summary
    Rename a fid.

  Arguments
     in::

		struct cfs_rename_in {
		    ViceFid     sourceFid;
		    char        *srcname;
		    ViceFid destFid;
		    char        *destname;
		} cfs_rename;



     out

	none

  Description
    Rename the object with name srcname in directory
    sourceFid to destname in destFid.   It is important that the names
    srcname and destname are 0 terminated strings.  Strings in Unix
    kernels are not always null terminated.


4.19.  readdir
--------------


  Summary
    Read directory entries.

  Arguments
     in::

		struct cfs_readdir_in {
		    ViceFid     VFid;
		    int count;
		    int offset;
		} cfs_readdir;




     out::

		struct cfs_readdir_out {
		    int size;
		    caddr_t     data;           /* Place holder for data. */
		} cfs_readdir;



  Description
    Read directory entries from VFid starting at offset and
    read at most count bytes.  Returns the data in data and returns
    the size in size.


  .. Note::

     This call is not used.  Readdir operations exploit container
     files.  We will re-evaluate this during the directory revamp which is
     about to take place.


4.20.  vget
-----------


  Summary
    instructs Venus to do an FSDB->Get.

  Arguments
     in::

		struct cfs_vget_in {
		    ViceFid VFid;
		} cfs_vget;



     out::

		struct cfs_vget_out {
		    ViceFid VFid;
		    int vtype;
		} cfs_vget;



  Description
    This upcall asks Venus to do a get operation on an fsobj
    labelled by VFid.

  .. Note::

     This operation is not used.  However, it is extremely useful
     since it can be used to deal with read/write memory mapped files.
     These can be "pinned" in the Venus cache using vget and released with
     inactive.


4.21.  fsync
------------


  Summary
    Tell Venus to update the RVM attributes of a file.

  Arguments
     in::

		struct cfs_fsync_in {
		    ViceFid VFid;
		} cfs_fsync;



     out

	none

  Description
    Ask Venus to update RVM attributes of object VFid. This
    should be called as part of kernel level fsync type calls.  The
    result indicates if the syncing was successful.

  .. Note:: Linux does not implement this call. It should.


4.22.  inactive
---------------


  Summary
    Tell Venus a vnode is no longer in use.

  Arguments
     in::

		struct cfs_inactive_in {
		    ViceFid VFid;
		} cfs_inactive;



     out

	none

  Description
    This operation returns EOPNOTSUPP.

  .. Note:: This should perhaps be removed.


4.23.  rdwr
-----------


  Summary
    Read or write from a file

  Arguments
     in::

		struct cfs_rdwr_in {
		    ViceFid     VFid;
		    int rwflag;
		    int count;
		    int offset;
		    int ioflag;
		    caddr_t     data;           /* Place holder for data. */
		} cfs_rdwr;




     out::

		struct cfs_rdwr_out {
		    int rwflag;
		    int count;
		    caddr_t     data;   /* Place holder for data. */
		} cfs_rdwr;



  Description
    This upcall asks Venus to read or write from a file.


  .. Note::

    It should be removed since it is against the Coda philosophy that
    read/write operations never reach Venus.  I have been told the
    operation does not work.  It is not currently used.



4.24.  odymount
---------------


  Summary
    Allows mounting multiple Coda "filesystems" on one Unix mount point.

  Arguments
     in::

		struct ody_mount_in {
		    char        *name;          /* Place holder for data. */
		} ody_mount;



     out::

		struct ody_mount_out {
		    ViceFid VFid;
		} ody_mount;



  Description
    Asks Venus to return the rootfid of a Coda system named
    name.  The fid is returned in VFid.

  .. Note::

     This call was used by David for dynamic sets.  It should be
     removed since it causes a jungle of pointers in the VFS mounting area.
     It is not used by Coda proper.  Call is not implemented by Venus.


4.25.  ody_lookup
-----------------


  Summary
    Looks up something.

  Arguments
     in

	irrelevant


     out

	irrelevant


  .. Note:: Gut it. Call is not implemented by Venus.


4.26.  ody_expand
-----------------


  Summary
    expands something in a dynamic set.

  Arguments
     in

	irrelevant

     out

	irrelevant

  .. Note:: Gut it. Call is not implemented by Venus.


4.27.  prefetch
---------------


  Summary
    Prefetch a dynamic set.

  Arguments

     in

	Not documented.

     out

	Not documented.

  Description
    Venus worker.cc has support for this call, although it is
    noted that it doesn't work.  Not surprising, since the kernel does not
    have support for it. (ODY_PREFETCH is not a defined operation).


  .. Note:: Gut it. It isn't working and isn't used by Coda.



4.28.  signal
-------------


  Summary
    Send Venus a signal about an upcall.

  Arguments
     in

	none

     out

	not applicable.

  Description
    This is an out-of-band upcall to Venus to inform Venus
    that the calling process received a signal after Venus read the
    message from the input queue.  Venus is supposed to clean up the
    operation.

  Errors
    No reply is given.

  .. Note::

     We need to better understand what Venus needs to clean up and if
     it is doing this correctly.  Also we need to handle multiple upcall
     per system call situations correctly.  It would be important to know
     what state changes in Venus take place after an upcall for which the
     kernel is responsible for notifying Venus to clean up (e.g. open
     definitely is such a state change, but many others are maybe not).


5.  The minicache and downcalls
===============================


  The Coda FS Driver can cache results of lookup and access upcalls, to
  limit the frequency of upcalls.  Upcalls carry a price since a process
  context switch needs to take place.  The counterpart of caching the
  information is that Venus will notify the FS Driver that cached
  entries must be flushed or renamed.

  The kernel code generally has to maintain a structure which links the
  internal file handles (called vnodes in BSD, inodes in Linux and
  FileHandles in Windows) with the ViceFid's which Venus maintains.  The
  reason is that frequent translations back and forth are needed in
  order to make upcalls and use the results of upcalls.  Such linking
  objects are called cnodes.

  The current minicache implementations have cache entries which record
  the following:

  1. the name of the file

  2. the cnode of the directory containing the object

  3. a list of CodaCred's for which the lookup is permitted.

  4. the cnode of the object

  The lookup call in the Coda FS Driver may request the cnode of the
  desired object from the cache, by passing its name, directory and the
  CodaCred's of the caller.  The cache will return the cnode or indicate
  that it cannot be found.  The Coda FS Driver must be careful to
  invalidate cache entries when it modifies or removes objects.

  When Venus obtains information that indicates that cache entries are
  no longer valid, it will make a downcall to the kernel.  Downcalls are
  intercepted by the Coda FS Driver and lead to cache invalidations of
  the kind described below.  The Coda FS Driver does not return an error
  unless the downcall data could not be read into kernel memory.


5.1.  INVALIDATE
----------------


  No information is available on this call.


5.2.  FLUSH
-----------



  Arguments
    None

  Summary
    Flush the name cache entirely.

  Description
    Venus issues this call upon startup and when it dies. This
    is to prevent stale cache information being held.  Some operating
    systems allow the kernel name cache to be switched off dynamically.
    When this is done, this downcall is made.


5.3.  PURGEUSER
---------------


  Arguments
    ::

	  struct cfs_purgeuser_out {/* CFS_PURGEUSER is a venus->kernel call */
	      struct CodaCred cred;
	  } cfs_purgeuser;



  Description
    Remove all entries in the cache carrying the Cred.  This
    call is issued when tokens for a user expire or are flushed.


5.4.  ZAPFILE
-------------


  Arguments
    ::

	  struct cfs_zapfile_out {  /* CFS_ZAPFILE is a venus->kernel call */
	      ViceFid CodaFid;
	  } cfs_zapfile;



  Description
    Remove all entries which have the (dir vnode, name) pair.
    This is issued as a result of an invalidation of cached attributes of
    a vnode.

  .. Note::

     Call is not named correctly in NetBSD and Mach.  The minicache
     zapfile routine takes different arguments. Linux does not implement
     the invalidation of attributes correctly.



5.5.  ZAPDIR
------------


  Arguments
    ::

	  struct cfs_zapdir_out {   /* CFS_ZAPDIR is a venus->kernel call */
	      ViceFid CodaFid;
	  } cfs_zapdir;



  Description
    Remove all entries in the cache lying in a directory
    CodaFid, and all children of this directory. This call is issued when
    Venus receives a callback on the directory.


5.6.  ZAPVNODE
--------------



  Arguments
    ::

	  struct cfs_zapvnode_out { /* CFS_ZAPVNODE is a venus->kernel call */
	      struct CodaCred cred;
	      ViceFid VFid;
	  } cfs_zapvnode;



  Description
    Remove all entries in the cache carrying the cred and VFid
    as in the arguments. This downcall is probably never issued.


5.7.  PURGEFID
--------------


  Arguments
    ::

	  struct cfs_purgefid_out { /* CFS_PURGEFID is a venus->kernel call */
	      ViceFid CodaFid;
	  } cfs_purgefid;



  Description
    Flush the attribute for the file. If it is a dir (odd
    vnode), purge its children from the namecache and remove the file from the
    namecache.



5.8.  REPLACE
-------------


  Summary
    Replace the Fid's for a collection of names.

  Arguments
    ::

	  struct cfs_replace_out { /* cfs_replace is a venus->kernel call */
	      ViceFid NewFid;
	      ViceFid OldFid;
	  } cfs_replace;



  Description
    This routine replaces a ViceFid in the name cache with
    another.  It is added to allow Venus during reintegration to replace
    locally allocated temp fids while disconnected with global fids even
    when the reference counts on those fids are not zero.


6.  Initialization and cleanup
==============================


  This section gives brief hints as to desirable features for the Coda
  FS Driver at startup and upon shutdown or Venus failures.  Before
  entering the discussion it is useful to repeat that the Coda FS Driver
  maintains the following data:


  1. message queues

  2. cnodes

  3. name cache entries

     The name cache entries are entirely private to the driver, so they
     can easily be manipulated.   The message queues will generally have
     clear points of initialization and destruction.  The cnodes are
     much more delicate.  User processes hold reference counts in Coda
     filesystems and it can be difficult to clean up the cnodes.

  It can expect requests through:

  1. the message subsystem

  2. the VFS layer

  3. pioctl interface

     Currently the pioctl passes through the VFS for Coda so we can
     treat these similarly.


6.1.  Requirements
------------------


  The following requirements should be accommodated:

  1. The message queues should have open and close routines.  On Unix
     the opening of the character devices are such routines.

    -  Before opening, no messages can be placed.

    -  Opening will remove any old messages still pending.

    -  Close will notify any sleeping processes that their upcall cannot
       be completed.

    -  Close will free all memory allocated by the message queues.


  2. At open the namecache shall be initialized to empty state.

  3. Before the message queues are open, all VFS operations will fail.
     Fortunately this can be achieved by making sure than mounting the
     Coda filesystem cannot succeed before opening.

  4. After closing of the queues, no VFS operations can succeed.  Here
     one needs to be careful, since a few operations (lookup,
     read/write, readdir) can proceed without upcalls.  These must be
     explicitly blocked.

  5. Upon closing the namecache shall be flushed and disabled.

  6. All memory held by cnodes can be freed without relying on upcalls.

  7. Unmounting the file system can be done without relying on upcalls.

  8. Mounting the Coda filesystem should fail gracefully if Venus cannot
     get the rootfid or the attributes of the rootfid.  The latter is
     best implemented by Venus fetching these objects before attempting
     to mount.

  .. Note::

     NetBSD in particular but also Linux have not implemented the
     above requirements fully.  For smooth operation this needs to be
     corrected.



