Merge from vendor branch LIBSTDC++:
[dragonfly.git] / share / doc / papers / fsinterface / fsinterface.ms
1 .\" Copyright (c) 1986 The Regents of the University of California.
2 .\" All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\" 3. All advertising materials mentioning features or use of this software
13 .\"    must display the following acknowledgement:
14 .\"     This product includes software developed by the University of
15 .\"     California, Berkeley and its contributors.
16 .\" 4. Neither the name of the University nor the names of its contributors
17 .\"    may be used to endorse or promote products derived from this software
18 .\"    without specific prior written permission.
19 .\"
20 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 .\" SUCH DAMAGE.
31 .\"
32 .\"     @(#)fsinterface.ms      1.4 (Berkeley) 4/16/91
33 .\" $FreeBSD: src/share/doc/papers/fsinterface/fsinterface.ms,v 1.7.2.1 2000/11/27 18:18:15 ru Exp $
34 .\" $DragonFly: src/share/doc/papers/fsinterface/fsinterface.ms,v 1.2 2003/06/17 04:36:56 dillon Exp $
35 .\"
36 .nr UX 0
37 .de UX
38 .ie \\n(UX \s-1UNIX\s0\\$1
39 .el \{\
40 \s-1UNIX\s0\\$1\(dg
41 .FS
42 \(dg \s-1UNIX\s0 is a registered trademark of AT&T.
43 .FE
44 .nr UX 1
45 .\}
46 ..
47 .TL
48 Toward a Compatible Filesystem Interface
49 .AU
50 Michael J. Karels
51 Marshall Kirk McKusick
52 .AI
53 Computer Systems Research Group
54 Computer Science Division
55 Department of Electrical Engineering and Computer Science
56 University of California, Berkeley
57 Berkeley, California  94720
58 .AB
59 .LP
60 As network or remote filesystems have been implemented for
61 .UX ,
62 several stylized interfaces between the filesystem implementation
63 and the rest of the kernel have been developed.
64 .FS
65 This is an update of a paper originally presented
66 at the September 1986 conference of the European
67 .UX
68 Users' Group.
69 Last modified April 16, 1991.
70 .FE
71 Notable among these are Sun Microsystems' Virtual Filesystem interface (VFS)
72 using vnodes, Digital Equipment's Generic File System (GFS) architecture,
73 and AT&T's File System Switch (FSS).
74 Each design attempts to isolate filesystem-dependent details
75 below a generic interface and to provide a framework within which
76 new filesystems may be incorporated.
77 However, each of these interfaces is different from
78 and incompatible with the others.
79 Each of them addresses somewhat different design goals.
80 Each was based on a different starting version of
81 .UX ,
82 targetted a different set of filesystems with varying characteristics,
83 and uses a different set of primitive operations provided by the filesystem.
84 The current study compares the various filesystem interfaces.
85 Criteria for comparison include generality, completeness, robustness,
86 efficiency and esthetics.
87 Several of the underlying design issues are examined in detail.
88 As a result of this comparison, a proposal for a new filesystem interface
89 is advanced that includes the best features of the existing implementations.
90 The proposal adopts the calling convention for name lookup introduced
91 in 4.3BSD, but is otherwise closely related to Sun's VFS.
92 A prototype implementation is now being developed at Berkeley.
93 This proposal and the rationale underlying its development
94 have been presented to major software vendors
95 as an early step toward convergence on a compatible filesystem interface.
96 .AE
97 .NH
98 Introduction
99 .PP
100 As network communications and workstation environments
101 became common elements in
102 .UX
103 systems, several vendors of
104 .UX
105 systems have designed and built network file systems
106 that allow client process on one
107 .UX
108 machine to access files on a server machine.
109 Examples include Sun's Network File System, NFS [Sandberg85],
110 AT&T's recently-announced Remote File Sharing, RFS [Rifkin86],
111 the LOCUS distributed filesystem [Walker85],
112 and Masscomp's extended filesystem [Cole85].
113 Other remote filesystems have been implemented in research or university groups
114 for internal use, notably the network filesystem in the Eighth Edition
115 .UX
116 system [Weinberger84] and two different filesystems used at Carnegie-Mellon
117 University [Satyanarayanan85].
118 Numerous other remote file access methods have been devised for use
119 within individual
120 .UX
121 processes,
122 many of them by modifications to the C I/O library
123 similar to those in the Newcastle Connection [Brownbridge82].
124 .PP
125 Multiple network filesystems may frequently
126 be found in use within a single organization.
127 These circumstances make it highly desirable to be able to transport filesystem
128 implementations from one system to another.
129 Such portability is considerably enhanced by the use of a stylized interface
130 with carefully-defined entry points to separate the filesystem from the rest
131 of the operating system.
132 This interface should be similar to the interface between device drivers
133 and the kernel.
134 Although varying somewhat among the common versions of
135 .UX ,
136 the device driver interfaces are sufficiently similar that device drivers
137 may be moved from one system to another without major problems.
138 A clean, well-defined interface to the filesystem also allows a single
139 system to support multiple local filesystem types.
140 .PP
141 For reasons such as these, several filesystem interfaces have been used
142 when integrating new filesystems into the system.
143 The best-known of these are Sun Microsystems' Virtual File System interface,
144 VFS [Kleiman86], and AT&T's File System Switch, FSS.
145 Another interface, known as the Generic File System, GFS,
146 has been implemented for the ULTRIX\(dd
147 .FS
148 \(dd ULTRIX is a trademark of Digital Equipment Corp.
149 .FE
150 system by Digital [Rodriguez86].
151 There are numerous differences among these designs.
152 The differences may be understood from the varying philosophies
153 and design goals of the groups involved, from the systems under which
154 the implementations were done, and from the filesystems originally targetted
155 by the designs.
156 These differences are summarized in the following sections
157 within the limitations of the published specifications.
158 .NH
159 Design goals
160 .PP
161 There are several design goals which, in varying degrees,
162 have driven the various designs.
163 Each attempts to divide the filesystem into a filesystem-type-independent
164 layer and individual filesystem implementations.
165 The division between these layers occurs at somewhat different places
166 in these systems, reflecting different views of the diversity and types
167 of the filesystems that may be accommodated.
168 Compatibility with existing local filesystems has varying importance;
169 at the user-process level, each attempts to be completely transparent
170 except for a few filesystem-related system management programs.
171 The AT&T interface also makes a major effort to retain familiar internal
172 system interfaces, and even to retain object-file-level binary compatibility
173 with operating system modules such as device drivers.
174 Both Sun and DEC were willing to change internal data structures and interfaces
175 so that other operating system modules might require recompilation
176 or source-code modification.
177 .PP
178 AT&T's interface both allows and requires filesystems to support the full
179 and exact semantics of their previous filesystem,
180 including interruptions of system calls on slow operations.
181 System calls that deal with remote files are encapsulated
182 with their environment and sent to a server where execution continues.
183 The system call may be aborted by either client or server, returning
184 control to the client.
185 Most system calls that descend into the file-system dependent layer
186 of a filesystem other than the standard local filesystem do not return
187 to the higher-level kernel calling routines.
188 Instead, the filesystem-dependent code completes the requested
189 operation and then executes a non-local goto (\fIlongjmp\fP) to exit the
190 system call.
191 These efforts to avoid modification of main-line kernel code
192 indicate a far greater emphasis on internal compatibility than on modularity,
193 clean design, or efficiency.
194 .PP
195 In contrast, the Sun VFS interface makes major modifications to the internal
196 interfaces in the kernel, with a very clear separation
197 of filesystem-independent and -dependent data structures and operations.
198 The semantics of the filesystem are largely retained for local operations,
199 although this is achieved at some expense where it does not fit the internal
200 structuring well.
201 The filesystem implementations are not required to support the same
202 semantics as local
203 .UX
204 filesystems.
205 Several historical features of
206 .UX
207 filesystem behavior are difficult to achieve using the VFS interface,
208 including the atomicity of file and link creation and the use of open files
209 whose names have been removed.
210 .PP
211 A major design objective of Sun's network filesystem,
212 statelessness,
213 permeates the VFS interface.
214 No locking may be done in the filesystem-independent layer,
215 and locking in the filesystem-dependent layer may occur only during
216 a single call into that layer.
217 .PP
218 A final design goal of most implementors is performance.
219 For remote filesystems,
220 this goal tends to be in conflict with the goals of complete semantic
221 consistency, compatibility and modularity.
222 Sun has chosen performance over modularity in some areas,
223 but has emphasized clean separation of the layers within the filesystem
224 at the expense of performance.
225 Although the performance of RFS is yet to be seen,
226 AT&T seems to have considered compatibility far more important than modularity
227 or performance.
228 .NH
229 Differences among filesystem interfaces
230 .PP
231 The existing filesystem interfaces may be characterized
232 in several ways.
233 Each system is centered around a few data structures or objects,
234 along with a set of primitives for performing operations upon these objects.
235 In the original
236 .UX
237 filesystem [Ritchie74],
238 the basic object used by the filesystem is the inode, or index node.
239 The inode contains all of the information about a file except its name:
240 its type, identification, ownership, permissions, timestamps and location.
241 Inodes are identified by the filesystem device number and the index within
242 the filesystem.
243 The major entry points to the filesystem are \fInamei\fP,
244 which translates a filesystem pathname into the underlying inode,
245 and \fIiget\fP, which locates an inode by number and installs it in the in-core
246 inode table.
247 \fINamei\fP performs name translation by iterative lookup
248 of each component name in its directory to find its inumber,
249 then using \fIiget\fP to return the actual inode.
250 If the last component has been reached, this inode is returned;
251 otherwise, the inode describes the next directory to be searched.
252 The inode returned may be used in various ways by the caller;
253 it may be examined, the file may be read or written,
254 types and access may be checked, and fields may be modified.
255 Modified inodes are automatically written back to the filesystem
256 on disk when the last reference is released with \fIiput\fP.
257 Although the details are considerably different,
258 the same general scheme is used in the faster filesystem in 4.2BSD
259 .UX
260 [Mckusick85].
261 .PP
262 Both the AT&T interface and, to a lesser extent, the DEC interface
263 attempt to preserve the inode-oriented interface.
264 Each modify the inode to allow different varieties of the structure
265 for different filesystem types by separating the filesystem-dependent
266 parts of the inode into a separate structure or one arm of a union.
267 Both interfaces allow operations
268 equivalent to the \fInamei\fP and \fIiget\fP operations
269 of the old filesystem to be performed in the filesystem-independent
270 layer, with entry points to the individual filesystem implementations to support
271 the type-specific parts of these operations.  Implicit in this interface
272 is that files may be conveniently be named by and located using a single
273 index within a filesystem.
274 The GFS provides specific entry points to the filesystems
275 to change most file properties rather than allowing arbitrary changes
276 to be made to the generic part of the inode.
277 .PP
278 In contrast, the Sun VFS interface replaces the inode as the primary object
279 with the vnode.
280 The vnode contains no filesystem-dependent fields except the pointer
281 to the set of operations implemented by the filesystem.
282 Properties of a vnode that might be transient, such as the ownership,
283 permissions, size and timestamps, are maintained by the lower layer.
284 These properties may be presented in a generic format upon request;
285 callers are expected not to hold this information for any length of time,
286 as they may not be up-to-date later on.
287 The vnode operations do not include a corollary for \fIiget\fP;
288 the only external interface for obtaining vnodes for specific files
289 is the name lookup operation.
290 (Separate procedures are provided outside of this interface
291 that obtain a ``file handle'' for a vnode which may be given
292 to a client by a server, such that the vnode may be retrieved
293 upon later presentation of the file handle.)
294 .NH
295 Name translation issues
296 .PP
297 Each of the systems described include a mechanism for performing
298 pathname-to-internal-representation translation.
299 The style of the name translation function is very different in all
300 three systems.
301 As described above, the AT&T and DEC systems retain the \fInamei\fP function.
302 The two are quite different, however, as the ULTRIX interface uses
303 the \fInamei\fP calling convention introduced in 4.3BSD.
304 The parameters and context for the name lookup operation
305 are collected in a \fInameidata\fP structure which is passed to \fInamei\fP
306 for operation.
307 Intent to create or delete the named file is declared in advance,
308 so that the final directory scan in \fInamei\fP may retain information
309 such as the offset in the directory at which the modification will be made.
310 Filesystems that use such mechanisms to avoid redundant work
311 must therefore lock the directory to be modified so that it may not
312 be modified by another process before completion.
313 In the System V filesystem, as in previous versions of
314 .UX ,
315 this information is stored in the per-process \fIuser\fP structure
316 by \fInamei\fP for use by a low-level routine called after performing
317 the actual creation or deletion of the file itself.
318 In 4.3BSD and in the GFS interface, these side effects of \fInamei\fP
319 are stored in the \fInameidata\fP structure given as argument to \fInamei\fP,
320 which is also presented to the routine implementing file creation or deletion.
321 .PP
322 The ULTRIX \fInamei\fP routine is responsible for the generic
323 parts of the name translation process, such as copying the name into
324 an internal buffer, validating it, interpolating
325 the contents of symbolic links, and indirecting at mount points.
326 As in 4.3BSD, the name is copied into the buffer in a single call,
327 according to the location of the name.
328 After determining the type of the filesystem at the start of translation
329 (the current directory or root directory), it calls the filesystem's
330 \fInamei\fP entry with the same structure it received from its caller.
331 The filesystem-specific routine translates the name, component by component,
332 as long as no mount points are reached.
333 It may return after any number of components have been processed.
334 \fINamei\fP performs any processing at mount points, then calls
335 the correct translation routine for the next filesystem.
336 Network filesystems may pass the remaining pathname to a server for translation,
337 or they may look up the pathname components one at a time.
338 The former strategy would be more efficient,
339 but the latter scheme allows mount points within a remote filesystem
340 without server knowledge of all client mounts.
341 .PP
342 The AT&T \fInamei\fP interface is presumably the same as that in previous
343 .UX
344 systems, accepting the name of a routine to fetch pathname characters
345 and an operation (one of: lookup, lookup for creation, or lookup for deletion).
346 It translates, component by component, as before.
347 If it detects that a mount point crosses to a remote filesystem,
348 it passes the remainder of the pathname to the remote server.
349 A pathname-oriented request other than open may be completed
350 within the \fInamei\fP call,
351 avoiding return to the (unmodified) system call handler
352 that called \fInamei\fP.
353 .PP
354 In contrast to the first two systems, Sun's VFS interface has replaced
355 \fInamei\fP with \fIlookupname\fP.
356 This routine simply calls a new pathname-handling module to allocate
357 a pathname buffer and copy in the pathname (copying a character per call),
358 then calls \fIlookuppn\fP.
359 \fILookuppn\fP performs the iteration over the directories leading
360 to the destination file; it copies each pathname component to a local buffer,
361 then calls the filesystem \fIlookup\fP entry to locate the vnode
362 for that file in the current directory.
363 Per-filesystem \fIlookup\fP routines may translate only one component
364 per call.
365 For creation and deletion of new files, the lookup operation is unmodified;
366 the lookup of the final component only serves to check for the existence
367 of the file.
368 The subsequent creation or deletion call, if any, must repeat the final
369 name translation and associated directory scan.
370 For new file creation in particular, this is rather inefficient,
371 as file creation requires two complete scans of the directory.
372 .PP
373 Several of the important performance improvements in 4.3BSD
374 were related to the name translation process [McKusick85][Leffler84].
375 The following changes were made:
376 .IP 1. 4
377 A system-wide cache of recent translations is maintained.
378 The cache is separate from the inode cache, so that multiple names
379 for a file may be present in the cache.
380 The cache does not hold ``hard'' references to the inodes,
381 so that the normal reference pattern is not disturbed.
382 .IP 2.
383 A per-process cache is kept of the directory and offset
384 at which the last successful name lookup was done.
385 This allows sequential lookups of all the entries in a directory to be done
386 in linear time.
387 .IP 3.
388 The entire pathname is copied into a kernel buffer in a single operation,
389 rather than using two subroutine calls per character.
390 .IP 4.
391 A pool of pathname buffers are held by \fInamei\fP, avoiding allocation
392 overhead.
393 .LP
394 All of these performance improvements from 4.3BSD are well worth using
395 within a more generalized filesystem framework.
396 The generalization of the structure may otherwise make an already-expensive
397 function even more costly.
398 Most of these improvements are present in the GFS system, as it derives
399 from the beta-test version of 4.3BSD.
400 The Sun system uses a name-translation cache generally like that in 4.3BSD.
401 The name cache is a filesystem-independent facility provided for the use
402 of the filesystem-specific lookup routines.
403 The Sun cache, like that first used at Berkeley but unlike that in 4.3,
404 holds a ``hard'' reference to the vnode (increments the reference count).
405 The ``soft'' reference scheme in 4.3BSD cannot be used with the current
406 NFS implementation, as NFS allocates vnodes dynamically and frees them
407 when the reference count returns to zero rather than caching them.
408 As a result, fewer names may be held in the cache
409 than (local filesystem) vnodes, and the cache distorts the normal reference
410 patterns otherwise seen by the LRU cache.
411 As the name cache references overflow the local filesystem inode table,
412 the name cache must be purged to make room in the inode table.
413 Also, to determine whether a vnode is in use (for example,
414 before mounting upon it), the cache must be flushed to free any
415 cache reference.
416 These problems should be corrected
417 by the use of the soft cache reference scheme.
418 .PP
419 A final observation on the efficiency of name translation in the current
420 Sun VFS architecture is that the number of subroutine calls used
421 by a multi-component name lookup is dramatically larger
422 than in the other systems.
423 The name lookup scheme in GFS suffers from this problem much less,
424 at no expense in violation of layering.
425 .PP
426 A final problem to be considered is synchronization and consistency.
427 As the filesystem operations are more stylized and broken into separate
428 entry points for parts of operations, it is more difficult to guarantee
429 consistency throughout an operation and/or to synchronize with other
430 processes using the same filesystem objects.
431 The Sun interface suffers most severely from this,
432 as it forbids the filesystems from locking objects across calls
433 to the filesystem.
434 It is possible that a file may be created between the time that a lookup
435 is performed and a subsequent creation is requested.
436 Perhaps more strangely, after a lookup fails to find the target
437 of a creation attempt, the actual creation might find that the target
438 now exists and is a symbolic link.
439 The call will either fail unexpectedly, as the target is of the wrong type,
440 or the generic creation routine will have to note the error
441 and restart the operation from the lookup.
442 This problem will always exist in a stateless filesystem,
443 but the VFS interface forces all filesystems to share the problem.
444 This restriction against locking between calls also
445 forces duplication of work during file creation and deletion.
446 This is considered unacceptable.
447 .NH
448 Support facilities and other interactions
449 .PP
450 Several support facilities are used by the current
451 .UX
452 filesystem and require generalization for use by other filesystem types.
453 For filesystem implementations to be portable,
454 it is desirable that these modified support facilities
455 should also have a uniform interface and 
456 behave in a consistent manner in target systems.
457 A prominent example is the filesystem buffer cache.
458 The buffer cache in a standard (System V or 4.3BSD)
459 .UX
460 system contains physical disk blocks with no reference to the files containing
461 them.
462 This works well for the local filesystem, but has obvious problems
463 for remote filesystems.
464 Sun has modified the buffer cache routines to describe buffers by vnode
465 rather than by device.
466 For remote files, the vnode used is that of the file, and the block
467 numbers are virtual data blocks.
468 For local filesystems, a vnode for the block device is used for cache reference,
469 and the block numbers are filesystem physical blocks.
470 Use of per-file cache description does not easily accommodate
471 caching of indirect blocks, inode blocks, superblocks or cylinder group blocks.
472 However, the vnode describing the block device for the cache
473 is one created internally,
474 rather than the vnode for the device looked up when mounting,
475 and it is located by searching a private list of vnodes
476 rather than by holding it in the mount structure.
477 Although the Sun modification makes it possible to use the buffer
478 cache for data blocks of remote files, a better generalization
479 of the buffer cache is needed.
480 .PP
481 The RFS filesystem used by AT&T does not currently cache data blocks
482 on client systems, thus the buffer cache is probably unmodified.
483 The form of the buffer cache in ULTRIX is unknown to us.
484 .PP
485 Another subsystem that has a large interaction with the filesystem
486 is the virtual memory system.
487 The virtual memory system must read data from the filesystem
488 to satisfy fill-on-demand page faults.
489 For efficiency, this read call is arranged to place the data directly
490 into the physical pages assigned to the process (a ``raw'' read) to avoid
491 copying the data.
492 Although the read operation normally bypasses the filesystem buffer cache,
493 consistency must be maintained by checking the buffer cache and copying
494 or flushing modified data not yet stored on disk.
495 The 4.2BSD virtual memory system, like that of Sun and ULTRIX,
496 maintains its own cache of reusable text pages.
497 This creates additional complications.
498 As the virtual memory systems are redesigned, these problems should be
499 resolved by reading through the buffer cache, then mapping the cached
500 data into the user address space.
501 If the buffer cache or the process pages are changed while the other reference
502 remains, the data would have to be copied (``copy-on-write'').
503 .PP
504 In the meantime, the current virtual memory systems must be used
505 with the new filesystem framework.
506 Both the Sun and AT&T filesystem interfaces
507 provide entry points to the filesystem for optimization of the virtual
508 memory system by performing logical-to-physical block number translation
509 when setting up a fill-on-demand image for a process.
510 The VFS provides a vnode operation analogous to the \fIbmap\fP function of the
511 .UX
512 filesystem.
513 Given a vnode and logical block number, it returns a vnode and block number
514 which may be read to obtain the data.
515 If the filesystem is local, it returns the private vnode for the block device
516 and the physical block number.
517 As the \fIbmap\fP operations are all performed at one time, during process
518 startup, any indirect blocks for the file will remain in the cache
519 after they are once read.
520 In addition, the interface provides a \fIstrategy\fP entry that may be used
521 for ``raw'' reads from a filesystem device,
522 used to read data blocks into an address space without copying.
523 This entry uses a buffer header (\fIbuf\fP structure)
524 to describe the I/O operation
525 instead of a \fIuio\fP structure.
526 The buffer-style interface is the same as that used by disk drivers internally.
527 This difference allows the current \fIuio\fP primitives to be avoided,
528 as they copy all data to/from the current user process address space.
529 Instead, for local filesystems these operations could be done internally
530 with the standard raw disk read routines,
531 which use a \fIuio\fP interface.
532 When loading from a remote filesystems,
533 the data will be received in a network buffer.
534 If network buffers are suitably aligned,
535 the data may be mapped into the process address space by a page swap
536 without copying.
537 In either case, it should be possible to use the standard filesystem
538 read entry from the virtual memory system.
539 .PP
540 Other issues that must be considered in devising a portable
541 filesystem implementation include kernel memory allocation,
542 the implicit use of user-structure global context,
543 which may create problems with reentrancy,
544 the style of the system call interface,
545 and the conventions for synchronization
546 (sleep/wakeup, handling of interrupted system calls, semaphores).
547 .NH
548 The Berkeley Proposal
549 .PP
550 The Sun VFS interface has been most widely used of the three described here.
551 It is also the most general of the three, in that filesystem-specific
552 data and operations are best separated from the generic layer.
553 Although it has several disadvantages which were described above,
554 most of them may be corrected with minor changes to the interface
555 (and, in a few areas, philosophical changes).
556 The DEC GFS has other advantages, in particular the use of the 4.3BSD
557 \fInamei\fP interface and optimizations.
558 It allows single or multiple components of a pathname
559 to be translated in a single call to the specific filesystem
560 and thus accommodates filesystems with either preference.
561 The FSS is least well understood, as there is little public information
562 about the interface.
563 However, the design goals are the least consistent with those of the Berkeley
564 research groups.
565 Accordingly, a new filesystem interface has been devised to avoid
566 some of the problems in the other systems.
567 The proposed interface derives directly from Sun's VFS,
568 but, like GFS, uses a 4.3BSD-style name lookup interface.
569 Additional context information has been moved from the \fIuser\fP structure
570 to the \fInameidata\fP structure so that name translation may be independent
571 of the global context of a user process.
572 This is especially desired in any system where kernel-mode servers
573 operate as light-weight or interrupt-level processes,
574 or where a server may store or cache context for several clients.
575 This calling interface has the additional advantage
576 that the call parameters need not all be pushed onto the stack for each call
577 through the filesystem interface,
578 and they may be accessed using short offsets from a base pointer
579 (unlike global variables in the \fIuser\fP structure).
580 .PP
581 The proposed filesystem interface is described very tersely here.
582 For the most part, data structures and procedures are analogous
583 to those used by VFS, and only the changes will be treated here.
584 See [Kleiman86] for complete descriptions of the vfs and vnode operations
585 in Sun's interface.
586 .PP
587 The central data structure for name translation is the \fInameidata\fP
588 structure.
589 The same structure is used to pass parameters to \fInamei\fP,
590 to pass these same parameters to filesystem-specific lookup routines,
591 to communicate completion status from the lookup routines back to \fInamei\fP,
592 and to return completion status to the calling routine.
593 For creation or deletion requests, the parameters to the filesystem operation
594 to complete the request are also passed in this same structure.
595 The form of the \fInameidata\fP structure is:
596 .br
597 .ne 2i
598 .ID
599 .nf
600 .ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
601 /*
602  * Encapsulation of namei parameters.
603  * One of these is located in the u. area to
604  * minimize space allocated on the kernel stack
605  * and to retain per-process context.
606  */
607 struct nameidata {
608                 /* arguments to namei and related context: */
609         caddr_t ni_dirp;                /* pathname pointer */
610         enum    uio_seg ni_seg;         /* location of pathname */
611         short   ni_nameiop;             /* see below */
612         struct  vnode *ni_cdir;         /* current directory */
613         struct  vnode *ni_rdir;         /* root directory, if not normal root */
614         struct  ucred *ni_cred;         /* credentials */
615
616                 /* shared between namei, lookup routines and commit routines: */
617         caddr_t ni_pnbuf;               /* pathname buffer */
618         char    *ni_ptr;                /* current location in pathname */
619         int     ni_pathlen;             /* remaining chars in path */
620         short   ni_more;                /* more left to translate in pathname */
621         short   ni_loopcnt;             /* count of symlinks encountered */
622
623                 /* results: */
624         struct  vnode *ni_vp;           /* vnode of result */
625         struct  vnode *ni_dvp;          /* vnode of intermediate directory */
626
627 /* BEGIN UFS SPECIFIC */
628         struct diroffcache {            /* last successful directory search */
629                 struct  vnode *nc_prevdir;      /* terminal directory */
630                 long    nc_id;                  /* directory's unique id */
631                 off_t   nc_prevoffset;          /* where last entry found */
632         } ni_nc;
633 /* END UFS SPECIFIC */
634 };
635 .DE
636 .DS
637 .ta \w'#define\0\0'u +\w'WANTPARENT\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
638 /*
639  * namei operations and modifiers
640  */
641 #define LOOKUP  0       /* perform name lookup only */
642 #define CREATE  1       /* setup for file creation */
643 #define DELETE  2       /* setup for file deletion */
644 #define WANTPARENT      0x10    /* return parent directory vnode also */
645 #define NOCACHE 0x20    /* name must not be left in cache */
646 #define FOLLOW  0x40    /* follow symbolic links */
647 #define NOFOLLOW        0x0     /* don't follow symbolic links (pseudo) */
648 .DE
649 As in current systems other than Sun's VFS, \fInamei\fP is called
650 with an operation request, one of LOOKUP, CREATE or DELETE.
651 For a LOOKUP, the operation is exactly like the lookup in VFS.
652 CREATE and DELETE allow the filesystem to ensure consistency
653 by locking the parent inode (private to the filesystem),
654 and (for the local filesystem) to avoid duplicate directory scans
655 by storing the new directory entry and its offset in the directory
656 in the \fIndirinfo\fP structure.
657 This is intended to be opaque to the filesystem-independent levels.
658 Not all lookups for creation or deletion are actually followed
659 by the intended operation; permission may be denied, the filesystem
660 may be read-only, etc.
661 Therefore, an entry point to the filesystem is provided
662 to abort a creation or deletion operation
663 and allow release of any locked internal data.
664 After a \fInamei\fP with a CREATE or DELETE flag, the pathname pointer
665 is set to point to the last filename component.
666 Filesystems that choose to implement creation or deletion entirely
667 within the subsequent call to a create or delete entry
668 are thus free to do so.
669 .PP
670 The \fInameidata\fP is used to store context used during name translation.
671 The current and root directories for the translation are stored here.
672 For the local filesystem, the per-process directory offset cache
673 is also kept here.
674 A file server could leave the directory offset cache empty,
675 could use a single cache for all clients,
676 or could hold caches for several recent clients.
677 .PP
678 Several other data structures are used in the filesystem operations.
679 One is the \fIucred\fP structure which describes a client's credentials
680 to the filesystem.
681 This is modified slightly from the Sun structure;
682 the ``accounting'' group ID has been merged into the groups array.
683 The actual number of groups in the array is given explicitly
684 to avoid use of a reserved group ID as a terminator.
685 Also, typedefs introduced in 4.3BSD for user and group ID's have been used.
686 The \fIucred\fP structure is thus:
687 .DS
688 .ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
689 /*
690  * Credentials.
691  */
692 struct ucred {
693         u_short cr_ref;                 /* reference count */
694         uid_t   cr_uid;                 /* effective user id */
695         short   cr_ngroups;             /* number of groups */
696         gid_t   cr_groups[NGROUPS];     /* groups */
697         /*
698          * The following either should not be here,
699          * or should be treated as opaque.
700          */
701         uid_t   cr_ruid;                /* real user id */
702         gid_t   cr_svgid;               /* saved set-group id */
703 };
704 .DE
705 .PP
706 A final structure used by the filesystem interface is the \fIuio\fP
707 structure mentioned earlier.
708 This structure describes the source or destination of an I/O
709 operation, with provision for scatter/gather I/O.
710 It is used in the read and write entries to the filesystem.
711 The \fIuio\fP structure presented here is modified from the one
712 used in 4.2BSD to specify the location of each vector of the operation
713 (user or kernel space)
714 and to allow an alternate function to be used to implement the data movement.
715 The alternate function might perform page remapping rather than a copy,
716 for example.
717 .DS
718 .ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
719 /*
720  * Description of an I/O operation which potentially
721  * involves scatter-gather, with individual sections
722  * described by iovec, below.  uio_resid is initially
723  * set to the total size of the operation, and is
724  * decremented as the operation proceeds.  uio_offset
725  * is incremented by the amount of each operation.
726  * uio_iov is incremented and uio_iovcnt is decremented
727  * after each vector is processed.
728  */
729 struct uio {
730         struct  iovec *uio_iov;
731         int     uio_iovcnt;
732         off_t   uio_offset;
733         int     uio_resid;
734         enum    uio_rw uio_rw;
735 };
736
737 enum    uio_rw { UIO_READ, UIO_WRITE };
738 .DE
739 .DS
740 .ta .5i +\w'caddr_t\0\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
741 /*
742  * Description of a contiguous section of an I/O operation.
743  * If iov_op is non-null, it is called to implement the copy
744  * operation, possibly by remapping, with the call
745  *      (*iov_op)(from, to, count);
746  * where from and to are caddr_t and count is int.
747  * Otherwise, the copy is done in the normal way,
748  * treating base as a user or kernel virtual address
749  * according to iov_segflg.
750  */
751 struct iovec {
752         caddr_t iov_base;
753         int     iov_len;
754         enum    uio_seg iov_segflg;
755         int     (*iov_op)();
756 };
757 .DE
758 .DS
759 .ta .5i +\w'UIO_USERISPACE\0\0\0\0\0'u
760 /*
761  * Segment flag values.
762  */
763 enum    uio_seg {
764         UIO_USERSPACE,          /* from user data space */
765         UIO_SYSSPACE,           /* from system space */
766         UIO_USERISPACE          /* from user I space */
767 };
768 .DE
769 .NH
770 File and filesystem operations
771 .PP
772 With the introduction of the data structures used by the filesystem
773 operations, the complete list of filesystem entry points may be listed.
774 As noted, they derive mostly from the Sun VFS interface.
775 Lines marked with \fB+\fP are additions to the Sun definitions;
776 lines marked with \fB!\fP are modified from VFS.
777 .PP
778 The structure describing the externally-visible features of a mounted
779 filesystem, \fIvfs\fP, is:
780 .DS
781 .ta .5i +\w'struct vfsops\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
782 /*
783  * Structure per mounted file system.
784  * Each mounted file system has an array of
785  * operations and an instance record.
786  * The file systems are put on a doubly linked list.
787  */
788 struct vfs {
789         struct vfs      *vfs_next;              /* next vfs in vfs list */
790 \fB+\fP struct vfs      *vfs_prev;              /* prev vfs in vfs list */
791         struct vfsops   *vfs_op;                /* operations on vfs */
792         struct vnode    *vfs_vnodecovered;      /* vnode we mounted on */
793         int     vfs_flag;               /* flags */
794 \fB!\fP int     vfs_fsize;              /* fundamental block size */
795 \fB+\fP int     vfs_bsize;              /* optimal transfer size */
796 \fB!\fP uid_t   vfs_exroot;             /* exported fs uid 0 mapping */
797         short   vfs_exflags;            /* exported fs flags */
798         caddr_t vfs_data;               /* private data */
799 };
800 .DE
801 .DS
802 .ta \w'\fB+\fP 'u +\w'#define\0\0'u +\w'VFS_EXPORTED\0\0'u +\w'0x40\0\0\0\0\0'u
803         /*
804          * vfs flags.
805          * VFS_MLOCK lock the vfs so that name lookup cannot proceed past the vfs.
806          * This keeps the subtree stable during mounts and unmounts.
807          */
808         #define VFS_RDONLY      0x01            /* read only vfs */
809 \fB+\fP #define VFS_NOEXEC      0x02            /* can't exec from filesystem */
810         #define VFS_MLOCK       0x04            /* lock vfs so that subtree is stable */
811         #define VFS_MWAIT       0x08            /* someone is waiting for lock */
812         #define VFS_NOSUID      0x10            /* don't honor setuid bits on vfs */
813         #define VFS_EXPORTED    0x20            /* file system is exported (NFS) */
814
815         /*
816          * exported vfs flags.
817          */
818         #define EX_RDONLY       0x01            /* exported read only */
819 .DE
820 .LP
821 The operations supported by the filesystem-specific layer
822 on an individual filesystem are:
823 .DS
824 .ta .5i +\w'struct vfsops\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
825 /*
826  * Operations supported on virtual file system.
827  */
828 struct vfsops {
829 \fB!\fP int     (*vfs_mount)(           /* vfs, path, data, datalen */ );
830 \fB!\fP int     (*vfs_unmount)(         /* vfs, forcibly */ );
831 \fB+\fP int     (*vfs_mountroot)();
832         int     (*vfs_root)(            /* vfs, vpp */ );
833 \fB!\fP int     (*vfs_statfs)(          /* vfs, vp, sbp */ );
834 \fB!\fP int     (*vfs_sync)(            /* vfs, waitfor */ );
835 \fB+\fP int     (*vfs_fhtovp)(          /* vfs, fhp, vpp */ );
836 \fB+\fP int     (*vfs_vptofh)(          /* vp, fhp */ );
837 };
838 .DE
839 .LP
840 The \fIvfs_statfs\fP entry returns a structure of the form:
841 .DS
842 .ta .5i +\w'struct vfsops\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
843 /*
844  * file system statistics
845  */
846 struct statfs {
847 \fB!\fP short   f_type;                 /* type of filesystem */
848 \fB+\fP short   f_flags;                /* copy of vfs (mount) flags */
849 \fB!\fP long    f_fsize;                /* fundamental file system block size */
850 \fB+\fP long    f_bsize;                /* optimal transfer block size */
851         long    f_blocks;               /* total data blocks in file system */
852         long    f_bfree;                /* free blocks in fs */
853         long    f_bavail;               /* free blocks avail to non-superuser */
854         long    f_files;                /* total file nodes in file system */
855         long    f_ffree;                /* free file nodes in fs */
856         fsid_t  f_fsid;                 /* file system id */
857 \fB+\fP char    *f_mntonname;           /* directory on which mounted */
858 \fB+\fP char    *f_mntfromname;         /* mounted filesystem */
859         long    f_spare[7];             /* spare for later */
860 };
861
862 typedef long fsid_t[2];                 /* file system id type */
863 .DE
864 .LP
865 The modifications to Sun's interface at this level are minor.
866 Additional arguments are present for the \fIvfs_mount\fP and \fIvfs_umount\fP
867 entries.
868 \fIvfs_statfs\fP accepts a vnode as well as filesystem identifier,
869 as the information may not be uniform throughout a filesystem.
870 For example,
871 if a client may mount a file tree that spans multiple physical
872 filesystems on a server, different sections may have different amounts
873 of free space.
874 (NFS does not allow remotely-mounted file trees to span physical filesystems
875 on the server.)
876 The final additions are the entries that support file handles.
877 \fIvfs_vptofh\fP is provided for the use of file servers,
878 which need to obtain an opaque
879 file handle to represent the current vnode for transmission to clients.
880 This file handle may later be used to relocate the vnode using \fIvfs_fhtovp\fP
881 without requiring the vnode to remain in memory.
882 .PP
883 Finally, the external form of a filesystem object, the \fIvnode\fP, is:
884 .DS
885 .ta .5i +\w'struct vnodeops\0\0'u +\w'*v_vfsmountedhere;\0\0\0'u
886 /*
887  * vnode types. VNON means no type.
888  */
889 enum vtype      { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK };
890
891 struct vnode {
892         u_short v_flag;                 /* vnode flags (see below) */
893         u_short v_count;                /* reference count */
894         u_short v_shlockc;              /* count of shared locks */
895         u_short v_exlockc;              /* count of exclusive locks */
896         struct vfs      *v_vfsmountedhere;      /* ptr to vfs mounted here */
897         struct vfs      *v_vfsp;                /* ptr to vfs we are in */
898         struct vnodeops *v_op;                  /* vnode operations */
899 \fB+\fP struct text     *v_text;                /* text/mapped region */
900         enum vtype      v_type;                 /* vnode type */
901         caddr_t v_data;                 /* private data for fs */
902 };
903 .DE
904 .DS
905 .ta \w'#define\0\0'u +\w'NOFOLLOW\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
906 /*
907  * vnode flags.
908  */
909 #define VROOT   0x01    /* root of its file system */
910 #define VTEXT   0x02    /* vnode is a pure text prototype */
911 #define VEXLOCK 0x10    /* exclusive lock */
912 #define VSHLOCK 0x20    /* shared lock */
913 #define VLWAIT  0x40    /* proc is waiting on shared or excl. lock */
914 .DE
915 .LP
916 The operations supported by the filesystems on individual \fIvnode\fP\^s
917 are:
918 .DS
919 .ta .5i +\w'int\0\0\0\0\0'u  +\w'(*vn_getattr)(\0\0\0\0\0'u
920 /*
921  * Operations on vnodes.
922  */
923 struct vnodeops {
924 \fB!\fP int     (*vn_lookup)(           /* ndp */ );
925 \fB!\fP int     (*vn_create)(           /* ndp, vap, fflags */ );
926 \fB+\fP int     (*vn_mknod)(            /* ndp, vap, fflags */ );
927 \fB!\fP int     (*vn_open)(             /* vp, fflags, cred */ );
928         int     (*vn_close)(            /* vp, fflags, cred */ );
929         int     (*vn_access)(           /* vp, fflags, cred */ );
930         int     (*vn_getattr)(          /* vp, vap, cred */ );
931         int     (*vn_setattr)(          /* vp, vap, cred */ );
932
933 \fB+\fP int     (*vn_read)(             /* vp, uiop, offp, ioflag, cred */ );
934 \fB+\fP int     (*vn_write)(            /* vp, uiop, offp, ioflag, cred */ );
935 \fB!\fP int     (*vn_ioctl)(            /* vp, com, data, fflag, cred */ );
936         int     (*vn_select)(           /* vp, which, cred */ );
937 \fB+\fP int     (*vn_mmap)(             /* vp, ..., cred */ );
938         int     (*vn_fsync)(            /* vp, cred */ );
939 \fB+\fP int     (*vn_seek)(             /* vp, offp, off, whence */ );
940
941 \fB!\fP int     (*vn_remove)(           /* ndp */ );
942 \fB!\fP int     (*vn_link)(             /* vp, ndp */ );
943 \fB!\fP int     (*vn_rename)(           /* src ndp, target ndp */ );
944 \fB!\fP int     (*vn_mkdir)(            /* ndp, vap */ );
945 \fB!\fP int     (*vn_rmdir)(            /* ndp */ );
946 \fB!\fP int     (*vn_symlink)(          /* ndp, vap, nm */ );
947         int     (*vn_readdir)(          /* vp, uiop, offp, ioflag, cred */ );
948         int     (*vn_readlink)(         /* vp, uiop, ioflag, cred */ );
949
950 \fB+\fP int     (*vn_abortop)(          /* ndp */ );
951 \fB+\fP int     (*vn_lock)(             /* vp */ );
952 \fB+\fP int     (*vn_unlock)(           /* vp */ );
953 \fB!\fP int     (*vn_inactive)(         /* vp */ );
954 };
955 .DE
956 .DS
957 .ta \w'#define\0\0'u +\w'NOFOLLOW\0\0'u +\w'0x40\0\0\0\0\0'u
958 /*
959  * flags for ioflag
960  */
961 #define IO_UNIT 0x01            /* do io as atomic unit for VOP_RDWR */
962 #define IO_APPEND       0x02            /* append write for VOP_RDWR */
963 #define IO_SYNC 0x04            /* sync io for VOP_RDWR */
964 .DE
965 .LP
966 The argument types listed in the comments following each operation are:
967 .sp
968 .IP ndp 10
969 A pointer to a \fInameidata\fP structure.
970 .IP vap
971 A pointer to a \fIvattr\fP structure (vnode attributes; see below).
972 .IP fflags
973 File open flags, possibly including O_APPEND, O_CREAT, O_TRUNC and O_EXCL.
974 .IP vp
975 A pointer to a \fIvnode\fP previously obtained with \fIvn_lookup\fP.
976 .IP cred
977 A pointer to a \fIucred\fP credentials structure.
978 .IP uiop
979 A pointer to a \fIuio\fP structure.
980 .IP ioflag
981 Any of the IO flags defined above.
982 .IP com
983 An \fIioctl\fP command, with type \fIunsigned long\fP.
984 .IP data
985 A pointer to a character buffer used to pass data to or from an \fIioctl\fP.
986 .IP which
987 One of FREAD, FWRITE or 0 (select for exceptional conditions).
988 .IP off
989 A file offset of type \fIoff_t\fP.
990 .IP offp
991 A pointer to file offset of type \fIoff_t\fP.
992 .IP whence
993 One of L_SET, L_INCR, or L_XTND.
994 .IP fhp
995 A pointer to a file handle buffer.
996 .sp
997 .PP
998 Several changes have been made to Sun's set of vnode operations.
999 Most obviously, the \fIvn_lookup\fP receives a \fInameidata\fP structure
1000 containing its arguments and context as described.
1001 The same structure is also passed to one of the creation or deletion
1002 entries if the lookup operation is for CREATE or DELETE to complete
1003 an operation, or to the \fIvn_abortop\fP entry if no operation
1004 is undertaken.
1005 For filesystems that perform no locking between lookup for creation
1006 or deletion and the call to implement that action,
1007 the final pathname component may be left untranslated by the lookup
1008 routine.
1009 In any case, the pathname pointer points at the final name component,
1010 and the \fInameidata\fP contains a reference to the vnode of the parent
1011 directory.
1012 The interface is thus flexible enough to accommodate filesystems
1013 that are fully stateful or fully stateless, while avoiding redundant
1014 operations whenever possible.
1015 One operation remains problematical, the \fIvn_rename\fP call.
1016 It is tempting to look up the source of the rename for deletion
1017 and the target for creation.
1018 However, filesystems that lock directories during such lookups must avoid
1019 deadlock if the two paths cross.
1020 For that reason, the source is translated for LOOKUP only,
1021 with the WANTPARENT flag set;
1022 the target is then translated with an operation of CREATE.
1023 .PP
1024 In addition to the changes concerned with the \fInameidata\fP interface,
1025 several other changes were made in the vnode operations.
1026 The \fIvn_rdrw\fP entry was split into \fIvn_read\fP and \fIvn_write\fP;
1027 frequently, the read/write entry amounts to a routine that checks
1028 the direction flag, then calls either a read routine or a write routine.
1029 The two entries may be identical for any given filesystem;
1030 the direction flag is contained in the \fIuio\fP given as an argument.
1031 .PP
1032 All of the read and write operations use a \fIuio\fP to describe
1033 the file offset and buffer locations.
1034 All of these fields must be updated before return.
1035 In particular, the \fIvn_readdir\fP entry uses this
1036 to return a new file offset token for its current location.
1037 .PP
1038 Several new operations have been added.
1039 The first, \fIvn_seek\fP, is a concession to record-oriented files
1040 such as directories.
1041 It allows the filesystem to verify that a seek leaves a file at a sensible
1042 offset, or to return a new offset token relative to an earlier one.
1043 For most filesystems and files, this operation amounts to performing
1044 simple arithmetic.
1045 Another new entry point is \fIvn_mmap\fP, for use in mapping device memory
1046 into a user process address space.
1047 Its semantics are not yet decided.
1048 The final additions are the \fIvn_lock\fP and \fIvn_unlock\fP entries.
1049 These are used to request that the underlying file be locked against
1050 changes for short periods of time if the filesystem implementation allows it.
1051 They are used to maintain consistency
1052 during internal operations such as \fIexec\fP,
1053 and may not be used to construct atomic operations from other filesystem
1054 operations.
1055 .PP
1056 The attributes of a vnode are not stored in the vnode,
1057 as they might change with time and may need to be read from a remote
1058 source.
1059 Attributes have the form:
1060 .DS
1061 .ta .5i +\w'struct vnodeops\0\0'u +\w'*v_vfsmountedhere;\0\0\0'u
1062 /*
1063  * Vnode attributes.  A field value of -1
1064  * represents a field whose value is unavailable
1065  * (getattr) or which is not to be changed (setattr).
1066  */
1067 struct vattr {
1068         enum vtype      va_type;        /* vnode type (for create) */
1069         u_short va_mode;        /* files access mode and type */
1070 \fB!\fP uid_t   va_uid;         /* owner user id */
1071 \fB!\fP gid_t   va_gid;         /* owner group id */
1072         long    va_fsid;        /* file system id (dev for now) */
1073 \fB!\fP long    va_fileid;      /* file id */
1074         short   va_nlink;       /* number of references to file */
1075         u_long  va_size;        /* file size in bytes (quad?) */
1076 \fB+\fP u_long  va_size1;       /* reserved if not quad */
1077         long    va_blocksize;   /* blocksize preferred for i/o */
1078         struct timeval  va_atime;       /* time of last access */
1079         struct timeval  va_mtime;       /* time of last modification */
1080         struct timeval  va_ctime;       /* time file changed */
1081         dev_t   va_rdev;        /* device the file represents */
1082         u_long  va_bytes;       /* bytes of disk space held by file */
1083 \fB+\fP u_long  va_bytes1;      /* reserved if va_bytes not a quad */
1084 };
1085 .DE
1086 .NH
1087 Conclusions
1088 .PP
1089 The Sun VFS filesystem interface is the most widely used generic
1090 filesystem interface.
1091 Of the interfaces examined, it creates the cleanest separation
1092 between the filesystem-independent and -dependent layers and data structures.
1093 It has several flaws, but it is felt that certain changes in the interface
1094 can ameliorate most of them.
1095 The interface proposed here includes those changes.
1096 The proposed interface is now being implemented by the Computer Systems
1097 Research Group at Berkeley.
1098 If the design succeeds in improving the flexibility and performance
1099 of the filesystem layering, it will be advanced as a model interface.
1100 .NH
1101 Acknowledgements
1102 .PP
1103 The filesystem interface described here is derived from Sun's VFS interface.
1104 It also includes features similar to those of DEC's GFS interface.
1105 We are indebted to members of the Sun and DEC system groups
1106 for long discussions of the issues involved.
1107 .br
1108 .ne 2i
1109 .NH
1110 References
1111
1112 .IP Brownbridge82 \w'Satyanarayanan85\0\0'u
1113 Brownbridge, D.R., L.F. Marshall, B. Randell,
1114 ``The Newcastle Connection, or UNIXes of the World Unite!,''
1115 \fISoftware\- Practice and Experience\fP, Vol. 12, pp. 1147-1162, 1982.
1116
1117 .IP Cole85
1118 Cole, C.T., P.B. Flinn, A.B. Atlas,
1119 ``An Implementation of an Extended File System for UNIX,''
1120 \fIUsenix Conference Proceedings\fP,
1121 pp. 131-150, June, 1985.
1122
1123 .IP Kleiman86
1124 ``Vnodes: An Architecture for Multiple File System Types in Sun UNIX,''
1125 \fIUsenix Conference Proceedings\fP,
1126 pp. 238-247, June, 1986.
1127
1128 .IP Leffler84
1129 Leffler, S., M.K. McKusick, M. Karels,
1130 ``Measuring and Improving the Performance of 4.2BSD,''
1131 \fIUsenix Conference Proceedings\fP, pp. 237-252, June, 1984.
1132
1133 .IP McKusick84
1134 McKusick, M.K., W.N. Joy, S.J. Leffler, R.S. Fabry,
1135 ``A Fast File System for UNIX,'' \fITransactions on Computer Systems\fP,
1136 Vol. 2, pp. 181-197,
1137 ACM, August, 1984.
1138
1139 .IP McKusick85
1140 McKusick, M.K., M. Karels, S. Leffler,
1141 ``Performance Improvements and Functional Enhancements in 4.3BSD,''
1142 \fIUsenix Conference Proceedings\fP, pp. 519-531, June, 1985.
1143
1144 .IP Rifkin86
1145 Rifkin, A.P., M.P. Forbes, R.L. Hamilton, M. Sabrio, S. Shah, and K. Yueh,
1146 ``RFS Architectural Overview,'' \fIUsenix Conference Proceedings\fP,
1147 pp. 248-259, June, 1986.
1148
1149 .IP Ritchie74
1150 Ritchie, D.M. and K. Thompson, ``The Unix Time-Sharing System,''
1151 \fICommunications of the ACM\fP, Vol. 17, pp. 365-375, July, 1974.
1152
1153 .IP Rodriguez86
1154 Rodriguez, R., M. Koehler, R. Hyde,
1155 ``The Generic File System,'' \fIUsenix Conference Proceedings\fP,
1156 pp. 260-269, June, 1986.
1157
1158 .IP Sandberg85
1159 Sandberg, R., D. Goldberg, S. Kleiman, D. Walsh, B. Lyon,
1160 ``Design and Implementation of the Sun Network Filesystem,''
1161 \fIUsenix Conference Proceedings\fP,
1162 pp. 119-130, June, 1985.
1163
1164 .IP Satyanarayanan85
1165 Satyanarayanan, M., \fIet al.\fP,
1166 ``The ITC Distributed File System: Principles and Design,''
1167 \fIProc. 10th Symposium on Operating Systems Principles\fP, pp. 35-50,
1168 ACM, December, 1985.
1169
1170 .IP Walker85
1171 Walker, B.J. and S.H. Kiser, ``The LOCUS Distributed Filesystem,''
1172 \fIThe LOCUS Distributed System Architecture\fP,
1173 G.J. Popek and B.J. Walker, ed., The MIT Press, Cambridge, MA, 1985.
1174
1175 .IP Weinberger84
1176 Weinberger, P.J., ``The Version 8 Network File System,''
1177 \fIUsenix Conference presentation\fP,
1178 June, 1984.