1674 lines
		
	
	
	
		
			49 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			1674 lines
		
	
	
	
		
			49 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | 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 | |||
|  | 
 | |||
|  |   11..  IInnttrroodduuccttiioonn | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   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 | |||
|  | 
 | |||
|  |   22..  SSeerrvviicciinngg CCooddaa ffiilleessyysstteemm ccaallllss | |||
|  | 
 | |||
|  |   The service of a request for a Coda file system service originates in | |||
|  |   a process PP 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 | |||
|  | 
 | |||
|  |   33..  TThhee mmeessssaaggee llaayyeerr | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   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.--) | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   33..11..  IImmpplleemmeennttaattiioonn ddeettaaiillss | |||
|  | 
 | |||
|  |   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 | |||
|  | 
 | |||
|  |   44..  TThhee iinntteerrffaaccee aatt tthhee ccaallll lleevveell | |||
|  | 
 | |||
|  | 
 | |||
|  |   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. | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   44..11..  DDaattaa ssttrruuccttuurreess sshhaarreedd bbyy tthhee kkeerrnneell aanndd VVeennuuss | |||
|  | 
 | |||
|  | 
 | |||
|  |   The CodaCred structure defines a variety of user and group ids as | |||
|  |   they are set for the calling process. The vuid_t and guid_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 */ | |||
|  |   }; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   NNOOTTEE 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_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 timespec va_atime;       /* time of last access */ | |||
|  |           struct timespec va_mtime;       /* time of last modification */ | |||
|  |           struct 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 */ | |||
|  |   }; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   44..22..  TThhee ppiiooccttll iinntteerrffaaccee | |||
|  | 
 | |||
|  | 
 | |||
|  |   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. | |||
|  | 
 | |||
|  |   NNOOTTEE  The data structures and code are a mess.  We need to clean this | |||
|  |   up. | |||
|  | 
 | |||
|  |   We now proceed to document the individual calls: | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..33..  rroooott | |||
|  | 
 | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn empty | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_root_out { | |||
|  |                     ViceFid VFid; | |||
|  |                 } cfs_root; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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 | |||
|  | 
 | |||
|  |   44..44..  llooookkuupp | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Find the ViceFid and type of an object in a directory if it | |||
|  |   exists. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct  cfs_lookup_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     char        *name;          /* Place holder for data. */ | |||
|  |                 } cfs_lookup; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_lookup_out { | |||
|  |                     ViceFid VFid; | |||
|  |                     int vtype; | |||
|  |                 } cfs_lookup; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   NNOOTTEE The type of the vtype is currently wrong.  It should be | |||
|  |   coda_vtype. Linux does not take note of CFS_NOCACHE.  It should. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..55..  ggeettaattttrr | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Get the attributes of a file. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_getattr_in { | |||
|  |                     ViceFid VFid; | |||
|  |                     struct coda_vattr attr; /* XXXXX */ | |||
|  |                 } cfs_getattr; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_getattr_out { | |||
|  |                     struct coda_vattr attr; | |||
|  |                 } cfs_getattr; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn This call returns the attributes of the file identified by | |||
|  |   fid. | |||
|  | 
 | |||
|  |   EErrrroorrss Errors can occur if the object with fid does not exist, is | |||
|  |   unaccessible or if the caller does not have permission to fetch | |||
|  |   attributes. | |||
|  | 
 | |||
|  |   NNoottee 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 | |||
|  | 
 | |||
|  |   44..66..  sseettaattttrr | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Set the attributes of a file. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_setattr_in { | |||
|  |                     ViceFid VFid; | |||
|  |                     struct coda_vattr attr; | |||
|  |                 } cfs_setattr; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         empty | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss A variety of errors can occur.  The object may not exist, may | |||
|  |   be inaccessible, or permission may not be granted by Venus. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..77..  aacccceessss | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_access_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     int flags; | |||
|  |                 } cfs_access; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         empty | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss The object may not exist, or the ACL describing the protection | |||
|  |   may not be accessible. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..88..  ccrreeaattee | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Invoked to create a file | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_create_in { | |||
|  |                     ViceFid VFid; | |||
|  |                     struct coda_vattr attr; | |||
|  |                     int excl; | |||
|  |                     int mode; | |||
|  |                     char        *name;          /* Place holder for data. */ | |||
|  |                 } cfs_create; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_create_out { | |||
|  |                     ViceFid VFid; | |||
|  |                     struct coda_vattr attr; | |||
|  |                 } cfs_create; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  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. | |||
|  | 
 | |||
|  | 
 | |||
|  |   EErrrroorrss 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. | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..99..  mmkkddiirr | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Create a new directory. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_mkdir_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     struct coda_vattr attr; | |||
|  |                     char        *name;          /* Place holder for data. */ | |||
|  |                 } cfs_mkdir; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_mkdir_out { | |||
|  |                     ViceFid VFid; | |||
|  |                     struct coda_vattr attr; | |||
|  |                 } cfs_mkdir; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss As for create. | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..1100..  lliinnkk | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Create a link to an existing file. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 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; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         empty | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss The usual errors can occur.0wpage | |||
|  | 
 | |||
|  |   44..1111..  ssyymmlliinnkk | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy create a symbolic link | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_symlink_in { | |||
|  |                     ViceFid     VFid;          /* Directory to put symlink in */ | |||
|  |                     char        *srcname; | |||
|  |                     struct coda_vattr attr; | |||
|  |                     char        *tname; | |||
|  |                 } cfs_symlink; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE The attributes of the target directory should be returned since | |||
|  |   its size changed. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..1122..  rreemmoovvee | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Remove a file | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_remove_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     char        *name;          /* Place holder for data. */ | |||
|  |                 } cfs_remove; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  Remove file named cfs_remove_in.name in directory | |||
|  |   identified by   VFid. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE The attributes of the directory should be returned since its | |||
|  |   mtime and size may change. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..1133..  rrmmddiirr | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Remove a directory | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_rmdir_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     char        *name;          /* Place holder for data. */ | |||
|  |                 } cfs_rmdir; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn Remove the directory with name name from the directory | |||
|  |   identified by VFid. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE The attributes of the parent directory should be returned since | |||
|  |   its mtime and size may change. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..1144..  rreeaaddlliinnkk | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Read the value of a symbolic link. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_readlink_in { | |||
|  |                     ViceFid VFid; | |||
|  |                 } cfs_readlink; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_readlink_out { | |||
|  |                     int count; | |||
|  |                     caddr_t     data;           /* Place holder for data. */ | |||
|  |                 } cfs_readlink; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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??). | |||
|  | 
 | |||
|  |   EErrrroorrss No unusual errors. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..1155..  ooppeenn | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Open a file. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_open_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     int flags; | |||
|  |                 } cfs_open; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_open_out { | |||
|  |                     dev_t       dev; | |||
|  |                     ino_t       inode; | |||
|  |                 } cfs_open; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  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. | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..1166..  cclloossee | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Close a file, update it on the servers. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_close_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     int flags; | |||
|  |                 } cfs_close; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn Close the file identified by VFid. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..1177..  iiooccttll | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Do an ioctl on a file. This includes the pioctl interface. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_ioctl_in { | |||
|  |                     ViceFid VFid; | |||
|  |                     int cmd; | |||
|  |                     int len; | |||
|  |                     int rwflag; | |||
|  |                     char *data;                 /* Place holder for data. */ | |||
|  |                 } cfs_ioctl; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  | 
 | |||
|  |                 struct cfs_ioctl_out { | |||
|  |                     int len; | |||
|  |                     caddr_t     data;           /* Place holder for data. */ | |||
|  |                 } cfs_ioctl; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn Do an ioctl operation on a file.  The command, len and | |||
|  |   data arguments are filled as usual.  flags is not used by Venus. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE Another bogus parameter.  flags is not used.  What is the | |||
|  |   business about PREFETCHING in the Venus code? | |||
|  | 
 | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..1188..  rreennaammee | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Rename a fid. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_rename_in { | |||
|  |                     ViceFid     sourceFid; | |||
|  |                     char        *srcname; | |||
|  |                     ViceFid destFid; | |||
|  |                     char        *destname; | |||
|  |                 } cfs_rename; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  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. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..1199..  rreeaaddddiirr | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Read directory entries. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_readdir_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     int count; | |||
|  |                     int offset; | |||
|  |                 } cfs_readdir; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_readdir_out { | |||
|  |                     int size; | |||
|  |                     caddr_t     data;           /* Place holder for data. */ | |||
|  |                 } cfs_readdir; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..2200..  vvggeett | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy instructs Venus to do an FSDB->Get. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_vget_in { | |||
|  |                     ViceFid VFid; | |||
|  |                 } cfs_vget; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_vget_out { | |||
|  |                     ViceFid VFid; | |||
|  |                     int vtype; | |||
|  |                 } cfs_vget; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn This upcall asks Venus to do a get operation on an fsobj | |||
|  |   labelled by VFid. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..2211..  ffssyynncc | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Tell Venus to update the RVM attributes of a file. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_fsync_in { | |||
|  |                     ViceFid VFid; | |||
|  |                 } cfs_fsync; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE Linux does not implement this call. It should. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..2222..  iinnaaccttiivvee | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Tell Venus a vnode is no longer in use. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_inactive_in { | |||
|  |                     ViceFid VFid; | |||
|  |                 } cfs_inactive; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         none | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn This operation returns EOPNOTSUPP. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE This should perhaps be removed. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..2233..  rrddwwrr | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Read or write from a file | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct cfs_rdwr_in { | |||
|  |                     ViceFid     VFid; | |||
|  |                     int rwflag; | |||
|  |                     int count; | |||
|  |                     int offset; | |||
|  |                     int ioflag; | |||
|  |                     caddr_t     data;           /* Place holder for data. */ | |||
|  |                 } cfs_rdwr; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct cfs_rdwr_out { | |||
|  |                     int rwflag; | |||
|  |                     int count; | |||
|  |                     caddr_t     data;   /* Place holder for data. */ | |||
|  |                 } cfs_rdwr; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn This upcall asks Venus to read or write from a file. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..2244..  ooddyymmoouunntt | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Allows mounting multiple Coda "filesystems" on one Unix mount | |||
|  |   point. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn | |||
|  | 
 | |||
|  |                 struct ody_mount_in { | |||
|  |                     char        *name;          /* Place holder for data. */ | |||
|  |                 } ody_mount; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  | 
 | |||
|  |                 struct ody_mount_out { | |||
|  |                     ViceFid VFid; | |||
|  |                 } ody_mount; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  Asks Venus to return the rootfid of a Coda system named | |||
|  |   name.  The fid is returned in VFid. | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   44..2255..  ooddyy__llooookkuupp | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Looks up something. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn irrelevant | |||
|  | 
 | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         irrelevant | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE Gut it. Call is not implemented by Venus. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..2266..  ooddyy__eexxppaanndd | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy expands something in a dynamic set. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn irrelevant | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         irrelevant | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE Gut it.  Call is not implemented by Venus. | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..2277..  pprreeffeettcchh | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Prefetch a dynamic set. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn Not documented. | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         Not documented. | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  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). | |||
|  | 
 | |||
|  |   EErrrroorrss | |||
|  | 
 | |||
|  |   NNOOTTEE Gut it. It isn't working and isn't used by Coda. | |||
|  | 
 | |||
|  | 
 | |||
|  |   0wpage | |||
|  | 
 | |||
|  |   44..2288..  ssiiggnnaall | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Send Venus a signal about an upcall. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |      iinn none | |||
|  | 
 | |||
|  |      oouutt | |||
|  |         not applicable. | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn  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. | |||
|  | 
 | |||
|  |   EErrrroorrss No reply is given. | |||
|  | 
 | |||
|  |   NNOOTTEE 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 | |||
|  | 
 | |||
|  |   55..  TThhee mmiinniiccaacchhee aanndd ddoowwnnccaallllss | |||
|  | 
 | |||
|  | 
 | |||
|  |   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 ccnnooddeess. | |||
|  | 
 | |||
|  |   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. | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..11..  IINNVVAALLIIDDAATTEE | |||
|  | 
 | |||
|  | 
 | |||
|  |   No information is available on this call. | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..22..  FFLLUUSSHH | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   AArrgguummeennttss None | |||
|  | 
 | |||
|  |   SSuummmmaarryy Flush the name cache entirely. | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..33..  PPUURRGGEEUUSSEERR | |||
|  | 
 | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |           struct cfs_purgeuser_out {/* CFS_PURGEUSER is a venus->kernel call */ | |||
|  |               struct CodaCred cred; | |||
|  |           } cfs_purgeuser; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn Remove all entries in the cache carrying the Cred.  This | |||
|  |   call is issued when tokens for a user expire or are flushed. | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..44..  ZZAAPPFFIILLEE | |||
|  | 
 | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |           struct cfs_zapfile_out {  /* CFS_ZAPFILE is a venus->kernel call */ | |||
|  |               ViceFid CodaFid; | |||
|  |           } cfs_zapfile; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  |   NNOOTTEE 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. | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..55..  ZZAAPPDDIIRR | |||
|  | 
 | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |           struct cfs_zapdir_out {   /* CFS_ZAPDIR is a venus->kernel call */ | |||
|  |               ViceFid CodaFid; | |||
|  |           } cfs_zapdir; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..66..  ZZAAPPVVNNOODDEE | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |           struct cfs_zapvnode_out { /* CFS_ZAPVNODE is a venus->kernel call */ | |||
|  |               struct CodaCred cred; | |||
|  |               ViceFid VFid; | |||
|  |           } cfs_zapvnode; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn Remove all entries in the cache carrying the cred and VFid | |||
|  |   as in the arguments. This downcall is probably never issued. | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..77..  PPUURRGGEEFFIIDD | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |           struct cfs_purgefid_out { /* CFS_PURGEFID is a venus->kernel call */ | |||
|  |               ViceFid CodaFid; | |||
|  |           } cfs_purgefid; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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. | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   55..88..  RREEPPLLAACCEE | |||
|  | 
 | |||
|  | 
 | |||
|  |   SSuummmmaarryy Replace the Fid's for a collection of names. | |||
|  | 
 | |||
|  |   AArrgguummeennttss | |||
|  | 
 | |||
|  |           struct cfs_replace_out { /* cfs_replace is a venus->kernel call */ | |||
|  |               ViceFid NewFid; | |||
|  |               ViceFid OldFid; | |||
|  |           } cfs_replace; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |   DDeessccrriippttiioonn 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 | |||
|  | 
 | |||
|  |   66..  IInniittiiaalliizzaattiioonn aanndd cclleeaannuupp | |||
|  | 
 | |||
|  | 
 | |||
|  |   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. | |||
|  | 
 | |||
|  | 
 | |||
|  |   66..11..  RReeqquuiirreemmeennttss | |||
|  | 
 | |||
|  | 
 | |||
|  |   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. | |||
|  | 
 | |||
|  |   NNOOTTEE  NetBSD in particular but also Linux have not implemented the | |||
|  |   above requirements fully.  For smooth operation this needs to be | |||
|  |   corrected. | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 |