| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | NOTE:  | 
 | 2 | This is one of the technical documents describing a component of | 
 | 3 | Coda -- this document describes the client kernel-Venus interface. | 
 | 4 |  | 
 | 5 | For more information: | 
 | 6 |   http://www.coda.cs.cmu.edu | 
 | 7 | For user level software needed to run Coda: | 
 | 8 |   ftp://ftp.coda.cs.cmu.edu | 
 | 9 |  | 
 | 10 | To run Coda you need to get a user level cache manager for the client, | 
 | 11 | named Venus, as well as tools to manipulate ACLs, to log in, etc.  The | 
 | 12 | client needs to have the Coda filesystem selected in the kernel | 
 | 13 | configuration. | 
 | 14 |  | 
 | 15 | The server needs a user level server and at present does not depend on | 
 | 16 | kernel support. | 
 | 17 |  | 
 | 18 |  | 
 | 19 |  | 
 | 20 |  | 
 | 21 |  | 
 | 22 |  | 
 | 23 |  | 
 | 24 |   The Venus kernel interface | 
 | 25 |   Peter J. Braam | 
 | 26 |   v1.0, Nov 9, 1997 | 
 | 27 |  | 
 | 28 |   This document describes the communication between Venus and kernel | 
 | 29 |   level filesystem code needed for the operation of the Coda file sys- | 
 | 30 |   tem.  This document version is meant to describe the current interface | 
 | 31 |   (version 1.0) as well as improvements we envisage. | 
 | 32 |   ______________________________________________________________________ | 
 | 33 |  | 
 | 34 |   Table of Contents | 
 | 35 |  | 
 | 36 |  | 
 | 37 |  | 
 | 38 |  | 
 | 39 |  | 
 | 40 |  | 
 | 41 |  | 
 | 42 |  | 
 | 43 |  | 
 | 44 |  | 
 | 45 |  | 
 | 46 |  | 
 | 47 |  | 
 | 48 |  | 
 | 49 |  | 
 | 50 |  | 
 | 51 |  | 
 | 52 |  | 
 | 53 |  | 
 | 54 |  | 
 | 55 |  | 
 | 56 |  | 
 | 57 |  | 
 | 58 |  | 
 | 59 |  | 
 | 60 |  | 
 | 61 |  | 
 | 62 |  | 
 | 63 |  | 
 | 64 |  | 
 | 65 |  | 
 | 66 |  | 
 | 67 |  | 
 | 68 |  | 
 | 69 |  | 
 | 70 |  | 
 | 71 |  | 
 | 72 |  | 
 | 73 |  | 
 | 74 |  | 
 | 75 |  | 
 | 76 |  | 
 | 77 |  | 
 | 78 |  | 
 | 79 |  | 
 | 80 |  | 
 | 81 |  | 
 | 82 |  | 
 | 83 |  | 
 | 84 |  | 
 | 85 |  | 
 | 86 |  | 
 | 87 |  | 
 | 88 |  | 
 | 89 |  | 
 | 90 |   1. Introduction | 
 | 91 |  | 
 | 92 |   2. Servicing Coda filesystem calls | 
 | 93 |  | 
 | 94 |   3. The message layer | 
 | 95 |  | 
 | 96 |      3.1 Implementation details | 
 | 97 |  | 
 | 98 |   4. The interface at the call level | 
 | 99 |  | 
 | 100 |      4.1 Data structures shared by the kernel and Venus | 
 | 101 |      4.2 The pioctl interface | 
 | 102 |      4.3 root | 
 | 103 |      4.4 lookup | 
 | 104 |      4.5 getattr | 
 | 105 |      4.6 setattr | 
 | 106 |      4.7 access | 
 | 107 |      4.8 create | 
 | 108 |      4.9 mkdir | 
 | 109 |      4.10 link | 
 | 110 |      4.11 symlink | 
 | 111 |      4.12 remove | 
 | 112 |      4.13 rmdir | 
 | 113 |      4.14 readlink | 
 | 114 |      4.15 open | 
 | 115 |      4.16 close | 
 | 116 |      4.17 ioctl | 
 | 117 |      4.18 rename | 
 | 118 |      4.19 readdir | 
 | 119 |      4.20 vget | 
 | 120 |      4.21 fsync | 
 | 121 |      4.22 inactive | 
 | 122 |      4.23 rdwr | 
 | 123 |      4.24 odymount | 
 | 124 |      4.25 ody_lookup | 
 | 125 |      4.26 ody_expand | 
 | 126 |      4.27 prefetch | 
 | 127 |      4.28 signal | 
 | 128 |  | 
 | 129 |   5. The minicache and downcalls | 
 | 130 |  | 
 | 131 |      5.1 INVALIDATE | 
 | 132 |      5.2 FLUSH | 
 | 133 |      5.3 PURGEUSER | 
 | 134 |      5.4 ZAPFILE | 
 | 135 |      5.5 ZAPDIR | 
 | 136 |      5.6 ZAPVNODE | 
 | 137 |      5.7 PURGEFID | 
 | 138 |      5.8 REPLACE | 
 | 139 |  | 
 | 140 |   6. Initialization and cleanup | 
 | 141 |  | 
 | 142 |      6.1 Requirements | 
 | 143 |  | 
 | 144 |  | 
 | 145 |   ______________________________________________________________________ | 
 | 146 |   0wpage | 
 | 147 |  | 
 | 148 |   11..  IInnttrroodduuccttiioonn | 
 | 149 |  | 
 | 150 |  | 
 | 151 |  | 
 | 152 |   A key component in the Coda Distributed File System is the cache | 
 | 153 |   manager, _V_e_n_u_s. | 
 | 154 |  | 
 | 155 |  | 
 | 156 |   When processes on a Coda enabled system access files in the Coda | 
 | 157 |   filesystem, requests are directed at the filesystem layer in the | 
 | 158 |   operating system. The operating system will communicate with Venus to | 
 | 159 |   service the request for the process.  Venus manages a persistent | 
 | 160 |   client cache and makes remote procedure calls to Coda file servers and | 
 | 161 |   related servers (such as authentication servers) to service these | 
 | 162 |   requests it receives from the operating system.  When Venus has | 
 | 163 |   serviced a request it replies to the operating system with appropriate | 
 | 164 |   return codes, and other data related to the request.  Optionally the | 
 | 165 |   kernel support for Coda may maintain a minicache of recently processed | 
 | 166 |   requests to limit the number of interactions with Venus.  Venus | 
 | 167 |   possesses the facility to inform the kernel when elements from its | 
 | 168 |   minicache are no longer valid. | 
 | 169 |  | 
 | 170 |   This document describes precisely this communication between the | 
 | 171 |   kernel and Venus.  The definitions of so called upcalls and downcalls | 
 | 172 |   will be given with the format of the data they handle. We shall also | 
 | 173 |   describe the semantic invariants resulting from the calls. | 
 | 174 |  | 
 | 175 |   Historically Coda was implemented in a BSD file system in Mach 2.6. | 
 | 176 |   The interface between the kernel and Venus is very similar to the BSD | 
 | 177 |   VFS interface.  Similar functionality is provided, and the format of | 
 | 178 |   the parameters and returned data is very similar to the BSD VFS.  This | 
 | 179 |   leads to an almost natural environment for implementing a kernel-level | 
 | 180 |   filesystem driver for Coda in a BSD system.  However, other operating | 
 | 181 |   systems such as Linux and Windows 95 and NT have virtual filesystem | 
 | 182 |   with different interfaces. | 
 | 183 |  | 
 | 184 |   To implement Coda on these systems some reverse engineering of the | 
 | 185 |   Venus/Kernel protocol is necessary.  Also it came to light that other | 
 | 186 |   systems could profit significantly from certain small optimizations | 
 | 187 |   and modifications to the protocol. To facilitate this work as well as | 
 | 188 |   to make future ports easier, communication between Venus and the | 
 | 189 |   kernel should be documented in great detail.  This is the aim of this | 
 | 190 |   document. | 
 | 191 |  | 
 | 192 |   0wpage | 
 | 193 |  | 
 | 194 |   22..  SSeerrvviicciinngg CCooddaa ffiilleessyysstteemm ccaallllss | 
 | 195 |  | 
 | 196 |   The service of a request for a Coda file system service originates in | 
 | 197 |   a process PP which accessing a Coda file. It makes a system call which | 
 | 198 |   traps to the OS kernel. Examples of such calls trapping to the kernel | 
 | 199 |   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 | 
 | 200 |   context.  Similar calls exist in the Win32 environment, and are named | 
 | 201 |   _C_r_e_a_t_e_F_i_l_e_, . | 
 | 202 |  | 
 | 203 |   Generally the operating system handles the request in a virtual | 
 | 204 |   filesystem (VFS) layer, which is named I/O Manager in NT and IFS | 
 | 205 |   manager in Windows 95.  The VFS is responsible for partial processing | 
 | 206 |   of the request and for locating the specific filesystem(s) which will | 
 | 207 |   service parts of the request.  Usually the information in the path | 
 | 208 |   assists in locating the correct FS drivers.  Sometimes after extensive | 
 | 209 |   pre-processing, the VFS starts invoking exported routines in the FS | 
 | 210 |   driver.  This is the point where the FS specific processing of the | 
 | 211 |   request starts, and here the Coda specific kernel code comes into | 
 | 212 |   play. | 
 | 213 |  | 
 | 214 |   The FS layer for Coda must expose and implement several interfaces. | 
 | 215 |   First and foremost the VFS must be able to make all necessary calls to | 
 | 216 |   the Coda FS layer, so the Coda FS driver must expose the VFS interface | 
 | 217 |   as applicable in the operating system. These differ very significantly | 
 | 218 |   among operating systems, but share features such as facilities to | 
 | 219 |   read/write and create and remove objects.  The Coda FS layer services | 
 | 220 |   such VFS requests by invoking one or more well defined services | 
 | 221 |   offered by the cache manager Venus.  When the replies from Venus have | 
 | 222 |   come back to the FS driver, servicing of the VFS call continues and | 
 | 223 |   finishes with a reply to the kernel's VFS. Finally the VFS layer | 
 | 224 |   returns to the process. | 
 | 225 |  | 
 | 226 |   As a result of this design a basic interface exposed by the FS driver | 
 | 227 |   must allow Venus to manage message traffic.  In particular Venus must | 
 | 228 |   be able to retrieve and place messages and to be notified of the | 
 | 229 |   arrival of a new message. The notification must be through a mechanism | 
 | 230 |   which does not block Venus since Venus must attend to other tasks even | 
 | 231 |   when no messages are waiting or being processed. | 
 | 232 |  | 
 | 233 |  | 
 | 234 |  | 
 | 235 |  | 
 | 236 |  | 
 | 237 |  | 
 | 238 |                      Interfaces of the Coda FS Driver | 
 | 239 |  | 
 | 240 |   Furthermore the FS layer provides for a special path of communication | 
 | 241 |   between a user process and Venus, called the pioctl interface. The | 
 | 242 |   pioctl interface is used for Coda specific services, such as | 
 | 243 |   requesting detailed information about the persistent cache managed by | 
 | 244 |   Venus. Here the involvement of the kernel is minimal.  It identifies | 
 | 245 |   the calling process and passes the information on to Venus.  When | 
 | 246 |   Venus replies the response is passed back to the caller in unmodified | 
 | 247 |   form. | 
 | 248 |  | 
 | 249 |   Finally Venus allows the kernel FS driver to cache the results from | 
 | 250 |   certain services.  This is done to avoid excessive context switches | 
 | 251 |   and results in an efficient system.  However, Venus may acquire | 
 | 252 |   information, for example from the network which implies that cached | 
 | 253 |   information must be flushed or replaced. Venus then makes a downcall | 
 | 254 |   to the Coda FS layer to request flushes or updates in the cache.  The | 
 | 255 |   kernel FS driver handles such requests synchronously. | 
 | 256 |  | 
 | 257 |   Among these interfaces the VFS interface and the facility to place, | 
 | 258 |   receive and be notified of messages are platform specific.  We will | 
 | 259 |   not go into the calls exported to the VFS layer but we will state the | 
 | 260 |   requirements of the message exchange mechanism. | 
 | 261 |  | 
 | 262 |   0wpage | 
 | 263 |  | 
 | 264 |   33..  TThhee mmeessssaaggee llaayyeerr | 
 | 265 |  | 
 | 266 |  | 
 | 267 |  | 
 | 268 |   At the lowest level the communication between Venus and the FS driver | 
 | 269 |   proceeds through messages.  The synchronization between processes | 
 | 270 |   requesting Coda file service and Venus relies on blocking and waking | 
 | 271 |   up processes.  The Coda FS driver processes VFS- and pioctl-requests | 
 | 272 |   on behalf of a process P, creates messages for Venus, awaits replies | 
 | 273 |   and finally returns to the caller.  The implementation of the exchange | 
 | 274 |   of messages is platform specific, but the semantics have (so far) | 
 | 275 |   appeared to be generally applicable.  Data buffers are created by the | 
 | 276 |   FS Driver in kernel memory on behalf of P and copied to user memory in | 
 | 277 |   Venus. | 
 | 278 |  | 
 | 279 |   The FS Driver while servicing P makes upcalls to Venus.  Such an | 
 | 280 |   upcall is dispatched to Venus by creating a message structure.  The | 
 | 281 |   structure contains the identification of P, the message sequence | 
 | 282 |   number, the size of the request and a pointer to the data in kernel | 
 | 283 |   memory for the request.  Since the data buffer is re-used to hold the | 
 | 284 |   reply from Venus, there is a field for the size of the reply.  A flags | 
 | 285 |   field is used in the message to precisely record the status of the | 
 | 286 |   message.  Additional platform dependent structures involve pointers to | 
 | 287 |   determine the position of the message on queues and pointers to | 
 | 288 |   synchronization objects.  In the upcall routine the message structure | 
 | 289 |   is filled in, flags are set to 0, and it is placed on the _p_e_n_d_i_n_g | 
 | 290 |   queue.  The routine calling upcall is responsible for allocating the | 
 | 291 |   data buffer; its structure will be described in the next section. | 
 | 292 |  | 
 | 293 |   A facility must exist to notify Venus that the message has been | 
 | 294 |   created, and implemented using available synchronization objects in | 
 | 295 |   the OS. This notification is done in the upcall context of the process | 
 | 296 |   P. When the message is on the pending queue, process P cannot proceed | 
 | 297 |   in upcall.  The (kernel mode) processing of P in the filesystem | 
 | 298 |   request routine must be suspended until Venus has replied.  Therefore | 
 | 299 |   the calling thread in P is blocked in upcall.  A pointer in the | 
 | 300 |   message structure will locate the synchronization object on which P is | 
 | 301 |   sleeping. | 
 | 302 |  | 
 | 303 |   Venus detects the notification that a message has arrived, and the FS | 
 | 304 |   driver allow Venus to retrieve the message with a getmsg_from_kernel | 
 | 305 |   call. This action finishes in the kernel by putting the message on the | 
 | 306 |   queue of processing messages and setting flags to READ.  Venus is | 
 | 307 |   passed the contents of the data buffer. The getmsg_from_kernel call | 
 | 308 |   now returns and Venus processes the request. | 
 | 309 |  | 
 | 310 |   At some later point the FS driver receives a message from Venus, | 
 | 311 |   namely when Venus calls sendmsg_to_kernel.  At this moment the Coda FS | 
 | 312 |   driver looks at the contents of the message and decides if: | 
 | 313 |  | 
 | 314 |  | 
 | 315 |   +o  the message is a reply for a suspended thread P.  If so it removes | 
 | 316 |      the message from the processing queue and marks the message as | 
 | 317 |      WRITTEN.  Finally, the FS driver unblocks P (still in the kernel | 
 | 318 |      mode context of Venus) and the sendmsg_to_kernel call returns to | 
 | 319 |      Venus.  The process P will be scheduled at some point and continues | 
 | 320 |      processing its upcall with the data buffer replaced with the reply | 
 | 321 |      from Venus. | 
 | 322 |  | 
 | 323 |   +o  The message is a _d_o_w_n_c_a_l_l.  A downcall is a request from Venus to | 
 | 324 |      the FS Driver. The FS driver processes the request immediately | 
 | 325 |      (usually a cache eviction or replacement) and when it finishes | 
 | 326 |      sendmsg_to_kernel returns. | 
 | 327 |  | 
 | 328 |   Now P awakes and continues processing upcall.  There are some | 
 | 329 |   subtleties to take account of. First P will determine if it was woken | 
 | 330 |   up in upcall by a signal from some other source (for example an | 
 | 331 |   attempt to terminate P) or as is normally the case by Venus in its | 
 | 332 |   sendmsg_to_kernel call.  In the normal case, the upcall routine will | 
 | 333 |   deallocate the message structure and return.  The FS routine can proceed | 
 | 334 |   with its processing. | 
 | 335 |  | 
 | 336 |  | 
 | 337 |  | 
 | 338 |  | 
 | 339 |  | 
 | 340 |  | 
 | 341 |  | 
 | 342 |                       Sleeping and IPC arrangements | 
 | 343 |  | 
 | 344 |   In case P is woken up by a signal and not by Venus, it will first look | 
 | 345 |   at the flags field.  If the message is not yet READ, the process P can | 
 | 346 |   handle its signal without notifying Venus.  If Venus has READ, and | 
 | 347 |   the request should not be processed, P can send Venus a signal message | 
 | 348 |   to indicate that it should disregard the previous message.  Such | 
 | 349 |   signals are put in the queue at the head, and read first by Venus.  If | 
 | 350 |   the message is already marked as WRITTEN it is too late to stop the | 
 | 351 |   processing.  The VFS routine will now continue.  (-- If a VFS request | 
 | 352 |   involves more than one upcall, this can lead to complicated state, an | 
 | 353 |   extra field "handle_signals" could be added in the message structure | 
 | 354 |   to indicate points of no return have been passed.--) | 
 | 355 |  | 
 | 356 |  | 
 | 357 |  | 
 | 358 |   33..11..  IImmpplleemmeennttaattiioonn ddeettaaiillss | 
 | 359 |  | 
 | 360 |   The Unix implementation of this mechanism has been through the | 
 | 361 |   implementation of a character device associated with Coda.  Venus | 
 | 362 |   retrieves messages by doing a read on the device, replies are sent | 
 | 363 |   with a write and notification is through the select system call on the | 
 | 364 |   file descriptor for the device.  The process P is kept waiting on an | 
 | 365 |   interruptible wait queue object. | 
 | 366 |  | 
 | 367 |   In Windows NT and the DPMI Windows 95 implementation a DeviceIoControl | 
 | 368 |   call is used.  The DeviceIoControl call is designed to copy buffers | 
 | 369 |   from user memory to kernel memory with OPCODES. The sendmsg_to_kernel | 
 | 370 |   is issued as a synchronous call, while the getmsg_from_kernel call is | 
 | 371 |   asynchronous.  Windows EventObjects are used for notification of | 
 | 372 |   message arrival.  The process P is kept waiting on a KernelEvent | 
 | 373 |   object in NT and a semaphore in Windows 95. | 
 | 374 |  | 
 | 375 |   0wpage | 
 | 376 |  | 
 | 377 |   44..  TThhee iinntteerrffaaccee aatt tthhee ccaallll lleevveell | 
 | 378 |  | 
 | 379 |  | 
 | 380 |   This section describes the upcalls a Coda FS driver can make to Venus. | 
 | 381 |   Each of these upcalls make use of two structures: inputArgs and | 
 | 382 |   outputArgs.   In pseudo BNF form the structures take the following | 
 | 383 |   form: | 
 | 384 |  | 
 | 385 |  | 
 | 386 |   struct inputArgs { | 
 | 387 |       u_long opcode; | 
 | 388 |       u_long unique;     /* Keep multiple outstanding msgs distinct */ | 
 | 389 |       u_short pid;                 /* Common to all */ | 
 | 390 |       u_short pgid;                /* Common to all */ | 
 | 391 |       struct CodaCred cred;        /* Common to all */ | 
 | 392 |  | 
 | 393 |       <union "in" of call dependent parts of inputArgs> | 
 | 394 |   }; | 
 | 395 |  | 
 | 396 |   struct outputArgs { | 
 | 397 |       u_long opcode; | 
 | 398 |       u_long unique;       /* Keep multiple outstanding msgs distinct */ | 
 | 399 |       u_long result; | 
 | 400 |  | 
 | 401 |       <union "out" of call dependent parts of inputArgs> | 
 | 402 |   }; | 
 | 403 |  | 
 | 404 |  | 
 | 405 |  | 
 | 406 |   Before going on let us elucidate the role of the various fields. The | 
 | 407 |   inputArgs start with the opcode which defines the type of service | 
 | 408 |   requested from Venus. There are approximately 30 upcalls at present | 
 | 409 |   which we will discuss.   The unique field labels the inputArg with a | 
 | 410 |   unique number which will identify the message uniquely.  A process and | 
 | 411 |   process group id are passed.  Finally the credentials of the caller | 
 | 412 |   are included. | 
 | 413 |  | 
 | 414 |   Before delving into the specific calls we need to discuss a variety of | 
 | 415 |   data structures shared by the kernel and Venus. | 
 | 416 |  | 
 | 417 |  | 
 | 418 |  | 
 | 419 |  | 
 | 420 |   44..11..  DDaattaa ssttrruuccttuurreess sshhaarreedd bbyy tthhee kkeerrnneell aanndd VVeennuuss | 
 | 421 |  | 
 | 422 |  | 
 | 423 |   The CodaCred structure defines a variety of user and group ids as | 
 | 424 |   they are set for the calling process. The vuid_t and guid_t are 32 bit | 
 | 425 |   unsigned integers.  It also defines group membership in an array.  On | 
 | 426 |   Unix the CodaCred has proven sufficient to implement good security | 
 | 427 |   semantics for Coda but the structure may have to undergo modification | 
 | 428 |   for the Windows environment when these mature. | 
 | 429 |  | 
 | 430 |   struct CodaCred { | 
 | 431 |       vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, effective, set, fs uid*/ | 
 | 432 |       vgid_t cr_gid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */ | 
 | 433 |       vgid_t cr_groups[NGROUPS];        /* Group membership for caller */ | 
 | 434 |   }; | 
 | 435 |  | 
 | 436 |  | 
 | 437 |  | 
 | 438 |   NNOOTTEE It is questionable if we need CodaCreds in Venus. Finally Venus | 
 | 439 |   doesn't know about groups, although it does create files with the | 
 | 440 |   default uid/gid.  Perhaps the list of group membership is superfluous. | 
 | 441 |  | 
 | 442 |  | 
 | 443 |   The next item is the fundamental identifier used to identify Coda | 
 | 444 |   files, the ViceFid.  A fid of a file uniquely defines a file or | 
 | 445 |   directory in the Coda filesystem within a _c_e_l_l.   (-- A _c_e_l_l is a | 
 | 446 |   group of Coda servers acting under the aegis of a single system | 
 | 447 |   control machine or SCM. See the Coda Administration manual for a | 
 | 448 |   detailed description of the role of the SCM.--) | 
 | 449 |  | 
 | 450 |  | 
 | 451 |   typedef struct ViceFid { | 
 | 452 |       VolumeId Volume; | 
 | 453 |       VnodeId Vnode; | 
 | 454 |       Unique_t Unique; | 
 | 455 |   } ViceFid; | 
 | 456 |  | 
 | 457 |  | 
 | 458 |  | 
 | 459 |   Each of the constituent fields: VolumeId, VnodeId and Unique_t are | 
 | 460 |   unsigned 32 bit integers.  We envisage that a further field will need | 
 | 461 |   to be prefixed to identify the Coda cell; this will probably take the | 
 | 462 |   form of a Ipv6 size IP address naming the Coda cell through DNS. | 
 | 463 |  | 
 | 464 |   The next important structure shared between Venus and the kernel is | 
 | 465 |   the attributes of the file.  The following structure is used to | 
 | 466 |   exchange information.  It has room for future extensions such as | 
 | 467 |   support for device files (currently not present in Coda). | 
 | 468 |  | 
 | 469 |  | 
 | 470 |  | 
 | 471 |  | 
 | 472 |  | 
 | 473 |  | 
 | 474 |  | 
 | 475 |  | 
 | 476 |  | 
 | 477 |  | 
 | 478 |  | 
 | 479 |  | 
 | 480 |  | 
 | 481 |  | 
 | 482 |  | 
 | 483 |  | 
 | 484 |  | 
 | 485 |  | 
 | 486 |   struct coda_vattr { | 
 | 487 |           enum coda_vtype va_type;        /* vnode type (for create) */ | 
 | 488 |           u_short         va_mode;        /* files access mode and type */ | 
 | 489 |           short           va_nlink;       /* number of references to file */ | 
 | 490 |           vuid_t          va_uid;         /* owner user id */ | 
 | 491 |           vgid_t          va_gid;         /* owner group id */ | 
 | 492 |           long            va_fsid;        /* file system id (dev for now) */ | 
 | 493 |           long            va_fileid;      /* file id */ | 
 | 494 |           u_quad_t        va_size;        /* file size in bytes */ | 
 | 495 |           long            va_blocksize;   /* blocksize preferred for i/o */ | 
 | 496 |           struct timespec va_atime;       /* time of last access */ | 
 | 497 |           struct timespec va_mtime;       /* time of last modification */ | 
 | 498 |           struct timespec va_ctime;       /* time file changed */ | 
 | 499 |           u_long          va_gen;         /* generation number of file */ | 
 | 500 |           u_long          va_flags;       /* flags defined for file */ | 
 | 501 |           dev_t           va_rdev;        /* device special file represents */ | 
 | 502 |           u_quad_t        va_bytes;       /* bytes of disk space held by file */ | 
 | 503 |           u_quad_t        va_filerev;     /* file modification number */ | 
 | 504 |           u_int           va_vaflags;     /* operations flags, see below */ | 
 | 505 |           long            va_spare;       /* remain quad aligned */ | 
 | 506 |   }; | 
 | 507 |  | 
 | 508 |  | 
 | 509 |  | 
 | 510 |  | 
 | 511 |   44..22..  TThhee ppiiooccttll iinntteerrffaaccee | 
 | 512 |  | 
 | 513 |  | 
 | 514 |   Coda specific requests can be made by application through the pioctl | 
 | 515 |   interface. The pioctl is implemented as an ordinary ioctl on a | 
 | 516 |   fictitious file /coda/.CONTROL.  The pioctl call opens this file, gets | 
 | 517 |   a file handle and makes the ioctl call. Finally it closes the file. | 
 | 518 |  | 
 | 519 |   The kernel involvement in this is limited to providing the facility to | 
 | 520 |   open and close and pass the ioctl message _a_n_d to verify that a path in | 
 | 521 |   the pioctl data buffers is a file in a Coda filesystem. | 
 | 522 |  | 
 | 523 |   The kernel is handed a data packet of the form: | 
 | 524 |  | 
 | 525 |       struct { | 
 | 526 |           const char *path; | 
 | 527 |           struct ViceIoctl vidata; | 
 | 528 |           int follow; | 
 | 529 |       } data; | 
 | 530 |  | 
 | 531 |  | 
 | 532 |  | 
 | 533 |   where | 
 | 534 |  | 
 | 535 |  | 
 | 536 |   struct ViceIoctl { | 
 | 537 |           caddr_t in, out;        /* Data to be transferred in, or out */ | 
 | 538 |           short in_size;          /* Size of input buffer <= 2K */ | 
 | 539 |           short out_size;         /* Maximum size of output buffer, <= 2K */ | 
 | 540 |   }; | 
 | 541 |  | 
 | 542 |  | 
 | 543 |  | 
 | 544 |   The path must be a Coda file, otherwise the ioctl upcall will not be | 
 | 545 |   made. | 
 | 546 |  | 
 | 547 |   NNOOTTEE  The data structures and code are a mess.  We need to clean this | 
 | 548 |   up. | 
 | 549 |  | 
 | 550 |   We now proceed to document the individual calls: | 
 | 551 |  | 
 | 552 |   0wpage | 
 | 553 |  | 
 | 554 |   44..33..  rroooott | 
 | 555 |  | 
 | 556 |  | 
 | 557 |   AArrgguummeennttss | 
 | 558 |  | 
 | 559 |      iinn empty | 
 | 560 |  | 
 | 561 |      oouutt | 
 | 562 |  | 
 | 563 |                 struct cfs_root_out { | 
 | 564 |                     ViceFid VFid; | 
 | 565 |                 } cfs_root; | 
 | 566 |  | 
 | 567 |  | 
 | 568 |  | 
 | 569 |   DDeessccrriippttiioonn This call is made to Venus during the initialization of | 
 | 570 |   the Coda filesystem. If the result is zero, the cfs_root structure | 
 | 571 |   contains the ViceFid of the root of the Coda filesystem. If a non-zero | 
 | 572 |   result is generated, its value is a platform dependent error code | 
 | 573 |   indicating the difficulty Venus encountered in locating the root of | 
 | 574 |   the Coda filesystem. | 
 | 575 |  | 
 | 576 |   0wpage | 
 | 577 |  | 
 | 578 |   44..44..  llooookkuupp | 
 | 579 |  | 
 | 580 |  | 
 | 581 |   SSuummmmaarryy Find the ViceFid and type of an object in a directory if it | 
 | 582 |   exists. | 
 | 583 |  | 
 | 584 |   AArrgguummeennttss | 
 | 585 |  | 
 | 586 |      iinn | 
 | 587 |  | 
 | 588 |                 struct  cfs_lookup_in { | 
 | 589 |                     ViceFid     VFid; | 
 | 590 |                     char        *name;          /* Place holder for data. */ | 
 | 591 |                 } cfs_lookup; | 
 | 592 |  | 
 | 593 |  | 
 | 594 |  | 
 | 595 |      oouutt | 
 | 596 |  | 
 | 597 |                 struct cfs_lookup_out { | 
 | 598 |                     ViceFid VFid; | 
 | 599 |                     int vtype; | 
 | 600 |                 } cfs_lookup; | 
 | 601 |  | 
 | 602 |  | 
 | 603 |  | 
 | 604 |   DDeessccrriippttiioonn This call is made to determine the ViceFid and filetype of | 
 | 605 |   a directory entry.  The directory entry requested carries name name | 
 | 606 |   and Venus will search the directory identified by cfs_lookup_in.VFid. | 
 | 607 |   The result may indicate that the name does not exist, or that | 
 | 608 |   difficulty was encountered in finding it (e.g. due to disconnection). | 
 | 609 |   If the result is zero, the field cfs_lookup_out.VFid contains the | 
 | 610 |   targets ViceFid and cfs_lookup_out.vtype the coda_vtype giving the | 
 | 611 |   type of object the name designates. | 
 | 612 |  | 
 | 613 |   The name of the object is an 8 bit character string of maximum length | 
 | 614 |   CFS_MAXNAMLEN, currently set to 256 (including a 0 terminator.) | 
 | 615 |  | 
 | 616 |   It is extremely important to realize that Venus bitwise ors the field | 
 | 617 |   cfs_lookup.vtype with CFS_NOCACHE to indicate that the object should | 
 | 618 |   not be put in the kernel name cache. | 
 | 619 |  | 
 | 620 |   NNOOTTEE The type of the vtype is currently wrong.  It should be | 
 | 621 |   coda_vtype. Linux does not take note of CFS_NOCACHE.  It should. | 
 | 622 |  | 
 | 623 |   0wpage | 
 | 624 |  | 
 | 625 |   44..55..  ggeettaattttrr | 
 | 626 |  | 
 | 627 |  | 
 | 628 |   SSuummmmaarryy Get the attributes of a file. | 
 | 629 |  | 
 | 630 |   AArrgguummeennttss | 
 | 631 |  | 
 | 632 |      iinn | 
 | 633 |  | 
 | 634 |                 struct cfs_getattr_in { | 
 | 635 |                     ViceFid VFid; | 
 | 636 |                     struct coda_vattr attr; /* XXXXX */ | 
 | 637 |                 } cfs_getattr; | 
 | 638 |  | 
 | 639 |  | 
 | 640 |  | 
 | 641 |      oouutt | 
 | 642 |  | 
 | 643 |                 struct cfs_getattr_out { | 
 | 644 |                     struct coda_vattr attr; | 
 | 645 |                 } cfs_getattr; | 
 | 646 |  | 
 | 647 |  | 
 | 648 |  | 
 | 649 |   DDeessccrriippttiioonn This call returns the attributes of the file identified by | 
 | 650 |   fid. | 
 | 651 |  | 
 | 652 |   EErrrroorrss Errors can occur if the object with fid does not exist, is | 
 | 653 |   unaccessible or if the caller does not have permission to fetch | 
 | 654 |   attributes. | 
 | 655 |  | 
 | 656 |   NNoottee Many kernel FS drivers (Linux, NT and Windows 95) need to acquire | 
 | 657 |   the attributes as well as the Fid for the instantiation of an internal | 
 | 658 |   "inode" or "FileHandle".  A significant improvement in performance on | 
 | 659 |   such systems could be made by combining the _l_o_o_k_u_p and _g_e_t_a_t_t_r calls | 
 | 660 |   both at the Venus/kernel interaction level and at the RPC level. | 
 | 661 |  | 
 | 662 |   The vattr structure included in the input arguments is superfluous and | 
 | 663 |   should be removed. | 
 | 664 |  | 
 | 665 |   0wpage | 
 | 666 |  | 
 | 667 |   44..66..  sseettaattttrr | 
 | 668 |  | 
 | 669 |  | 
 | 670 |   SSuummmmaarryy Set the attributes of a file. | 
 | 671 |  | 
 | 672 |   AArrgguummeennttss | 
 | 673 |  | 
 | 674 |      iinn | 
 | 675 |  | 
 | 676 |                 struct cfs_setattr_in { | 
 | 677 |                     ViceFid VFid; | 
 | 678 |                     struct coda_vattr attr; | 
 | 679 |                 } cfs_setattr; | 
 | 680 |  | 
 | 681 |  | 
 | 682 |  | 
 | 683 |  | 
 | 684 |      oouutt | 
 | 685 |         empty | 
 | 686 |  | 
 | 687 |   DDeessccrriippttiioonn The structure attr is filled with attributes to be changed | 
 | 688 |   in BSD style.  Attributes not to be changed are set to -1, apart from | 
 | 689 |   vtype which is set to VNON. Other are set to the value to be assigned. | 
 | 690 |   The only attributes which the FS driver may request to change are the | 
 | 691 |   mode, owner, groupid, atime, mtime and ctime.  The return value | 
 | 692 |   indicates success or failure. | 
 | 693 |  | 
 | 694 |   EErrrroorrss A variety of errors can occur.  The object may not exist, may | 
 | 695 |   be inaccessible, or permission may not be granted by Venus. | 
 | 696 |  | 
 | 697 |   0wpage | 
 | 698 |  | 
 | 699 |   44..77..  aacccceessss | 
 | 700 |  | 
 | 701 |  | 
 | 702 |   SSuummmmaarryy | 
 | 703 |  | 
 | 704 |   AArrgguummeennttss | 
 | 705 |  | 
 | 706 |      iinn | 
 | 707 |  | 
 | 708 |                 struct cfs_access_in { | 
 | 709 |                     ViceFid     VFid; | 
 | 710 |                     int flags; | 
 | 711 |                 } cfs_access; | 
 | 712 |  | 
 | 713 |  | 
 | 714 |  | 
 | 715 |      oouutt | 
 | 716 |         empty | 
 | 717 |  | 
 | 718 |   DDeessccrriippttiioonn Verify if access to the object identified by VFid for | 
 | 719 |   operations described by flags is permitted.  The result indicates if | 
 | 720 |   access will be granted.  It is important to remember that Coda uses | 
 | 721 |   ACLs to enforce protection and that ultimately the servers, not the | 
 | 722 |   clients enforce the security of the system.  The result of this call | 
 | 723 |   will depend on whether a _t_o_k_e_n is held by the user. | 
 | 724 |  | 
 | 725 |   EErrrroorrss The object may not exist, or the ACL describing the protection | 
 | 726 |   may not be accessible. | 
 | 727 |  | 
 | 728 |   0wpage | 
 | 729 |  | 
 | 730 |   44..88..  ccrreeaattee | 
 | 731 |  | 
 | 732 |  | 
 | 733 |   SSuummmmaarryy Invoked to create a file | 
 | 734 |  | 
 | 735 |   AArrgguummeennttss | 
 | 736 |  | 
 | 737 |      iinn | 
 | 738 |  | 
 | 739 |                 struct cfs_create_in { | 
 | 740 |                     ViceFid VFid; | 
 | 741 |                     struct coda_vattr attr; | 
 | 742 |                     int excl; | 
 | 743 |                     int mode; | 
 | 744 |                     char        *name;          /* Place holder for data. */ | 
 | 745 |                 } cfs_create; | 
 | 746 |  | 
 | 747 |  | 
 | 748 |  | 
 | 749 |  | 
 | 750 |      oouutt | 
 | 751 |  | 
 | 752 |                 struct cfs_create_out { | 
 | 753 |                     ViceFid VFid; | 
 | 754 |                     struct coda_vattr attr; | 
 | 755 |                 } cfs_create; | 
 | 756 |  | 
 | 757 |  | 
 | 758 |  | 
 | 759 |   DDeessccrriippttiioonn  This upcall is invoked to request creation of a file. | 
 | 760 |   The file will be created in the directory identified by VFid, its name | 
 | 761 |   will be name, and the mode will be mode.  If excl is set an error will | 
 | 762 |   be returned if the file already exists.  If the size field in attr is | 
 | 763 |   set to zero the file will be truncated.  The uid and gid of the file | 
 | 764 |   are set by converting the CodaCred to a uid using a macro CRTOUID | 
 | 765 |   (this macro is platform dependent).  Upon success the VFid and | 
 | 766 |   attributes of the file are returned.  The Coda FS Driver will normally | 
 | 767 |   instantiate a vnode, inode or file handle at kernel level for the new | 
 | 768 |   object. | 
 | 769 |  | 
 | 770 |  | 
 | 771 |   EErrrroorrss A variety of errors can occur. Permissions may be insufficient. | 
 | 772 |   If the object exists and is not a file the error EISDIR is returned | 
 | 773 |   under Unix. | 
 | 774 |  | 
 | 775 |   NNOOTTEE The packing of parameters is very inefficient and appears to | 
 | 776 |   indicate confusion between the system call creat and the VFS operation | 
 | 777 |   create. The VFS operation create is only called to create new objects. | 
 | 778 |   This create call differs from the Unix one in that it is not invoked | 
 | 779 |   to return a file descriptor. The truncate and exclusive options, | 
 | 780 |   together with the mode, could simply be part of the mode as it is | 
 | 781 |   under Unix.  There should be no flags argument; this is used in open | 
 | 782 |   (2) to return a file descriptor for READ or WRITE mode. | 
 | 783 |  | 
 | 784 |   The attributes of the directory should be returned too, since the size | 
 | 785 |   and mtime changed. | 
 | 786 |  | 
 | 787 |   0wpage | 
 | 788 |  | 
 | 789 |   44..99..  mmkkddiirr | 
 | 790 |  | 
 | 791 |  | 
 | 792 |   SSuummmmaarryy Create a new directory. | 
 | 793 |  | 
 | 794 |   AArrgguummeennttss | 
 | 795 |  | 
 | 796 |      iinn | 
 | 797 |  | 
 | 798 |                 struct cfs_mkdir_in { | 
 | 799 |                     ViceFid     VFid; | 
 | 800 |                     struct coda_vattr attr; | 
 | 801 |                     char        *name;          /* Place holder for data. */ | 
 | 802 |                 } cfs_mkdir; | 
 | 803 |  | 
 | 804 |  | 
 | 805 |  | 
 | 806 |      oouutt | 
 | 807 |  | 
 | 808 |                 struct cfs_mkdir_out { | 
 | 809 |                     ViceFid VFid; | 
 | 810 |                     struct coda_vattr attr; | 
 | 811 |                 } cfs_mkdir; | 
 | 812 |  | 
 | 813 |  | 
 | 814 |  | 
 | 815 |  | 
 | 816 |   DDeessccrriippttiioonn This call is similar to create but creates a directory. | 
 | 817 |   Only the mode field in the input parameters is used for creation. | 
 | 818 |   Upon successful creation, the attr returned contains the attributes of | 
 | 819 |   the new directory. | 
 | 820 |  | 
 | 821 |   EErrrroorrss As for create. | 
 | 822 |  | 
 | 823 |   NNOOTTEE The input parameter should be changed to mode instead of | 
 | 824 |   attributes. | 
 | 825 |  | 
 | 826 |   The attributes of the parent should be returned since the size and | 
 | 827 |   mtime changes. | 
 | 828 |  | 
 | 829 |   0wpage | 
 | 830 |  | 
 | 831 |   44..1100..  lliinnkk | 
 | 832 |  | 
 | 833 |  | 
 | 834 |   SSuummmmaarryy Create a link to an existing file. | 
 | 835 |  | 
 | 836 |   AArrgguummeennttss | 
 | 837 |  | 
 | 838 |      iinn | 
 | 839 |  | 
 | 840 |                 struct cfs_link_in { | 
 | 841 |                     ViceFid sourceFid;          /* cnode to link *to* */ | 
 | 842 |                     ViceFid destFid;            /* Directory in which to place link */ | 
 | 843 |                     char        *tname;         /* Place holder for data. */ | 
 | 844 |                 } cfs_link; | 
 | 845 |  | 
 | 846 |  | 
 | 847 |  | 
 | 848 |      oouutt | 
 | 849 |         empty | 
 | 850 |  | 
 | 851 |   DDeessccrriippttiioonn This call creates a link to the sourceFid in the directory | 
 | 852 |   identified by destFid with name tname.  The source must reside in the | 
 | 853 |   target's parent, i.e. the source must be have parent destFid, i.e. Coda | 
 | 854 |   does not support cross directory hard links.  Only the return value is | 
 | 855 |   relevant.  It indicates success or the type of failure. | 
 | 856 |  | 
 | 857 |   EErrrroorrss The usual errors can occur.0wpage | 
 | 858 |  | 
 | 859 |   44..1111..  ssyymmlliinnkk | 
 | 860 |  | 
 | 861 |  | 
 | 862 |   SSuummmmaarryy create a symbolic link | 
 | 863 |  | 
 | 864 |   AArrgguummeennttss | 
 | 865 |  | 
 | 866 |      iinn | 
 | 867 |  | 
 | 868 |                 struct cfs_symlink_in { | 
 | 869 |                     ViceFid     VFid;          /* Directory to put symlink in */ | 
 | 870 |                     char        *srcname; | 
 | 871 |                     struct coda_vattr attr; | 
 | 872 |                     char        *tname; | 
 | 873 |                 } cfs_symlink; | 
 | 874 |  | 
 | 875 |  | 
 | 876 |  | 
 | 877 |      oouutt | 
 | 878 |         none | 
 | 879 |  | 
 | 880 |   DDeessccrriippttiioonn Create a symbolic link. The link is to be placed in the | 
 | 881 |   directory identified by VFid and named tname.  It should point to the | 
 | 882 |   pathname srcname.  The attributes of the newly created object are to | 
 | 883 |   be set to attr. | 
 | 884 |  | 
 | 885 |   EErrrroorrss | 
 | 886 |  | 
 | 887 |   NNOOTTEE The attributes of the target directory should be returned since | 
 | 888 |   its size changed. | 
 | 889 |  | 
 | 890 |   0wpage | 
 | 891 |  | 
 | 892 |   44..1122..  rreemmoovvee | 
 | 893 |  | 
 | 894 |  | 
 | 895 |   SSuummmmaarryy Remove a file | 
 | 896 |  | 
 | 897 |   AArrgguummeennttss | 
 | 898 |  | 
 | 899 |      iinn | 
 | 900 |  | 
 | 901 |                 struct cfs_remove_in { | 
 | 902 |                     ViceFid     VFid; | 
 | 903 |                     char        *name;          /* Place holder for data. */ | 
 | 904 |                 } cfs_remove; | 
 | 905 |  | 
 | 906 |  | 
 | 907 |  | 
 | 908 |      oouutt | 
 | 909 |         none | 
 | 910 |  | 
 | 911 |   DDeessccrriippttiioonn  Remove file named cfs_remove_in.name in directory | 
 | 912 |   identified by   VFid. | 
 | 913 |  | 
 | 914 |   EErrrroorrss | 
 | 915 |  | 
 | 916 |   NNOOTTEE The attributes of the directory should be returned since its | 
 | 917 |   mtime and size may change. | 
 | 918 |  | 
 | 919 |   0wpage | 
 | 920 |  | 
 | 921 |   44..1133..  rrmmddiirr | 
 | 922 |  | 
 | 923 |  | 
 | 924 |   SSuummmmaarryy Remove a directory | 
 | 925 |  | 
 | 926 |   AArrgguummeennttss | 
 | 927 |  | 
 | 928 |      iinn | 
 | 929 |  | 
 | 930 |                 struct cfs_rmdir_in { | 
 | 931 |                     ViceFid     VFid; | 
 | 932 |                     char        *name;          /* Place holder for data. */ | 
 | 933 |                 } cfs_rmdir; | 
 | 934 |  | 
 | 935 |  | 
 | 936 |  | 
 | 937 |      oouutt | 
 | 938 |         none | 
 | 939 |  | 
 | 940 |   DDeessccrriippttiioonn Remove the directory with name name from the directory | 
 | 941 |   identified by VFid. | 
 | 942 |  | 
 | 943 |   EErrrroorrss | 
 | 944 |  | 
 | 945 |   NNOOTTEE The attributes of the parent directory should be returned since | 
 | 946 |   its mtime and size may change. | 
 | 947 |  | 
 | 948 |   0wpage | 
 | 949 |  | 
 | 950 |   44..1144..  rreeaaddlliinnkk | 
 | 951 |  | 
 | 952 |  | 
 | 953 |   SSuummmmaarryy Read the value of a symbolic link. | 
 | 954 |  | 
 | 955 |   AArrgguummeennttss | 
 | 956 |  | 
 | 957 |      iinn | 
 | 958 |  | 
 | 959 |                 struct cfs_readlink_in { | 
 | 960 |                     ViceFid VFid; | 
 | 961 |                 } cfs_readlink; | 
 | 962 |  | 
 | 963 |  | 
 | 964 |  | 
 | 965 |      oouutt | 
 | 966 |  | 
 | 967 |                 struct cfs_readlink_out { | 
 | 968 |                     int count; | 
 | 969 |                     caddr_t     data;           /* Place holder for data. */ | 
 | 970 |                 } cfs_readlink; | 
 | 971 |  | 
 | 972 |  | 
 | 973 |  | 
 | 974 |   DDeessccrriippttiioonn This routine reads the contents of symbolic link | 
 | 975 |   identified by VFid into the buffer data.  The buffer data must be able | 
 | 976 |   to hold any name up to CFS_MAXNAMLEN (PATH or NAM??). | 
 | 977 |  | 
 | 978 |   EErrrroorrss No unusual errors. | 
 | 979 |  | 
 | 980 |   0wpage | 
 | 981 |  | 
 | 982 |   44..1155..  ooppeenn | 
 | 983 |  | 
 | 984 |  | 
 | 985 |   SSuummmmaarryy Open a file. | 
 | 986 |  | 
 | 987 |   AArrgguummeennttss | 
 | 988 |  | 
 | 989 |      iinn | 
 | 990 |  | 
 | 991 |                 struct cfs_open_in { | 
 | 992 |                     ViceFid     VFid; | 
 | 993 |                     int flags; | 
 | 994 |                 } cfs_open; | 
 | 995 |  | 
 | 996 |  | 
 | 997 |  | 
 | 998 |      oouutt | 
 | 999 |  | 
 | 1000 |                 struct cfs_open_out { | 
 | 1001 |                     dev_t       dev; | 
 | 1002 |                     ino_t       inode; | 
 | 1003 |                 } cfs_open; | 
 | 1004 |  | 
 | 1005 |  | 
 | 1006 |  | 
 | 1007 |   DDeessccrriippttiioonn  This request asks Venus to place the file identified by | 
 | 1008 |   VFid in its cache and to note that the calling process wishes to open | 
 | 1009 |   it with flags as in open(2).  The return value to the kernel differs | 
 | 1010 |   for Unix and Windows systems.  For Unix systems the Coda FS Driver is | 
 | 1011 |   informed of the device and inode number of the container file in the | 
 | 1012 |   fields dev and inode.  For Windows the path of the container file is | 
 | 1013 |   returned to the kernel. | 
 | 1014 |   EErrrroorrss | 
 | 1015 |  | 
 | 1016 |   NNOOTTEE Currently the cfs_open_out structure is not properly adapted to | 
 | 1017 |   deal with the Windows case.  It might be best to implement two | 
 | 1018 |   upcalls, one to open aiming at a container file name, the other at a | 
 | 1019 |   container file inode. | 
 | 1020 |  | 
 | 1021 |   0wpage | 
 | 1022 |  | 
 | 1023 |   44..1166..  cclloossee | 
 | 1024 |  | 
 | 1025 |  | 
 | 1026 |   SSuummmmaarryy Close a file, update it on the servers. | 
 | 1027 |  | 
 | 1028 |   AArrgguummeennttss | 
 | 1029 |  | 
 | 1030 |      iinn | 
 | 1031 |  | 
 | 1032 |                 struct cfs_close_in { | 
 | 1033 |                     ViceFid     VFid; | 
 | 1034 |                     int flags; | 
 | 1035 |                 } cfs_close; | 
 | 1036 |  | 
 | 1037 |  | 
 | 1038 |  | 
 | 1039 |      oouutt | 
 | 1040 |         none | 
 | 1041 |  | 
 | 1042 |   DDeessccrriippttiioonn Close the file identified by VFid. | 
 | 1043 |  | 
 | 1044 |   EErrrroorrss | 
 | 1045 |  | 
 | 1046 |   NNOOTTEE The flags argument is bogus and not used.  However, Venus' code | 
 | 1047 |   has room to deal with an execp input field, probably this field should | 
 | 1048 |   be used to inform Venus that the file was closed but is still memory | 
 | 1049 |   mapped for execution.  There are comments about fetching versus not | 
 | 1050 |   fetching the data in Venus vproc_vfscalls.  This seems silly.  If a | 
 | 1051 |   file is being closed, the data in the container file is to be the new | 
 | 1052 |   data.  Here again the execp flag might be in play to create confusion: | 
 | 1053 |   currently Venus might think a file can be flushed from the cache when | 
 | 1054 |   it is still memory mapped.  This needs to be understood. | 
 | 1055 |  | 
 | 1056 |   0wpage | 
 | 1057 |  | 
 | 1058 |   44..1177..  iiooccttll | 
 | 1059 |  | 
 | 1060 |  | 
 | 1061 |   SSuummmmaarryy Do an ioctl on a file. This includes the pioctl interface. | 
 | 1062 |  | 
 | 1063 |   AArrgguummeennttss | 
 | 1064 |  | 
 | 1065 |      iinn | 
 | 1066 |  | 
 | 1067 |                 struct cfs_ioctl_in { | 
 | 1068 |                     ViceFid VFid; | 
 | 1069 |                     int cmd; | 
 | 1070 |                     int len; | 
 | 1071 |                     int rwflag; | 
 | 1072 |                     char *data;                 /* Place holder for data. */ | 
 | 1073 |                 } cfs_ioctl; | 
 | 1074 |  | 
 | 1075 |  | 
 | 1076 |  | 
 | 1077 |      oouutt | 
 | 1078 |  | 
 | 1079 |  | 
 | 1080 |                 struct cfs_ioctl_out { | 
 | 1081 |                     int len; | 
 | 1082 |                     caddr_t     data;           /* Place holder for data. */ | 
 | 1083 |                 } cfs_ioctl; | 
 | 1084 |  | 
 | 1085 |  | 
 | 1086 |  | 
 | 1087 |   DDeessccrriippttiioonn Do an ioctl operation on a file.  The command, len and | 
 | 1088 |   data arguments are filled as usual.  flags is not used by Venus. | 
 | 1089 |  | 
 | 1090 |   EErrrroorrss | 
 | 1091 |  | 
 | 1092 |   NNOOTTEE Another bogus parameter.  flags is not used.  What is the | 
 | 1093 |   business about PREFETCHING in the Venus code? | 
 | 1094 |  | 
 | 1095 |  | 
 | 1096 |   0wpage | 
 | 1097 |  | 
 | 1098 |   44..1188..  rreennaammee | 
 | 1099 |  | 
 | 1100 |  | 
 | 1101 |   SSuummmmaarryy Rename a fid. | 
 | 1102 |  | 
 | 1103 |   AArrgguummeennttss | 
 | 1104 |  | 
 | 1105 |      iinn | 
 | 1106 |  | 
 | 1107 |                 struct cfs_rename_in { | 
 | 1108 |                     ViceFid     sourceFid; | 
 | 1109 |                     char        *srcname; | 
 | 1110 |                     ViceFid destFid; | 
 | 1111 |                     char        *destname; | 
 | 1112 |                 } cfs_rename; | 
 | 1113 |  | 
 | 1114 |  | 
 | 1115 |  | 
 | 1116 |      oouutt | 
 | 1117 |         none | 
 | 1118 |  | 
 | 1119 |   DDeessccrriippttiioonn  Rename the object with name srcname in directory | 
 | 1120 |   sourceFid to destname in destFid.   It is important that the names | 
 | 1121 |   srcname and destname are 0 terminated strings.  Strings in Unix | 
 | 1122 |   kernels are not always null terminated. | 
 | 1123 |  | 
 | 1124 |   EErrrroorrss | 
 | 1125 |  | 
 | 1126 |   0wpage | 
 | 1127 |  | 
 | 1128 |   44..1199..  rreeaaddddiirr | 
 | 1129 |  | 
 | 1130 |  | 
 | 1131 |   SSuummmmaarryy Read directory entries. | 
 | 1132 |  | 
 | 1133 |   AArrgguummeennttss | 
 | 1134 |  | 
 | 1135 |      iinn | 
 | 1136 |  | 
 | 1137 |                 struct cfs_readdir_in { | 
 | 1138 |                     ViceFid     VFid; | 
 | 1139 |                     int count; | 
 | 1140 |                     int offset; | 
 | 1141 |                 } cfs_readdir; | 
 | 1142 |  | 
 | 1143 |  | 
 | 1144 |  | 
 | 1145 |  | 
 | 1146 |      oouutt | 
 | 1147 |  | 
 | 1148 |                 struct cfs_readdir_out { | 
 | 1149 |                     int size; | 
 | 1150 |                     caddr_t     data;           /* Place holder for data. */ | 
 | 1151 |                 } cfs_readdir; | 
 | 1152 |  | 
 | 1153 |  | 
 | 1154 |  | 
 | 1155 |   DDeessccrriippttiioonn Read directory entries from VFid starting at offset and | 
 | 1156 |   read at most count bytes.  Returns the data in data and returns | 
 | 1157 |   the size in size. | 
 | 1158 |  | 
 | 1159 |   EErrrroorrss | 
 | 1160 |  | 
 | 1161 |   NNOOTTEE This call is not used.  Readdir operations exploit container | 
 | 1162 |   files.  We will re-evaluate this during the directory revamp which is | 
 | 1163 |   about to take place. | 
 | 1164 |  | 
 | 1165 |   0wpage | 
 | 1166 |  | 
 | 1167 |   44..2200..  vvggeett | 
 | 1168 |  | 
 | 1169 |  | 
 | 1170 |   SSuummmmaarryy instructs Venus to do an FSDB->Get. | 
 | 1171 |  | 
 | 1172 |   AArrgguummeennttss | 
 | 1173 |  | 
 | 1174 |      iinn | 
 | 1175 |  | 
 | 1176 |                 struct cfs_vget_in { | 
 | 1177 |                     ViceFid VFid; | 
 | 1178 |                 } cfs_vget; | 
 | 1179 |  | 
 | 1180 |  | 
 | 1181 |  | 
 | 1182 |      oouutt | 
 | 1183 |  | 
 | 1184 |                 struct cfs_vget_out { | 
 | 1185 |                     ViceFid VFid; | 
 | 1186 |                     int vtype; | 
 | 1187 |                 } cfs_vget; | 
 | 1188 |  | 
 | 1189 |  | 
 | 1190 |  | 
 | 1191 |   DDeessccrriippttiioonn This upcall asks Venus to do a get operation on an fsobj | 
 | 1192 |   labelled by VFid. | 
 | 1193 |  | 
 | 1194 |   EErrrroorrss | 
 | 1195 |  | 
 | 1196 |   NNOOTTEE This operation is not used.  However, it is extremely useful | 
 | 1197 |   since it can be used to deal with read/write memory mapped files. | 
 | 1198 |   These can be "pinned" in the Venus cache using vget and released with | 
 | 1199 |   inactive. | 
 | 1200 |  | 
 | 1201 |   0wpage | 
 | 1202 |  | 
 | 1203 |   44..2211..  ffssyynncc | 
 | 1204 |  | 
 | 1205 |  | 
 | 1206 |   SSuummmmaarryy Tell Venus to update the RVM attributes of a file. | 
 | 1207 |  | 
 | 1208 |   AArrgguummeennttss | 
 | 1209 |  | 
 | 1210 |      iinn | 
 | 1211 |  | 
 | 1212 |                 struct cfs_fsync_in { | 
 | 1213 |                     ViceFid VFid; | 
 | 1214 |                 } cfs_fsync; | 
 | 1215 |  | 
 | 1216 |  | 
 | 1217 |  | 
 | 1218 |      oouutt | 
 | 1219 |         none | 
 | 1220 |  | 
 | 1221 |   DDeessccrriippttiioonn Ask Venus to update RVM attributes of object VFid. This | 
 | 1222 |   should be called as part of kernel level fsync type calls.  The | 
 | 1223 |   result indicates if the syncing was successful. | 
 | 1224 |  | 
 | 1225 |   EErrrroorrss | 
 | 1226 |  | 
 | 1227 |   NNOOTTEE Linux does not implement this call. It should. | 
 | 1228 |  | 
 | 1229 |   0wpage | 
 | 1230 |  | 
 | 1231 |   44..2222..  iinnaaccttiivvee | 
 | 1232 |  | 
 | 1233 |  | 
 | 1234 |   SSuummmmaarryy Tell Venus a vnode is no longer in use. | 
 | 1235 |  | 
 | 1236 |   AArrgguummeennttss | 
 | 1237 |  | 
 | 1238 |      iinn | 
 | 1239 |  | 
 | 1240 |                 struct cfs_inactive_in { | 
 | 1241 |                     ViceFid VFid; | 
 | 1242 |                 } cfs_inactive; | 
 | 1243 |  | 
 | 1244 |  | 
 | 1245 |  | 
 | 1246 |      oouutt | 
 | 1247 |         none | 
 | 1248 |  | 
 | 1249 |   DDeessccrriippttiioonn This operation returns EOPNOTSUPP. | 
 | 1250 |  | 
 | 1251 |   EErrrroorrss | 
 | 1252 |  | 
 | 1253 |   NNOOTTEE This should perhaps be removed. | 
 | 1254 |  | 
 | 1255 |   0wpage | 
 | 1256 |  | 
 | 1257 |   44..2233..  rrddwwrr | 
 | 1258 |  | 
 | 1259 |  | 
 | 1260 |   SSuummmmaarryy Read or write from a file | 
 | 1261 |  | 
 | 1262 |   AArrgguummeennttss | 
 | 1263 |  | 
 | 1264 |      iinn | 
 | 1265 |  | 
 | 1266 |                 struct cfs_rdwr_in { | 
 | 1267 |                     ViceFid     VFid; | 
 | 1268 |                     int rwflag; | 
 | 1269 |                     int count; | 
 | 1270 |                     int offset; | 
 | 1271 |                     int ioflag; | 
 | 1272 |                     caddr_t     data;           /* Place holder for data. */ | 
 | 1273 |                 } cfs_rdwr; | 
 | 1274 |  | 
 | 1275 |  | 
 | 1276 |  | 
 | 1277 |  | 
 | 1278 |      oouutt | 
 | 1279 |  | 
 | 1280 |                 struct cfs_rdwr_out { | 
 | 1281 |                     int rwflag; | 
 | 1282 |                     int count; | 
 | 1283 |                     caddr_t     data;   /* Place holder for data. */ | 
 | 1284 |                 } cfs_rdwr; | 
 | 1285 |  | 
 | 1286 |  | 
 | 1287 |  | 
 | 1288 |   DDeessccrriippttiioonn This upcall asks Venus to read or write from a file. | 
 | 1289 |  | 
 | 1290 |   EErrrroorrss | 
 | 1291 |  | 
 | 1292 |   NNOOTTEE It should be removed since it is against the Coda philosophy that | 
 | 1293 |   read/write operations never reach Venus.  I have been told the | 
 | 1294 |   operation does not work.  It is not currently used. | 
 | 1295 |  | 
 | 1296 |  | 
 | 1297 |   0wpage | 
 | 1298 |  | 
 | 1299 |   44..2244..  ooddyymmoouunntt | 
 | 1300 |  | 
 | 1301 |  | 
 | 1302 |   SSuummmmaarryy Allows mounting multiple Coda "filesystems" on one Unix mount | 
 | 1303 |   point. | 
 | 1304 |  | 
 | 1305 |   AArrgguummeennttss | 
 | 1306 |  | 
 | 1307 |      iinn | 
 | 1308 |  | 
 | 1309 |                 struct ody_mount_in { | 
 | 1310 |                     char        *name;          /* Place holder for data. */ | 
 | 1311 |                 } ody_mount; | 
 | 1312 |  | 
 | 1313 |  | 
 | 1314 |  | 
 | 1315 |      oouutt | 
 | 1316 |  | 
 | 1317 |                 struct ody_mount_out { | 
 | 1318 |                     ViceFid VFid; | 
 | 1319 |                 } ody_mount; | 
 | 1320 |  | 
 | 1321 |  | 
 | 1322 |  | 
 | 1323 |   DDeessccrriippttiioonn  Asks Venus to return the rootfid of a Coda system named | 
 | 1324 |   name.  The fid is returned in VFid. | 
 | 1325 |  | 
 | 1326 |   EErrrroorrss | 
 | 1327 |  | 
 | 1328 |   NNOOTTEE This call was used by David for dynamic sets.  It should be | 
 | 1329 |   removed since it causes a jungle of pointers in the VFS mounting area. | 
 | 1330 |   It is not used by Coda proper.  Call is not implemented by Venus. | 
 | 1331 |  | 
 | 1332 |   0wpage | 
 | 1333 |  | 
 | 1334 |   44..2255..  ooddyy__llooookkuupp | 
 | 1335 |  | 
 | 1336 |  | 
 | 1337 |   SSuummmmaarryy Looks up something. | 
 | 1338 |  | 
 | 1339 |   AArrgguummeennttss | 
 | 1340 |  | 
 | 1341 |      iinn irrelevant | 
 | 1342 |  | 
 | 1343 |  | 
 | 1344 |      oouutt | 
 | 1345 |         irrelevant | 
 | 1346 |  | 
 | 1347 |   DDeessccrriippttiioonn | 
 | 1348 |  | 
 | 1349 |   EErrrroorrss | 
 | 1350 |  | 
 | 1351 |   NNOOTTEE Gut it. Call is not implemented by Venus. | 
 | 1352 |  | 
 | 1353 |   0wpage | 
 | 1354 |  | 
 | 1355 |   44..2266..  ooddyy__eexxppaanndd | 
 | 1356 |  | 
 | 1357 |  | 
 | 1358 |   SSuummmmaarryy expands something in a dynamic set. | 
 | 1359 |  | 
 | 1360 |   AArrgguummeennttss | 
 | 1361 |  | 
 | 1362 |      iinn irrelevant | 
 | 1363 |  | 
 | 1364 |      oouutt | 
 | 1365 |         irrelevant | 
 | 1366 |  | 
 | 1367 |   DDeessccrriippttiioonn | 
 | 1368 |  | 
 | 1369 |   EErrrroorrss | 
 | 1370 |  | 
 | 1371 |   NNOOTTEE Gut it.  Call is not implemented by Venus. | 
 | 1372 |  | 
 | 1373 |   0wpage | 
 | 1374 |  | 
 | 1375 |   44..2277..  pprreeffeettcchh | 
 | 1376 |  | 
 | 1377 |  | 
 | 1378 |   SSuummmmaarryy Prefetch a dynamic set. | 
 | 1379 |  | 
 | 1380 |   AArrgguummeennttss | 
 | 1381 |  | 
 | 1382 |      iinn Not documented. | 
 | 1383 |  | 
 | 1384 |      oouutt | 
 | 1385 |         Not documented. | 
 | 1386 |  | 
 | 1387 |   DDeessccrriippttiioonn  Venus worker.cc has support for this call, although it is | 
 | 1388 |   noted that it doesn't work.  Not surprising, since the kernel does not | 
 | 1389 |   have support for it. (ODY_PREFETCH is not a defined operation). | 
 | 1390 |  | 
 | 1391 |   EErrrroorrss | 
 | 1392 |  | 
 | 1393 |   NNOOTTEE Gut it. It isn't working and isn't used by Coda. | 
 | 1394 |  | 
 | 1395 |  | 
 | 1396 |   0wpage | 
 | 1397 |  | 
 | 1398 |   44..2288..  ssiiggnnaall | 
 | 1399 |  | 
 | 1400 |  | 
 | 1401 |   SSuummmmaarryy Send Venus a signal about an upcall. | 
 | 1402 |  | 
 | 1403 |   AArrgguummeennttss | 
 | 1404 |  | 
 | 1405 |      iinn none | 
 | 1406 |  | 
 | 1407 |      oouutt | 
 | 1408 |         not applicable. | 
 | 1409 |  | 
 | 1410 |   DDeessccrriippttiioonn  This is an out-of-band upcall to Venus to inform Venus | 
 | 1411 |   that the calling process received a signal after Venus read the | 
 | 1412 |   message from the input queue.  Venus is supposed to clean up the | 
 | 1413 |   operation. | 
 | 1414 |  | 
 | 1415 |   EErrrroorrss No reply is given. | 
 | 1416 |  | 
 | 1417 |   NNOOTTEE We need to better understand what Venus needs to clean up and if | 
 | 1418 |   it is doing this correctly.  Also we need to handle multiple upcall | 
 | 1419 |   per system call situations correctly.  It would be important to know | 
 | 1420 |   what state changes in Venus take place after an upcall for which the | 
 | 1421 |   kernel is responsible for notifying Venus to clean up (e.g. open | 
 | 1422 |   definitely is such a state change, but many others are maybe not). | 
 | 1423 |  | 
 | 1424 |   0wpage | 
 | 1425 |  | 
 | 1426 |   55..  TThhee mmiinniiccaacchhee aanndd ddoowwnnccaallllss | 
 | 1427 |  | 
 | 1428 |  | 
 | 1429 |   The Coda FS Driver can cache results of lookup and access upcalls, to | 
 | 1430 |   limit the frequency of upcalls.  Upcalls carry a price since a process | 
 | 1431 |   context switch needs to take place.  The counterpart of caching the | 
 | 1432 |   information is that Venus will notify the FS Driver that cached | 
 | 1433 |   entries must be flushed or renamed. | 
 | 1434 |  | 
 | 1435 |   The kernel code generally has to maintain a structure which links the | 
 | 1436 |   internal file handles (called vnodes in BSD, inodes in Linux and | 
 | 1437 |   FileHandles in Windows) with the ViceFid's which Venus maintains.  The | 
 | 1438 |   reason is that frequent translations back and forth are needed in | 
 | 1439 |   order to make upcalls and use the results of upcalls.  Such linking | 
 | 1440 |   objects are called ccnnooddeess. | 
 | 1441 |  | 
 | 1442 |   The current minicache implementations have cache entries which record | 
 | 1443 |   the following: | 
 | 1444 |  | 
 | 1445 |   1. the name of the file | 
 | 1446 |  | 
 | 1447 |   2. the cnode of the directory containing the object | 
 | 1448 |  | 
 | 1449 |   3. a list of CodaCred's for which the lookup is permitted. | 
 | 1450 |  | 
 | 1451 |   4. the cnode of the object | 
 | 1452 |  | 
 | 1453 |   The lookup call in the Coda FS Driver may request the cnode of the | 
 | 1454 |   desired object from the cache, by passing its name, directory and the | 
 | 1455 |   CodaCred's of the caller.  The cache will return the cnode or indicate | 
 | 1456 |   that it cannot be found.  The Coda FS Driver must be careful to | 
 | 1457 |   invalidate cache entries when it modifies or removes objects. | 
 | 1458 |  | 
 | 1459 |   When Venus obtains information that indicates that cache entries are | 
 | 1460 |   no longer valid, it will make a downcall to the kernel.  Downcalls are | 
 | 1461 |   intercepted by the Coda FS Driver and lead to cache invalidations of | 
 | 1462 |   the kind described below.  The Coda FS Driver does not return an error | 
 | 1463 |   unless the downcall data could not be read into kernel memory. | 
 | 1464 |  | 
 | 1465 |  | 
 | 1466 |   55..11..  IINNVVAALLIIDDAATTEE | 
 | 1467 |  | 
 | 1468 |  | 
 | 1469 |   No information is available on this call. | 
 | 1470 |  | 
 | 1471 |  | 
 | 1472 |   55..22..  FFLLUUSSHH | 
 | 1473 |  | 
 | 1474 |  | 
 | 1475 |  | 
 | 1476 |   AArrgguummeennttss None | 
 | 1477 |  | 
 | 1478 |   SSuummmmaarryy Flush the name cache entirely. | 
 | 1479 |  | 
 | 1480 |   DDeessccrriippttiioonn Venus issues this call upon startup and when it dies. This | 
 | 1481 |   is to prevent stale cache information being held.  Some operating | 
 | 1482 |   systems allow the kernel name cache to be switched off dynamically. | 
 | 1483 |   When this is done, this downcall is made. | 
 | 1484 |  | 
 | 1485 |  | 
 | 1486 |   55..33..  PPUURRGGEEUUSSEERR | 
 | 1487 |  | 
 | 1488 |  | 
 | 1489 |   AArrgguummeennttss | 
 | 1490 |  | 
 | 1491 |           struct cfs_purgeuser_out {/* CFS_PURGEUSER is a venus->kernel call */ | 
 | 1492 |               struct CodaCred cred; | 
 | 1493 |           } cfs_purgeuser; | 
 | 1494 |  | 
 | 1495 |  | 
 | 1496 |  | 
 | 1497 |   DDeessccrriippttiioonn Remove all entries in the cache carrying the Cred.  This | 
 | 1498 |   call is issued when tokens for a user expire or are flushed. | 
 | 1499 |  | 
 | 1500 |  | 
 | 1501 |   55..44..  ZZAAPPFFIILLEE | 
 | 1502 |  | 
 | 1503 |  | 
 | 1504 |   AArrgguummeennttss | 
 | 1505 |  | 
 | 1506 |           struct cfs_zapfile_out {  /* CFS_ZAPFILE is a venus->kernel call */ | 
 | 1507 |               ViceFid CodaFid; | 
 | 1508 |           } cfs_zapfile; | 
 | 1509 |  | 
 | 1510 |  | 
 | 1511 |  | 
 | 1512 |   DDeessccrriippttiioonn Remove all entries which have the (dir vnode, name) pair. | 
 | 1513 |   This is issued as a result of an invalidation of cached attributes of | 
 | 1514 |   a vnode. | 
 | 1515 |  | 
 | 1516 |   NNOOTTEE Call is not named correctly in NetBSD and Mach.  The minicache | 
 | 1517 |   zapfile routine takes different arguments. Linux does not implement | 
 | 1518 |   the invalidation of attributes correctly. | 
 | 1519 |  | 
 | 1520 |  | 
 | 1521 |  | 
 | 1522 |   55..55..  ZZAAPPDDIIRR | 
 | 1523 |  | 
 | 1524 |  | 
 | 1525 |   AArrgguummeennttss | 
 | 1526 |  | 
 | 1527 |           struct cfs_zapdir_out {   /* CFS_ZAPDIR is a venus->kernel call */ | 
 | 1528 |               ViceFid CodaFid; | 
 | 1529 |           } cfs_zapdir; | 
 | 1530 |  | 
 | 1531 |  | 
 | 1532 |  | 
 | 1533 |   DDeessccrriippttiioonn Remove all entries in the cache lying in a directory | 
 | 1534 |   CodaFid, and all children of this directory. This call is issued when | 
 | 1535 |   Venus receives a callback on the directory. | 
 | 1536 |  | 
 | 1537 |  | 
 | 1538 |   55..66..  ZZAAPPVVNNOODDEE | 
 | 1539 |  | 
 | 1540 |  | 
 | 1541 |  | 
 | 1542 |   AArrgguummeennttss | 
 | 1543 |  | 
 | 1544 |           struct cfs_zapvnode_out { /* CFS_ZAPVNODE is a venus->kernel call */ | 
 | 1545 |               struct CodaCred cred; | 
 | 1546 |               ViceFid VFid; | 
 | 1547 |           } cfs_zapvnode; | 
 | 1548 |  | 
 | 1549 |  | 
 | 1550 |  | 
 | 1551 |   DDeessccrriippttiioonn Remove all entries in the cache carrying the cred and VFid | 
 | 1552 |   as in the arguments. This downcall is probably never issued. | 
 | 1553 |  | 
 | 1554 |  | 
 | 1555 |   55..77..  PPUURRGGEEFFIIDD | 
 | 1556 |  | 
 | 1557 |  | 
 | 1558 |   SSuummmmaarryy | 
 | 1559 |  | 
 | 1560 |   AArrgguummeennttss | 
 | 1561 |  | 
 | 1562 |           struct cfs_purgefid_out { /* CFS_PURGEFID is a venus->kernel call */ | 
 | 1563 |               ViceFid CodaFid; | 
 | 1564 |           } cfs_purgefid; | 
 | 1565 |  | 
 | 1566 |  | 
 | 1567 |  | 
 | 1568 |   DDeessccrriippttiioonn Flush the attribute for the file. If it is a dir (odd | 
 | 1569 |   vnode), purge its children from the namecache and remove the file from the | 
 | 1570 |   namecache. | 
 | 1571 |  | 
 | 1572 |  | 
 | 1573 |  | 
 | 1574 |   55..88..  RREEPPLLAACCEE | 
 | 1575 |  | 
 | 1576 |  | 
 | 1577 |   SSuummmmaarryy Replace the Fid's for a collection of names. | 
 | 1578 |  | 
 | 1579 |   AArrgguummeennttss | 
 | 1580 |  | 
 | 1581 |           struct cfs_replace_out { /* cfs_replace is a venus->kernel call */ | 
 | 1582 |               ViceFid NewFid; | 
 | 1583 |               ViceFid OldFid; | 
 | 1584 |           } cfs_replace; | 
 | 1585 |  | 
 | 1586 |  | 
 | 1587 |  | 
 | 1588 |   DDeessccrriippttiioonn This routine replaces a ViceFid in the name cache with | 
 | 1589 |   another.  It is added to allow Venus during reintegration to replace | 
 | 1590 |   locally allocated temp fids while disconnected with global fids even | 
 | 1591 |   when the reference counts on those fids are not zero. | 
 | 1592 |  | 
 | 1593 |   0wpage | 
 | 1594 |  | 
 | 1595 |   66..  IInniittiiaalliizzaattiioonn aanndd cclleeaannuupp | 
 | 1596 |  | 
 | 1597 |  | 
 | 1598 |   This section gives brief hints as to desirable features for the Coda | 
 | 1599 |   FS Driver at startup and upon shutdown or Venus failures.  Before | 
 | 1600 |   entering the discussion it is useful to repeat that the Coda FS Driver | 
 | 1601 |   maintains the following data: | 
 | 1602 |  | 
 | 1603 |  | 
 | 1604 |   1. message queues | 
 | 1605 |  | 
 | 1606 |   2. cnodes | 
 | 1607 |  | 
 | 1608 |   3. name cache entries | 
 | 1609 |  | 
 | 1610 |      The name cache entries are entirely private to the driver, so they | 
 | 1611 |      can easily be manipulated.   The message queues will generally have | 
 | 1612 |      clear points of initialization and destruction.  The cnodes are | 
 | 1613 |      much more delicate.  User processes hold reference counts in Coda | 
 | 1614 |      filesystems and it can be difficult to clean up the cnodes. | 
 | 1615 |  | 
 | 1616 |   It can expect requests through: | 
 | 1617 |  | 
 | 1618 |   1. the message subsystem | 
 | 1619 |  | 
 | 1620 |   2. the VFS layer | 
 | 1621 |  | 
 | 1622 |   3. pioctl interface | 
 | 1623 |  | 
 | 1624 |      Currently the _p_i_o_c_t_l passes through the VFS for Coda so we can | 
 | 1625 |      treat these similarly. | 
 | 1626 |  | 
 | 1627 |  | 
 | 1628 |   66..11..  RReeqquuiirreemmeennttss | 
 | 1629 |  | 
 | 1630 |  | 
 | 1631 |   The following requirements should be accommodated: | 
 | 1632 |  | 
 | 1633 |   1. The message queues should have open and close routines.  On Unix | 
 | 1634 |      the opening of the character devices are such routines. | 
 | 1635 |  | 
 | 1636 |   +o  Before opening, no messages can be placed. | 
 | 1637 |  | 
 | 1638 |   +o  Opening will remove any old messages still pending. | 
 | 1639 |  | 
 | 1640 |   +o  Close will notify any sleeping processes that their upcall cannot | 
 | 1641 |      be completed. | 
 | 1642 |  | 
 | 1643 |   +o  Close will free all memory allocated by the message queues. | 
 | 1644 |  | 
 | 1645 |  | 
 | 1646 |   2. At open the namecache shall be initialized to empty state. | 
 | 1647 |  | 
 | 1648 |   3. Before the message queues are open, all VFS operations will fail. | 
 | 1649 |      Fortunately this can be achieved by making sure than mounting the | 
 | 1650 |      Coda filesystem cannot succeed before opening. | 
 | 1651 |  | 
 | 1652 |   4. After closing of the queues, no VFS operations can succeed.  Here | 
 | 1653 |      one needs to be careful, since a few operations (lookup, | 
 | 1654 |      read/write, readdir) can proceed without upcalls.  These must be | 
 | 1655 |      explicitly blocked. | 
 | 1656 |  | 
 | 1657 |   5. Upon closing the namecache shall be flushed and disabled. | 
 | 1658 |  | 
 | 1659 |   6. All memory held by cnodes can be freed without relying on upcalls. | 
 | 1660 |  | 
 | 1661 |   7. Unmounting the file system can be done without relying on upcalls. | 
 | 1662 |  | 
 | 1663 |   8. Mounting the Coda filesystem should fail gracefully if Venus cannot | 
 | 1664 |      get the rootfid or the attributes of the rootfid.  The latter is | 
 | 1665 |      best implemented by Venus fetching these objects before attempting | 
 | 1666 |      to mount. | 
 | 1667 |  | 
 | 1668 |   NNOOTTEE  NetBSD in particular but also Linux have not implemented the | 
 | 1669 |   above requirements fully.  For smooth operation this needs to be | 
 | 1670 |   corrected. | 
 | 1671 |  | 
 | 1672 |  | 
 | 1673 |  |