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


  ______________________________________________________________________
  0wpage

  11..  IInnttrroodduuccttiioonn



  A key component in the Coda Distributed File System is the cache
  manager, _V_e_n_u_s.


  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.

  0wpage

  22..  SSeerrvviicciinngg CCooddaa ffiilleessyysstteemm ccaallllss

  The service of a request for a Coda file system service originates in
  a process P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 _r_e_a_d_, _w_r_i_t_e_, _o_p_e_n_, _c_l_o_s_e_, _c_r_e_a_t_e_, _m_k_d_i_r_, _r_m_d_i_r_, _c_h_m_o_d in a Unix
  context.  Similar calls exist in the Win32 environment, and are named
  _C_r_e_a_t_e_F_i_l_e_, .

  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.

  0wpage

  33..  TThhee mmeessssaaggee llaayyeerr



  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 _p_e_n_d_i_n_g
  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:


  +o  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.

  +o  The message is a _d_o_w_n_c_a_l_l.  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3..11..  IImmpplleemmeennttaattiioonn ddeettaaiillss

  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.

  0wpage

  44..  TThhee iinntteerrffaaccee aatt tthhee ccaallll lleevveell


  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4..11..  DDaattaa ssttrruuccttuurreess sshhaarreedd bbyy tthhee kkeerrnneell aanndd VVeennuuss


  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 */
  };



  NNOOTTEE 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 _c_e_l_l.   (-- A _c_e_l_l is a
  group 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.--)


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



  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4..22..  TThhee ppiiooccttll iinntteerrffaaccee


  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 _a_n_d 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.

  NNOOTTEE  The data structures and code are a mess.  We need to clean this
  up.

  We now proceed to document the individual calls:

  0wpage

  44..33..  rroooott


  AArrgguummeennttss

     iinn empty

     oouutt

                struct cfs_root_out {
                    ViceFid VFid;
                } cfs_root;



  DDeessccrriippttiioonn 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.

  0wpage

  44..44..  llooookkuupp


  SSuummmmaarryy Find the ViceFid and type of an object in a directory if it
  exists.

  AArrgguummeennttss

     iinn

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



     oouutt

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



  DDeessccrriippttiioonn 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.

  NNOOTTEE The type of the vtype is currently wrong.  It should be
  coda_vtype. Linux does not take note of CFS_NOCACHE.  It should.

  0wpage

  44..55..  ggeettaattttrr


  SSuummmmaarryy Get the attributes of a file.

  AArrgguummeennttss

     iinn

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



     oouutt

                struct cfs_getattr_out {
                    struct coda_vattr attr;
                } cfs_getattr;



  DDeessccrriippttiioonn This call returns the attributes of the file identified by
  fid.

  EErrrroorrss Errors can occur if the object with fid does not exist, is
  unaccessible or if the caller does not have permission to fetch
  attributes.

  NNoottee 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 _l_o_o_k_u_p and _g_e_t_a_t_t_r 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.

  0wpage

  44..66..  sseettaattttrr


  SSuummmmaarryy Set the attributes of a file.

  AArrgguummeennttss

     iinn

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




     oouutt
        empty

  DDeessccrriippttiioonn 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.

  EErrrroorrss A variety of errors can occur.  The object may not exist, may
  be inaccessible, or permission may not be granted by Venus.

  0wpage

  44..77..  aacccceessss


  SSuummmmaarryy

  AArrgguummeennttss

     iinn

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



     oouutt
        empty

  DDeessccrriippttiioonn 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 _t_o_k_e_n is held by the user.

  EErrrroorrss The object may not exist, or the ACL describing the protection
  may not be accessible.

  0wpage

  44..88..  ccrreeaattee


  SSuummmmaarryy Invoked to create a file

  AArrgguummeennttss

     iinn

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




     oouutt

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



  DDeessccrriippttiioonn  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.


  EErrrroorrss 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.

  NNOOTTEE 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.

  0wpage

  44..99..  mmkkddiirr


  SSuummmmaarryy Create a new directory.

  AArrgguummeennttss

     iinn

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



     oouutt

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




  DDeessccrriippttiioonn 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.

  EErrrroorrss As for create.

  NNOOTTEE 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.

  0wpage

  44..1100..  lliinnkk


  SSuummmmaarryy Create a link to an existing file.

  AArrgguummeennttss

     iinn

                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;



     oouutt
        empty

  DDeessccrriippttiioonn 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.

  EErrrroorrss The usual errors can occur.0wpage

  44..1111..  ssyymmlliinnkk


  SSuummmmaarryy create a symbolic link

  AArrgguummeennttss

     iinn

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



     oouutt
        none

  DDeessccrriippttiioonn 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.

  EErrrroorrss

  NNOOTTEE The attributes of the target directory should be returned since
  its size changed.

  0wpage

  44..1122..  rreemmoovvee


  SSuummmmaarryy Remove a file

  AArrgguummeennttss

     iinn

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



     oouutt
        none

  DDeessccrriippttiioonn  Remove file named cfs_remove_in.name in directory
  identified by   VFid.

  EErrrroorrss

  NNOOTTEE The attributes of the directory should be returned since its
  mtime and size may change.

  0wpage

  44..1133..  rrmmddiirr


  SSuummmmaarryy Remove a directory

  AArrgguummeennttss

     iinn

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



     oouutt
        none

  DDeessccrriippttiioonn Remove the directory with name name from the directory
  identified by VFid.

  EErrrroorrss

  NNOOTTEE The attributes of the parent directory should be returned since
  its mtime and size may change.

  0wpage

  44..1144..  rreeaaddlliinnkk


  SSuummmmaarryy Read the value of a symbolic link.

  AArrgguummeennttss

     iinn

                struct cfs_readlink_in {
                    ViceFid VFid;
                } cfs_readlink;



     oouutt

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



  DDeessccrriippttiioonn 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??).

  EErrrroorrss No unusual errors.

  0wpage

  44..1155..  ooppeenn


  SSuummmmaarryy Open a file.

  AArrgguummeennttss

     iinn

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



     oouutt

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



  DDeessccrriippttiioonn  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.
  EErrrroorrss

  NNOOTTEE 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.

  0wpage

  44..1166..  cclloossee


  SSuummmmaarryy Close a file, update it on the servers.

  AArrgguummeennttss

     iinn

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



     oouutt
        none

  DDeessccrriippttiioonn Close the file identified by VFid.

  EErrrroorrss

  NNOOTTEE 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.

  0wpage

  44..1177..  iiooccttll


  SSuummmmaarryy Do an ioctl on a file. This includes the pioctl interface.

  AArrgguummeennttss

     iinn

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



     oouutt


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



  DDeessccrriippttiioonn Do an ioctl operation on a file.  The command, len and
  data arguments are filled as usual.  flags is not used by Venus.

  EErrrroorrss

  NNOOTTEE Another bogus parameter.  flags is not used.  What is the
  business about PREFETCHING in the Venus code?


  0wpage

  44..1188..  rreennaammee


  SSuummmmaarryy Rename a fid.

  AArrgguummeennttss

     iinn

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



     oouutt
        none

  DDeessccrriippttiioonn  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.

  EErrrroorrss

  0wpage

  44..1199..  rreeaaddddiirr


  SSuummmmaarryy Read directory entries.

  AArrgguummeennttss

     iinn

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




     oouutt

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



  DDeessccrriippttiioonn 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.

  EErrrroorrss

  NNOOTTEE 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.

  0wpage

  44..2200..  vvggeett


  SSuummmmaarryy instructs Venus to do an FSDB->Get.

  AArrgguummeennttss

     iinn

                struct cfs_vget_in {
                    ViceFid VFid;
                } cfs_vget;



     oouutt

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



  DDeessccrriippttiioonn This upcall asks Venus to do a get operation on an fsobj
  labelled by VFid.

  EErrrroorrss

  NNOOTTEE 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.

  0wpage

  44..2211..  ffssyynncc


  SSuummmmaarryy Tell Venus to update the RVM attributes of a file.

  AArrgguummeennttss

     iinn

                struct cfs_fsync_in {
                    ViceFid VFid;
                } cfs_fsync;



     oouutt
        none

  DDeessccrriippttiioonn 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.

  EErrrroorrss

  NNOOTTEE Linux does not implement this call. It should.

  0wpage

  44..2222..  iinnaaccttiivvee


  SSuummmmaarryy Tell Venus a vnode is no longer in use.

  AArrgguummeennttss

     iinn

                struct cfs_inactive_in {
                    ViceFid VFid;
                } cfs_inactive;



     oouutt
        none

  DDeessccrriippttiioonn This operation returns EOPNOTSUPP.

  EErrrroorrss

  NNOOTTEE This should perhaps be removed.

  0wpage

  44..2233..  rrddwwrr


  SSuummmmaarryy Read or write from a file

  AArrgguummeennttss

     iinn

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




     oouutt

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



  DDeessccrriippttiioonn This upcall asks Venus to read or write from a file.

  EErrrroorrss

  NNOOTTEE 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.


  0wpage

  44..2244..  ooddyymmoouunntt


  SSuummmmaarryy Allows mounting multiple Coda "filesystems" on one Unix mount
  point.

  AArrgguummeennttss

     iinn

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



     oouutt

                struct ody_mount_out {
                    ViceFid VFid;
                } ody_mount;



  DDeessccrriippttiioonn  Asks Venus to return the rootfid of a Coda system named
  name.  The fid is returned in VFid.

  EErrrroorrss

  NNOOTTEE 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.

  0wpage

  44..2255..  ooddyy__llooookkuupp


  SSuummmmaarryy Looks up something.

  AArrgguummeennttss

     iinn irrelevant


     oouutt
        irrelevant

  DDeessccrriippttiioonn

  EErrrroorrss

  NNOOTTEE Gut it. Call is not implemented by Venus.

  0wpage

  44..2266..  ooddyy__eexxppaanndd


  SSuummmmaarryy expands something in a dynamic set.

  AArrgguummeennttss

     iinn irrelevant

     oouutt
        irrelevant

  DDeessccrriippttiioonn

  EErrrroorrss

  NNOOTTEE Gut it.  Call is not implemented by Venus.

  0wpage

  44..2277..  pprreeffeettcchh


  SSuummmmaarryy Prefetch a dynamic set.

  AArrgguummeennttss

     iinn Not documented.

     oouutt
        Not documented.

  DDeessccrriippttiioonn  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).

  EErrrroorrss

  NNOOTTEE Gut it. It isn't working and isn't used by Coda.


  0wpage

  44..2288..  ssiiggnnaall


  SSuummmmaarryy Send Venus a signal about an upcall.

  AArrgguummeennttss

     iinn none

     oouutt
        not applicable.

  DDeessccrriippttiioonn  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.

  EErrrroorrss No reply is given.

  NNOOTTEE 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).

  0wpage

  55..  TThhee mmiinniiccaacchhee aanndd ddoowwnnccaallllss


  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 ccnnooddeess.

  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5..11..  IINNVVAALLIIDDAATTEE


  No information is available on this call.


  55..22..  FFLLUUSSHH



  AArrgguummeennttss None

  SSuummmmaarryy Flush the name cache entirely.

  DDeessccrriippttiioonn 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5..33..  PPUURRGGEEUUSSEERR


  AArrgguummeennttss

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



  DDeessccrriippttiioonn Remove all entries in the cache carrying the Cred.  This
  call is issued when tokens for a user expire or are flushed.


  55..44..  ZZAAPPFFIILLEE


  AArrgguummeennttss

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



  DDeessccrriippttiioonn 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.

  NNOOTTEE 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..55..  ZZAAPPDDIIRR


  AArrgguummeennttss

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



  DDeessccrriippttiioonn 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5..66..  ZZAAPPVVNNOODDEE



  AArrgguummeennttss

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



  DDeessccrriippttiioonn Remove all entries in the cache carrying the cred and VFid
  as in the arguments. This downcall is probably never issued.


  55..77..  PPUURRGGEEFFIIDD


  SSuummmmaarryy

  AArrgguummeennttss

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



  DDeessccrriippttiioonn 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5..88..  RREEPPLLAACCEE


  SSuummmmaarryy Replace the Fid's for a collection of names.

  AArrgguummeennttss

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



  DDeessccrriippttiioonn 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.

  0wpage

  66..  IInniittiiaalliizzaattiioonn aanndd cclleeaannuupp


  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 _p_i_o_c_t_l passes through the VFS for Coda so we can
     treat these similarly.


  66..11..  RReeqquuiirreemmeennttss


  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.

  +o  Before opening, no messages can be placed.

  +o  Opening will remove any old messages still pending.

  +o  Close will notify any sleeping processes that their upcall cannot
     be completed.

  +o  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.

  NNOOTTEE  NetBSD in particular but also Linux have not implemented the
  above requirements fully.  For smooth operation this needs to be
  corrected.



