diff options
Diffstat (limited to 'doc/rfc/rfc1813.txt')
-rw-r--r-- | doc/rfc/rfc1813.txt | 7059 |
1 files changed, 7059 insertions, 0 deletions
diff --git a/doc/rfc/rfc1813.txt b/doc/rfc/rfc1813.txt new file mode 100644 index 0000000..b7c1c2a --- /dev/null +++ b/doc/rfc/rfc1813.txt @@ -0,0 +1,7059 @@ + + + + + + +Network Working Group B. Callaghan +Request for Comments: 1813 B. Pawlowski +Category: Informational P. Staubach + Sun Microsystems, Inc. + June 1995 + + + NFS Version 3 Protocol Specification + +Status of this Memo + + This memo provides information for the Internet community. + This memo does not specify an Internet standard of any kind. + Distribution of this memo is unlimited. + +IESG Note + + Internet Engineering Steering Group comment: please note that + the IETF is not involved in creating or maintaining this + specification. This is the significance of the specification + not being on the standards track. + +Abstract + + This paper describes the NFS version 3 protocol. This paper is + provided so that people can write compatible implementations. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.1 Scope of the NFS version 3 protocol . . . . . . . . . . 4 + 1.2 Useful terms . . . . . . . . . . . . . . . . . . . . . . 5 + 1.3 Remote Procedure Call . . . . . . . . . . . . . . . . . 5 + 1.4 External Data Representation . . . . . . . . . . . . . . 5 + 1.5 Authentication and Permission Checking . . . . . . . . . 7 + 1.6 Philosophy . . . . . . . . . . . . . . . . . . . . . . . 8 + 1.7 Changes from the NFS version 2 protocol . . . . . . . . 11 + 2. RPC Information . . . . . . . . . . . . . . . . . . . . . 14 + 2.1 Authentication . . . . . . . . . . . . . . . . . . . . . 14 + 2.2 Constants . . . . . . . . . . . . . . . . . . . . . . . 14 + 2.3 Transport address . . . . . . . . . . . . . . . . . . . 14 + 2.4 Sizes . . . . . . . . . . . . . . . . . . . . . . . . . 14 + 2.5 Basic Data Types . . . . . . . . . . . . . . . . . . . . 15 + 2.6 Defined Error Numbers . . . . . . . . . . . . . . . . . 17 + 3. Server Procedures . . . . . . . . . . . . . . . . . . . . 27 + 3.1 General comments on attributes . . . . . . . . . . . . . 29 + 3.2 General comments on filenames . . . . . . . . . . . . . 30 + 3.3.0 NULL: Do nothing . . . . . . . . . . . . . . . . . . . . 31 + + + +Callaghan, el al Informational [Page 1] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + 3.3.1 GETATTR: Get file attributes . . . . . . . . . . . . . . 32 + 3.3.2 SETATTR: Set file attributes . . . . . . . . . . . . . . 33 + 3.3.3 LOOKUP: Lookup filename . . . . . . . . . . . . . . . . 37 + 3.3.4 ACCESS: Check access permission . . . . . . . . . . . . 40 + 3.3.5 READLINK: Read from symbolic link . . . . . . . . . . . 44 + 3.3.6 READ: Read from file . . . . . . . . . . . . . . . . . . 46 + 3.3.7 WRITE: Write to file . . . . . . . . . . . . . . . . . . 49 + 3.3.8 CREATE: Create a file . . . . . . . . . . . . . . . . . 54 + 3.3.9 MKDIR: Create a directory . . . . . . . . . . . . . . . 58 + 3.3.10 SYMLINK: Create a symbolic link . . . . . . . . . . . . 61 + 3.3.11 MKNOD: Create a special device . . . . . . . . . . . . . 63 + 3.3.12 REMOVE: Remove a file . . . . . . . . . . . . . . . . . 67 + 3.3.13 RMDIR: Remove a directory . . . . . . . . . . . . . . . 69 + 3.3.14 RENAME: Rename a file or directory . . . . . . . . . . . 71 + 3.3.15 LINK: Create link to an object . . . . . . . . . . . . . 74 + 3.3.16 READDIR: Read From directory . . . . . . . . . . . . . . 76 + 3.3.17 READDIRPLUS: Extended read from directory . . . . . . . 80 + 3.3.18 FSSTAT: Get dynamic file system information . . . . . . 84 + 3.3.19 FSINFO: Get static file system information . . . . . . . 86 + 3.3.20 PATHCONF: Retrieve POSIX information . . . . . . . . . . 90 + 3.3.21 COMMIT: Commit cached data on a server to stable storage 92 + 4. Implementation issues . . . . . . . . . . . . . . . . . . 96 + 4.1 Multiple version support . . . . . . . . . . . . . . . . 96 + 4.2 Server/client relationship . . . . . . . . . . . . . . . 96 + 4.3 Path name interpretation . . . . . . . . . . . . . . . . 97 + 4.4 Permission issues . . . . . . . . . . . . . . . . . . . 98 + 4.5 Duplicate request cache . . . . . . . . . . . . . . . . 99 + 4.6 File name component handling . . . . . . . . . . . . . . 101 + 4.7 Synchronous modifying operations . . . . . . . . . . . . 101 + 4.8 Stable storage . . . . . . . . . . . . . . . . . . . . . 101 + 4.9 Lookups and name resolution . . . . . . . . . . . . . . 102 + 4.10 Adaptive retransmission . . . . . . . . . . . . . . . . 102 + 4.11 Caching policies . . . . . . . . . . . . . . . . . . . . 102 + 4.12 Stable versus unstable writes. . . . . . . . . . . . . . 103 + 4.13 32 bit clients/servers and 64 bit clients/servers. . . . 104 + 5. Appendix I: Mount protocol . . . . . . . . . . . . . . . . 106 + 5.1 RPC Information . . . . . . . . . . . . . . . . . . . . 106 + 5.1.1 Authentication . . . . . . . . . . . . . . . . . . . . 106 + 5.1.2 Constants . . . . . . . . . . . . . . . . . . . . . . 106 + 5.1.3 Transport address . . . . . . . . . . . . . . . . . . 106 + 5.1.4 Sizes . . . . . . . . . . . . . . . . . . . . . . . . 106 + 5.1.5 Basic Data Types . . . . . . . . . . . . . . . . . . . 106 + 5.2 Server Procedures . . . . . . . . . . . . . . . . . . . 107 + 5.2.0 NULL: Do nothing . . . . . . . . . . . . . . . . . . . 108 + 5.2.1 MNT: Add mount entry . . . . . . . . . . . . . . . . . 109 + 5.2.2 DUMP: Return mount entries . . . . . . . . . . . . . . 110 + 5.2.3 UMNT: Remove mount entry . . . . . . . . . . . . . . . 111 + 5.2.4 UMNTALL: Remove all mount entries . . . . . . . . . . 112 + + + +Callaghan, el al Informational [Page 2] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + 5.2.5 EXPORT: Return export list . . . . . . . . . . . . . . 113 + 6. Appendix II: Lock manager protocol . . . . . . . . . . . . 114 + 6.1 RPC Information . . . . . . . . . . . . . . . . . . . . 114 + 6.1.1 Authentication . . . . . . . . . . . . . . . . . . . . 114 + 6.1.2 Constants . . . . . . . . . . . . . . . . . . . . . . 114 + 6.1.3 Transport Address . . . . . . . . . . . . . . . . . . 115 + 6.1.4 Basic Data Types . . . . . . . . . . . . . . . . . . . 115 + 6.2 NLM Procedures . . . . . . . . . . . . . . . . . . . . . 118 + 6.2.0 NULL: Do nothing . . . . . . . . . . . . . . . . . . . 120 + 6.3 Implementation issues . . . . . . . . . . . . . . . . . 120 + 6.3.1 64-bit offsets and lengths . . . . . . . . . . . . . . 120 + 6.3.2 File handles . . . . . . . . . . . . . . . . . . . . . 120 + 7. Appendix III: Bibliography . . . . . . . . . . . . . . . . 122 + 8. Security Considerations . . . . . . . . . . . . . . . . . 125 + 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . 125 + 10. Authors' Addresses . . . . . . . . . . . . . . . . . . . . 126 + +1. Introduction + + Sun's NFS protocol provides transparent remote access to shared + file systems across networks. The NFS protocol is designed to be + machine, operating system, network architecture, and transport + protocol independent. This independence is achieved through the + use of Remote Procedure Call (RPC) primitives built on top of an + eXternal Data Representation (XDR). Implementations of the NFS + version 2 protocol exist for a variety of machines, from personal + computers to supercomputers. The initial version of the NFS + protocol is specified in the Network File System Protocol + Specification [RFC1094]. A description of the initial + implementation can be found in [Sandberg]. + + The supporting MOUNT protocol performs the operating + system-specific functions that allow clients to attach remote + directory trees to a point within the local file system. The + mount process also allows the server to grant remote access + privileges to a restricted set of clients via export control. + + The Lock Manager provides support for file locking when used in + the NFS environment. The Network Lock Manager (NLM) protocol + isolates the inherently stateful aspects of file locking into a + separate protocol. + + A complete description of the above protocols and their + implementation is to be found in [X/OpenNFS]. + + The purpose of this document is to: + + + + + +Callaghan, el al Informational [Page 3] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + o Specify the NFS version 3 protocol. + + o Describe semantics of the protocol through annotation + and description of intended implementation. + + o Specify the MOUNT version 3 protocol. + + o Briefly describe the changes between the NLM version 3 + protocol and the NLM version 4 protocol. + + The normative text is the description of the RPC procedures and + arguments and results, which defines the over-the-wire protocol, + and the semantics of those procedures. The material describing + implementation practice aids the understanding of the protocol + specification and describes some possible implementation issues + and solutions. It is not possible to describe all implementations + and the UNIX operating system implementation of the NFS version 3 + protocol is most often used to provide examples. Given that, the + implementation discussion does not bear the authority of the + description of the over-the-wire protocol itself. + +1.1 Scope of the NFS version 3 protocol + + This revision of the NFS protocol addresses new requirements. + The need to support larger files and file systems has prompted + extensions to allow 64 bit file sizes and offsets. The revision + enhances security by adding support for an access check to be + done on the server. Performance modifications are of three + types: + + 1. The number of over-the-wire packets for a given + set of file operations is reduced by returning file + attributes on every operation, thus decreasing the number + of calls to get modified attributes. + + 2. The write throughput bottleneck caused by the synchronous + definition of write in the NFS version 2 protocol has been + addressed by adding support so that the NFS server can do + unsafe writes. Unsafe writes are writes which have not + been committed to stable storage before the operation + returns. This specification defines a method for + committing these unsafe writes to stable storage in a + reliable way. + + 3. Limitations on transfer sizes have been relaxed. + + The ability to support multiple versions of a protocol in RPC + will allow implementors of the NFS version 3 protocol to define + + + +Callaghan, el al Informational [Page 4] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + clients and servers that provide backwards compatibility with + the existing installed base of NFS version 2 protocol + implementations. + + The extensions described here represent an evolution of the + existing NFS protocol and most of the design features of the + NFS protocol described in [Sandberg] persist. See Changes + from the NFS version 2 protocol on page 11 for a more + detailed summary of the changes introduced by this revision. + +1.2 Useful terms + + In this specification, a "server" is a machine that provides + resources to the network; a "client" is a machine that accesses + resources over the network; a "user" is a person logged in on a + client; an "application" is a program that executes on a client. + +1.3 Remote Procedure Call + + The Sun Remote Procedure Call specification provides a + procedure-oriented interface to remote services. Each server + supplies a program, which is a set of procedures. The NFS + service is one such program. The combination of host address, + program number, version number, and procedure number specify one + remote service procedure. Servers can support multiple versions + of a program by using different protocol version numbers. + + The NFS protocol was designed to not require any specific level + of reliability from its lower levels so it could potentially be + used on many underlying transport protocols. The NFS service is + based on RPC which provides the abstraction above lower level + network and transport protocols. + + The rest of this document assumes the NFS environment is + implemented on top of Sun RPC, which is specified in [RFC1057]. + A complete discussion is found in [Corbin]. + +1.4 External Data Representation + + The eXternal Data Representation (XDR) specification provides a + standard way of representing a set of data types on a network. + This solves the problem of different byte orders, structure + alignment, and data type representation on different, + communicating machines. + + In this document, the RPC Data Description Language is used to + specify the XDR format parameters and results to each of the RPC + service procedures that an NFS server provides. The RPC Data + + + +Callaghan, el al Informational [Page 5] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Description Language is similar to declarations in the C + programming language. A few new constructs have been added. + The notation: + + string name[SIZE]; + string data<DSIZE>; + + defines name, which is a fixed size block of SIZE bytes, and + data, which is a variable sized block of up to DSIZE bytes. This + notation indicates fixed-length arrays and arrays with a + variable number of elements up to a fixed maximum. A + variable-length definition with no size specified means there is + no maximum size for the field. + + The discriminated union definition: + + union example switch (enum status) { + case OK: + struct { + filename file1; + filename file2; + integer count; + } + case ERROR: + struct { + errstat error; + integer errno; + } + default: + void; + } + + defines a structure where the first thing over the network is an + enumeration type called status. If the value of status is OK, + the next thing on the network will be the structure containing + file1, file2, and count. Else, if the value of status is ERROR, + the next thing on the network will be a structure containing + error and errno. If the value of status is neither OK nor + ERROR, then there is no more data in the structure. + + The XDR type, hyper, is an 8 byte (64 bit) quantity. It is used + in the same way as the integer type. For example: + + hyper foo; + unsigned hyper bar; + + foo is an 8 byte signed value, while bar is an 8 byte unsigned + value. + + + +Callaghan, el al Informational [Page 6] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Although RPC/XDR compilers exist to generate client and server + stubs from RPC Data Description Language input, NFS + implementations do not require their use. Any software that + provides equivalent encoding and decoding to the canonical + network order of data defined by XDR can be used to interoperate + with other NFS implementations. + + XDR is described in [RFC1014]. + +1.5 Authentication and Permission Checking + + The RPC protocol includes a slot for authentication parameters + on every call. The contents of the authentication parameters are + determined by the type of authentication used by the server and + client. A server may support several different flavors of + authentication at once. The AUTH_NONE flavor provides null + authentication, that is, no authentication information is + passed. The AUTH_UNIX flavor provides UNIX-style user ID, group + ID, and groups with each call. The AUTH_DES flavor provides + DES-encrypted authentication parameters based on a network-wide + name, with session keys exchanged via a public key scheme. The + AUTH_KERB flavor provides DES encrypted authentication + parameters based on a network-wide name with session keys + exchanged via Kerberos secret keys. + + The NFS server checks permissions by taking the credentials from + the RPC authentication information in each remote request. For + example, using the AUTH_UNIX flavor of authentication, the + server gets the user's effective user ID, effective group ID and + groups on each call, and uses them to check access. Using user + ids and group ids implies that the client and server either + share the same ID list or do local user and group ID mapping. + Servers and clients must agree on the mapping from user to uid + and from group to gid, for those sites that do not implement a + consistent user ID and group ID space. In practice, such mapping + is typically performed on the server, following a static mapping + scheme or a mapping established by the user from a client at + mount time. + + The AUTH_DES and AUTH_KERB style of authentication is based on a + network-wide name. It provides greater security through the use + of DES encryption and public keys in the case of AUTH_DES, and + DES encryption and Kerberos secret keys (and tickets) in the + AUTH_KERB case. Again, the server and client must agree on the + identity of a particular name on the network, but the name to + identity mapping is more operating system independent than the + uid and gid mapping in AUTH_UNIX. Also, because the + authentication parameters are encrypted, a malicious user must + + + +Callaghan, el al Informational [Page 7] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + know another users network password or private key to masquerade + as that user. Similarly, the server returns a verifier that is + also encrypted so that masquerading as a server requires knowing + a network password. + + The NULL procedure typically requires no authentication. + +1.6 Philosophy + + This specification defines the NFS version 3 protocol, that is + the over-the-wire protocol by which a client accesses a server. + The protocol provides a well-defined interface to a server's + file resources. A client or server implements the protocol and + provides a mapping of the local file system semantics and + actions into those defined in the NFS version 3 protocol. + Implementations may differ to varying degrees, depending on the + extent to which a given environment can support all the + operations and semantics defined in the NFS version 3 protocol. + Although implementations exist and are used to illustrate + various aspects of the NFS version 3 protocol, the protocol + specification itself is the final description of how clients + access server resources. + + Because the NFS version 3 protocol is designed to be + operating-system independent, it does not necessarily match the + semantics of any existing system. Server implementations are + expected to make a best effort at supporting the protocol. If a + server cannot support a particular protocol procedure, it may + return the error, NFS3ERR_NOTSUP, that indicates that the + operation is not supported. For example, many operating systems + do not support the notion of a hard link. A server that cannot + support hard links should return NFS3ERR_NOTSUP in response to a + LINK request. FSINFO describes the most commonly unsupported + procedures in the properties bit map. Alternatively, a server + may not natively support a given operation, but can emulate it + in the NFS version 3 protocol implementation to provide greater + functionality. + + In some cases, a server can support most of the semantics + described by the protocol but not all. For example, the ctime + field in the fattr structure gives the time that a file's + attributes were last modified. Many systems do not keep this + information. In this case, rather than not support the GETATTR + operation, a server could simulate it by returning the last + modified time in place of ctime. Servers must be careful when + simulating attribute information because of possible side + effects on clients. For example, many clients use file + modification times as a basis for their cache consistency + + + +Callaghan, el al Informational [Page 8] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + scheme. + + NFS servers are dumb and NFS clients are smart. It is the + clients that do the work required to convert the generalized + file access that servers provide into a file access method that + is useful to applications and users. In the LINK example given + above, a UNIX client that received an NFS3ERR_NOTSUP error from + a server would do the recovery necessary to either make it look + to the application like the link request had succeeded or return + a reasonable error. In general, it is the burden of the client + to recover. + + The NFS version 3 protocol assumes a stateless server + implementation. Statelessness means that the server does not + need to maintain state about any of its clients in order to + function correctly. Stateless servers have a distinct advantage + over stateful servers in the event of a crash. With stateless + servers, a client need only retry a request until the server + responds; the client does not even need to know that the server + has crashed. See additional comments in Duplicate request cache + on page 99. + + For a server to be useful, it holds nonvolatile state: data + stored in the file system. Design assumptions in the NFS version + 3 protocol regarding flushing of modified data to stable storage + reduce the number of failure modes in which data loss can occur. + In this way, NFS version 3 protocol implementations can tolerate + transient failures, including transient failures of the network. + In general, server implementations of the NFS version 3 protocol + cannot tolerate a non-transient failure of the stable storage + itself. However, there exist fault tolerant implementations + which attempt to address such problems. + + That is not to say that an NFS version 3 protocol server can't + maintain noncritical state. In many cases, servers will maintain + state (cache) about previous operations to increase performance. + For example, a client READ request might trigger a read-ahead of + the next block of the file into the server's data cache in the + anticipation that the client is doing a sequential read and the + next client READ request will be satisfied from the server's + data cache instead of from the disk. Read-ahead on the server + increases performance by overlapping server disk I/O with client + requests. The important point here is that the read-ahead block + is not necessary for correct server behavior. If the server + crashes and loses its memory cache of read buffers, recovery is + simple on reboot - clients will continue read operations + retrieving data from the server disk. + + + + +Callaghan, el al Informational [Page 9] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Most data-modifying operations in the NFS protocol are + synchronous. That is, when a data modifying procedure returns + to the client, the client can assume that the operation has + completed and any modified data associated with the request is + now on stable storage. For example, a synchronous client WRITE + request may cause the server to update data blocks, file system + information blocks, and file attribute information - the latter + information is usually referred to as metadata. When the WRITE + operation completes, the client can assume that the write data + is safe and discard it. This is a very important part of the + stateless nature of the server. If the server did not flush + dirty data to stable storage before returning to the client, the + client would have no way of knowing when it was safe to discard + modified data. The following data modifying procedures are + synchronous: WRITE (with stable flag set to FILE_SYNC), CREATE, + MKDIR, SYMLINK, MKNOD, REMOVE, RMDIR, RENAME, LINK, and COMMIT. + + The NFS version 3 protocol introduces safe asynchronous writes + on the server, when the WRITE procedure is used in conjunction + with the COMMIT procedure. The COMMIT procedure provides a way + for the client to flush data from previous asynchronous WRITE + requests on the server to stable storage and to detect whether + it is necessary to retransmit the data. See the procedure + descriptions of WRITE on page 49 and COMMIT on page 92. + + The LOOKUP procedure is used by the client to traverse + multicomponent file names (pathnames). Each call to LOOKUP is + used to resolve one segment of a pathname. There are two reasons + for restricting LOOKUP to a single segment: it is hard to + standardize a common format for hierarchical file names and the + client and server may have different mappings of pathnames to + file systems. This would imply that either the client must break + the path name at file system attachment points, or the server + must know about the client's file system attachment points. In + NFS version 3 protocol implementations, it is the client that + constructs the hierarchical file name space using mounts to + build a hierarchy. Support utilities, such as the Automounter, + provide a way to manage a shared, consistent image of the file + name space while still being driven by the client mount + process. + + Clients can perform caching in varied manner. The general + practice with the NFS version 2 protocol was to implement a + time-based client-server cache consistency mechanism. It is + expected NFS version 3 protocol implementations will use a + similar mechanism. The NFS version 3 protocol has some explicit + support, in the form of additional attribute information to + eliminate explicit attribute checks. However, caching is not + + + +Callaghan, el al Informational [Page 10] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + required, nor is any caching policy defined by the protocol. + Neither the NFS version 2 protocol nor the NFS version 3 + protocol provide a means of maintaining strict client-server + consistency (and, by implication, consistency across client + caches). + +1.7 Changes from the NFS Version 2 Protocol + + The ROOT and WRITECACHE procedures have been removed. A MKNOD + procedure has been defined to allow the creation of special + files, eliminating the overloading of CREATE. Caching on the + client is not defined nor dictated by the NFS version 3 + protocol, but additional information and hints have been added + to the protocol to allow clients that implement caching to + manage their caches more effectively. Procedures that affect the + attributes of a file or directory may now return the new + attributes after the operation has completed to optimize out a + subsequent GETATTR used in validating attribute caches. In + addition, operations that modify the directory in which the + target object resides return the old and new attributes of the + directory to allow clients to implement more intelligent cache + invalidation procedures. The ACCESS procedure provides access + permission checking on the server, the FSSTAT procedure returns + dynamic information about a file system, the FSINFO procedure + returns static information about a file system and server, the + READDIRPLUS procedure returns file handles and attributes in + addition to directory entries, and the PATHCONF procedure + returns POSIX pathconf information about a file. + + Below is a list of the important changes between the NFS version + 2 protocol and the NFS version 3 protocol. + + File handle size + The file handle has been increased to a variable-length + array of 64 bytes maximum from a fixed array of 32 + bytes. This addresses some known requirements for a + slightly larger file handle size. The file handle was + converted from fixed length to variable length to + reduce local storage and network bandwidth requirements + for systems which do not utilize the full 64 bytes of + length. + + Maximum data sizes + The maximum size of a data transfer used in the READ + and WRITE procedures is now set by values in the FSINFO + return structure. In addition, preferred transfer sizes + are returned by FSINFO. The protocol does not place any + artificial limits on the maximum transfer sizes. + + + +Callaghan, el al Informational [Page 11] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Filenames and pathnames are now specified as strings of + variable length. The actual length restrictions are + determined by the client and server implementations as + appropriate. The protocol does not place any + artificial limits on the length. The error, + NFS3ERR_NAMETOOLONG, is provided to allow the server to + return an indication to the client that it received a + pathname that was too long for it to handle. + + Error return + Error returns in some instances now return data (for + example, attributes). nfsstat3 now defines the full set + of errors that can be returned by a server. No other + values are allowed. + + File type + The file type now includes NF3CHR and NF3BLK for + special files. Attributes for these types include + subfields for UNIX major and minor devices numbers. + NF3SOCK and NF3FIFO are now defined for sockets and + fifos in the file system. + + File attributes + The blocksize (the size in bytes of a block in the + file) field has been removed. The mode field no longer + contains file type information. The size and fileid + fields have been widened to eight-byte unsigned + integers from four-byte integers. Major and minor + device information is now presented in a distinct + structure. The blocks field name has been changed to + used and now contains the total number of bytes used by + the file. It is also an eight-byte unsigned integer. + + Set file attributes + In the NFS version 2 protocol, the settable attributes + were represented by a subset of the file attributes + structure; the client indicated those attributes which + were not to be modified by setting the corresponding + field to -1, overloading some unsigned fields. The set + file attributes structure now uses a discriminated + union for each field to tell whether or how to set that + field. The atime and mtime fields can be set to either + the server's current time or a time supplied by the + client. + + LOOKUP + The LOOKUP return structure now includes the attributes + for the directory searched. + + + +Callaghan, el al Informational [Page 12] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + ACCESS + An ACCESS procedure has been added to allow an explicit + over-the-wire permissions check. This addresses known + problems with the superuser ID mapping feature in many + server implementations (where, due to mapping of root + user, unexpected permission denied errors could occur + while reading from or writing to a file). This also + removes the assumption which was made in the NFS + version 2 protocol that access to files was based + solely on UNIX style mode bits. + + READ + The reply structure includes a Boolean that is TRUE if + the end-of-file was encountered during the READ. This + allows the client to correctly detect end-of-file. + + WRITE + The beginoffset and totalcount fields were removed from + the WRITE arguments. The reply now includes a count so + that the server can write less than the requested + amount of data, if required. An indicator was added to + the arguments to instruct the server as to the level of + cache synchronization that is required by the client. + + CREATE + An exclusive flag and a create verifier was added for + the exclusive creation of regular files. + + MKNOD + This procedure was added to support the creation of + special files. This avoids overloading fields of CREATE + as was done in some NFS version 2 protocol + implementations. + + READDIR + The READDIR arguments now include a verifier to allow + the server to validate the cookie. The cookie is now a + 64 bit unsigned integer instead of the 4 byte array + which was used in the NFS version 2 protocol. This + will help to reduce interoperability problems. + + READDIRPLUS + This procedure was added to return file handles and + attributes in an extended directory list. + + FSINFO + FSINFO was added to provide nonvolatile information + about a file system. The reply includes preferred and + + + +Callaghan, el al Informational [Page 13] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + maximum read transfer size, preferred and maximum write + transfer size, and flags stating whether links or + symbolic links are supported. Also returned are + preferred transfer size for READDIR procedure replies, + server time granularity, and whether times can be set + in a SETATTR request. + + FSSTAT + FSSTAT was added to provide volatile information about + a file system, for use by utilities such as the Unix + system df command. The reply includes the total size + and free space in the file system specified in bytes, + the total number of files and number of free file slots + in the file system, and an estimate of time between + file system modifications (for use in cache consistency + checking algorithms). + + COMMIT + The COMMIT procedure provides the synchronization + mechanism to be used with asynchronous WRITE + operations. + +2. RPC Information + +2.1 Authentication + + The NFS service uses AUTH_NONE in the NULL procedure. AUTH_UNIX, + AUTH_DES, or AUTH_KERB are used for all other procedures. Other + authentication types may be supported in the future. + +2.2 Constants + + These are the RPC constants needed to call the NFS Version 3 + service. They are given in decimal. + + PROGRAM 100003 + VERSION 3 + +2.3 Transport address + + The NFS protocol is normally supported over the TCP and UDP + protocols. It uses port 2049, the same as the NFS version 2 + protocol. + +2.4 Sizes + + These are the sizes, given in decimal bytes, of various XDR + structures used in the NFS version 3 protocol: + + + +Callaghan, el al Informational [Page 14] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3_FHSIZE 64 + The maximum size in bytes of the opaque file handle. + + NFS3_COOKIEVERFSIZE 8 + The size in bytes of the opaque cookie verifier passed by + READDIR and READDIRPLUS. + + NFS3_CREATEVERFSIZE 8 + The size in bytes of the opaque verifier used for + exclusive CREATE. + + NFS3_WRITEVERFSIZE 8 + The size in bytes of the opaque verifier used for + asynchronous WRITE. + +2.5 Basic Data Types + + The following XDR definitions are basic definitions that are + used in other structures. + + uint64 + typedef unsigned hyper uint64; + + int64 + typedef hyper int64; + + uint32 + typedef unsigned long uint32; + + int32 + typedef long int32; + + filename3 + typedef string filename3<>; + + nfspath3 + typedef string nfspath3<>; + + fileid3 + typedef uint64 fileid3; + + cookie3 + typedef uint64 cookie3; + + cookieverf3 + typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE]; + + + + + +Callaghan, el al Informational [Page 15] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + createverf3 + typedef opaque createverf3[NFS3_CREATEVERFSIZE]; + + writeverf3 + typedef opaque writeverf3[NFS3_WRITEVERFSIZE]; + + uid3 + typedef uint32 uid3; + + gid3 + typedef uint32 gid3; + + size3 + typedef uint64 size3; + + offset3 + typedef uint64 offset3; + + mode3 + typedef uint32 mode3; + + count3 + typedef uint32 count3; + + nfsstat3 + enum nfsstat3 { + NFS3_OK = 0, + NFS3ERR_PERM = 1, + NFS3ERR_NOENT = 2, + NFS3ERR_IO = 5, + NFS3ERR_NXIO = 6, + NFS3ERR_ACCES = 13, + NFS3ERR_EXIST = 17, + NFS3ERR_XDEV = 18, + NFS3ERR_NODEV = 19, + NFS3ERR_NOTDIR = 20, + NFS3ERR_ISDIR = 21, + NFS3ERR_INVAL = 22, + NFS3ERR_FBIG = 27, + NFS3ERR_NOSPC = 28, + NFS3ERR_ROFS = 30, + NFS3ERR_MLINK = 31, + NFS3ERR_NAMETOOLONG = 63, + NFS3ERR_NOTEMPTY = 66, + NFS3ERR_DQUOT = 69, + NFS3ERR_STALE = 70, + NFS3ERR_REMOTE = 71, + NFS3ERR_BADHANDLE = 10001, + + + +Callaghan, el al Informational [Page 16] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3ERR_NOT_SYNC = 10002, + NFS3ERR_BAD_COOKIE = 10003, + NFS3ERR_NOTSUPP = 10004, + NFS3ERR_TOOSMALL = 10005, + NFS3ERR_SERVERFAULT = 10006, + NFS3ERR_BADTYPE = 10007, + NFS3ERR_JUKEBOX = 10008 + }; + + The nfsstat3 type is returned with every procedure's results + except for the NULL procedure. A value of NFS3_OK indicates that + the call completed successfully. Any other value indicates that + some error occurred on the call, as identified by the error + code. Note that the precise numeric encoding must be followed. + No other values may be returned by a server. Servers are + expected to make a best effort mapping of error conditions to + the set of error codes defined. In addition, no error + precedences are specified by this specification. Error + precedences determine the error value that should be returned + when more than one error applies in a given situation. The error + precedence will be determined by the individual server + implementation. If the client requires specific error + precedences, it should check for the specific errors for + itself. + +2.6 Defined Error Numbers + + A description of each defined error follows: + + NFS3_OK + Indicates the call completed successfully. + + NFS3ERR_PERM + Not owner. The operation was not allowed because the + caller is either not a privileged user (root) or not the + owner of the target of the operation. + + NFS3ERR_NOENT + No such file or directory. The file or directory name + specified does not exist. + + NFS3ERR_IO + I/O error. A hard error (for example, a disk error) + occurred while processing the requested operation. + + NFS3ERR_NXIO + I/O error. No such device or address. + + + + +Callaghan, el al Informational [Page 17] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3ERR_ACCES + Permission denied. The caller does not have the correct + permission to perform the requested operation. Contrast + this with NFS3ERR_PERM, which restricts itself to owner + or privileged user permission failures. + + NFS3ERR_EXIST + File exists. The file specified already exists. + + NFS3ERR_XDEV + Attempt to do a cross-device hard link. + + NFS3ERR_NODEV + No such device. + + NFS3ERR_NOTDIR + Not a directory. The caller specified a non-directory in + a directory operation. + + NFS3ERR_ISDIR + Is a directory. The caller specified a directory in a + non-directory operation. + + NFS3ERR_INVAL + Invalid argument or unsupported argument for an + operation. Two examples are attempting a READLINK on an + object other than a symbolic link or attempting to + SETATTR a time field on a server that does not support + this operation. + + NFS3ERR_FBIG + File too large. The operation would have caused a file to + grow beyond the server's limit. + + NFS3ERR_NOSPC + No space left on device. The operation would have caused + the server's file system to exceed its limit. + + NFS3ERR_ROFS + Read-only file system. A modifying operation was + attempted on a read-only file system. + + NFS3ERR_MLINK + Too many hard links. + + NFS3ERR_NAMETOOLONG + The filename in an operation was too long. + + + + +Callaghan, el al Informational [Page 18] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3ERR_NOTEMPTY + + An attempt was made to remove a directory that was not + empty. + + NFS3ERR_DQUOT + Resource (quota) hard limit exceeded. The user's resource + limit on the server has been exceeded. + + NFS3ERR_STALE + Invalid file handle. The file handle given in the + arguments was invalid. The file referred to by that file + handle no longer exists or access to it has been + revoked. + + NFS3ERR_REMOTE + Too many levels of remote in path. The file handle given + in the arguments referred to a file on a non-local file + system on the server. + + NFS3ERR_BADHANDLE + Illegal NFS file handle. The file handle failed internal + consistency checks. + + NFS3ERR_NOT_SYNC + Update synchronization mismatch was detected during a + SETATTR operation. + + NFS3ERR_BAD_COOKIE + READDIR or READDIRPLUS cookie is stale. + + NFS3ERR_NOTSUPP + Operation is not supported. + + NFS3ERR_TOOSMALL + Buffer or request is too small. + + NFS3ERR_SERVERFAULT + An error occurred on the server which does not map to any + of the legal NFS version 3 protocol error values. The + client should translate this into an appropriate error. + UNIX clients may choose to translate this to EIO. + + NFS3ERR_BADTYPE + An attempt was made to create an object of a type not + supported by the server. + + + + + +Callaghan, el al Informational [Page 19] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3ERR_JUKEBOX + The server initiated the request, but was not able to + complete it in a timely fashion. The client should wait + and then try the request with a new RPC transaction ID. + For example, this error should be returned from a server + that supports hierarchical storage and receives a request + to process a file that has been migrated. In this case, + the server should start the immigration process and + respond to client with this error. + + ftype3 + + enum ftype3 { + NF3REG = 1, + NF3DIR = 2, + NF3BLK = 3, + NF3CHR = 4, + NF3LNK = 5, + NF3SOCK = 6, + NF3FIFO = 7 + }; + + The enumeration, ftype3, gives the type of a file. The type, + NF3REG, is a regular file, NF3DIR is a directory, NF3BLK is a + block special device file, NF3CHR is a character special device + file, NF3LNK is a symbolic link, NF3SOCK is a socket, and + NF3FIFO is a named pipe. Note that the precise enum encoding + must be followed. + + specdata3 + + struct specdata3 { + uint32 specdata1; + uint32 specdata2; + }; + + The interpretation of the two words depends on the type of file + system object. For a block special (NF3BLK) or character special + (NF3CHR) file, specdata1 and specdata2 are the major and minor + device numbers, respectively. (This is obviously a + UNIX-specific interpretation.) For all other file types, these + two elements should either be set to 0 or the values should be + agreed upon by the client and server. If the client and server + do not agree upon the values, the client should treat these + fields as if they are set to 0. This data field is returned as + part of the fattr3 structure and so is available from all + replies returning attributes. Since these fields are otherwise + unused for objects which are not devices, out of band + + + +Callaghan, el al Informational [Page 20] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + information can be passed from the server to the client. + However, once again, both the server and the client must agree + on the values passed. + + nfs_fh3 + + struct nfs_fh3 { + opaque data<NFS3_FHSIZE>; + }; + + The nfs_fh3 is the variable-length opaque object returned by the + server on LOOKUP, CREATE, SYMLINK, MKNOD, LINK, or READDIRPLUS + operations, which is used by the client on subsequent operations + to reference the file. The file handle contains all the + information the server needs to distinguish an individual file. + To the client, the file handle is opaque. The client stores file + handles for use in a later request and can compare two file + handles from the same server for equality by doing a + byte-by-byte comparison, but cannot otherwise interpret the + contents of file handles. If two file handles from the same + server are equal, they must refer to the same file, but if they + are not equal, no conclusions can be drawn. Servers should try + to maintain a one-to-one correspondence between file handles and + files, but this is not required. Clients should use file handle + comparisons only to improve performance, not for correct + behavior. + + Servers can revoke the access provided by a file handle at any + time. If the file handle passed in a call refers to a file + system object that no longer exists on the server or access for + that file handle has been revoked, the error, NFS3ERR_STALE, + should be returned. + + nfstime3 + + struct nfstime3 { + uint32 seconds; + uint32 nseconds; + }; + + The nfstime3 structure gives the number of seconds and + nanoseconds since midnight January 1, 1970 Greenwich Mean Time. + It is used to pass time and date information. The times + associated with files are all server times except in the case of + a SETATTR operation where the client can explicitly set the file + time. A server converts to and from local time when processing + time values, preserving as much accuracy as possible. If the + precision of timestamps stored for a file is less than that + + + +Callaghan, el al Informational [Page 21] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + defined by NFS version 3 protocol, loss of precision can occur. + An adjunct time maintenance protocol is recommended to reduce + client and server time skew. + + fattr3 + + struct fattr3 { + ftype3 type; + mode3 mode; + uint32 nlink; + uid3 uid; + gid3 gid; + size3 size; + size3 used; + specdata3 rdev; + uint64 fsid; + fileid3 fileid; + nfstime3 atime; + nfstime3 mtime; + nfstime3 ctime; + }; + + This structure defines the attributes of a file system object. + It is returned by most operations on an object; in the case of + operations that affect two objects (for example, a MKDIR that + modifies the target directory attributes and defines new + attributes for the newly created directory), the attributes for + both may be returned. In some cases, the attributes are returned + in the structure, wcc_data, which is defined below; in other + cases the attributes are returned alone. The main changes from + the NFS version 2 protocol are that many of the fields have been + widened and the major/minor device information is now presented + in a distinct structure rather than being packed into a word. + + The fattr3 structure contains the basic attributes of a file. + All servers should support this set of attributes even if they + have to simulate some of the fields. Type is the type of the + file. Mode is the protection mode bits. Nlink is the number of + hard links to the file - that is, the number of different names + for the same file. Uid is the user ID of the owner of the file. + Gid is the group ID of the group of the file. Size is the size + of the file in bytes. Used is the number of bytes of disk space + that the file actually uses (which can be smaller than the size + because the file may have holes or it may be larger due to + fragmentation). Rdev describes the device file if the file type + is NF3CHR or NF3BLK - see specdata3 on page 20. Fsid is the file + system identifier for the file system. Fileid is a number which + uniquely identifies the file within its file system (on UNIX + + + +Callaghan, el al Informational [Page 22] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + this would be the inumber). Atime is the time when the file data + was last accessed. Mtime is the time when the file data was last + modified. Ctime is the time when the attributes of the file + were last changed. Writing to the file changes the ctime in + addition to the mtime. + + The mode bits are defined as follows: + + 0x00800 Set user ID on execution. + 0x00400 Set group ID on execution. + 0x00200 Save swapped text (not defined in POSIX). + 0x00100 Read permission for owner. + 0x00080 Write permission for owner. + 0x00040 Execute permission for owner on a file. Or lookup + (search) permission for owner in directory. + 0x00020 Read permission for group. + 0x00010 Write permission for group. + 0x00008 Execute permission for group on a file. Or lookup + (search) permission for group in directory. + 0x00004 Read permission for others. + 0x00002 Write permission for others. + 0x00001 Execute permission for others on a file. Or lookup + (search) permission for others in directory. + + post_op_attr + + union post_op_attr switch (bool attributes_follow) { + case TRUE: + fattr3 attributes; + case FALSE: + void; + }; + + This structure is used for returning attributes in those + operations that are not directly involved with manipulating + attributes. One of the principles of this revision of the NFS + protocol is to return the real value from the indicated + operation and not an error from an incidental operation. The + post_op_attr structure was designed to allow the server to + recover from errors encountered while getting attributes. + + This appears to make returning attributes optional. However, + server implementors are strongly encouraged to make best effort + to return attributes whenever possible, even when returning an + error. + + + + + + +Callaghan, el al Informational [Page 23] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + wcc_attr + + struct wcc_attr { + size3 size; + nfstime3 mtime; + nfstime3 ctime; + }; + + This is the subset of pre-operation attributes needed to better + support the weak cache consistency semantics. Size is the file + size in bytes of the object before the operation. Mtime is the + time of last modification of the object before the operation. + Ctime is the time of last change to the attributes of the object + before the operation. See discussion in wcc_attr on page 24. + + The use of mtime by clients to detect changes to file system + objects residing on a server is dependent on the granularity of + the time base on the server. + + pre_op_attr + + union pre_op_attr switch (bool attributes_follow) { + case TRUE: + wcc_attr attributes; + case FALSE: + void; + }; + + wcc_data + + struct wcc_data { + pre_op_attr before; + post_op_attr after; + }; + + When a client performs an operation that modifies the state of a + file or directory on the server, it cannot immediately determine + from the post-operation attributes whether the operation just + performed was the only operation on the object since the last + time the client received the attributes for the object. This is + important, since if an intervening operation has changed the + object, the client will need to invalidate any cached data for + the object (except for the data that it just wrote). + + To deal with this, the notion of weak cache consistency data or + wcc_data is introduced. A wcc_data structure consists of certain + key fields from the object attributes before the operation, + together with the object attributes after the operation. This + + + +Callaghan, el al Informational [Page 24] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + information allows the client to manage its cache more + accurately than in NFS version 2 protocol implementations. The + term, weak cache consistency, emphasizes the fact that this + mechanism does not provide the strict server-client consistency + that a cache consistency protocol would provide. + + In order to support the weak cache consistency model, the server + will need to be able to get the pre-operation attributes of the + object, perform the intended modify operation, and then get the + post-operation attributes atomically. If there is a window for + the object to get modified between the operation and either of + the get attributes operations, then the client will not be able + to determine whether it was the only entity to modify the + object. Some information will have been lost, thus weakening the + weak cache consistency guarantees. + + post_op_fh3 + + union post_op_fh3 switch (bool handle_follows) { + case TRUE: + nfs_fh3 handle; + case FALSE: + void; + }; + + One of the principles of this revision of the NFS protocol is to + return the real value from the indicated operation and not an + error from an incidental operation. The post_op_fh3 structure + was designed to allow the server to recover from errors + encountered while constructing a file handle. + + This is the structure used to return a file handle from the + CREATE, MKDIR, SYMLINK, MKNOD, and READDIRPLUS requests. In each + case, the client can get the file handle by issuing a LOOKUP + request after a successful return from one of the listed + operations. Returning the file handle is an optimization so that + the client is not forced to immediately issue a LOOKUP request + to get the file handle. + + sattr3 + + enum time_how { + DONT_CHANGE = 0, + SET_TO_SERVER_TIME = 1, + SET_TO_CLIENT_TIME = 2 + }; + + union set_mode3 switch (bool set_it) { + + + +Callaghan, el al Informational [Page 25] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + case TRUE: + mode3 mode; + default: + void; + }; + + union set_uid3 switch (bool set_it) { + case TRUE: + uid3 uid; + default: + void; + }; + + union set_gid3 switch (bool set_it) { + case TRUE: + gid3 gid; + default: + void; + }; + + union set_size3 switch (bool set_it) { + case TRUE: + size3 size; + default: + void; + }; + + union set_atime switch (time_how set_it) { + case SET_TO_CLIENT_TIME: + nfstime3 atime; + default: + void; + }; + + union set_mtime switch (time_how set_it) { + case SET_TO_CLIENT_TIME: + nfstime3 mtime; + default: + void; + }; + + struct sattr3 { + set_mode3 mode; + set_uid3 uid; + set_gid3 gid; + set_size3 size; + set_atime atime; + set_mtime mtime; + + + +Callaghan, el al Informational [Page 26] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + }; + + The sattr3 structure contains the file attributes that can be + set from the client. The fields are the same as the similarly + named fields in the fattr3 structure. In the NFS version 3 + protocol, the settable attributes are described by a structure + containing a set of discriminated unions. Each union indicates + whether the corresponding attribute is to be updated, and if so, + how. + + There are two forms of discriminated unions used. In setting the + mode, uid, gid, or size, the discriminated union is switched on + a boolean, set_it; if it is TRUE, a value of the appropriate + type is then encoded. + + In setting the atime or mtime, the union is switched on an + enumeration type, set_it. If set_it has the value DONT_CHANGE, + the corresponding attribute is unchanged. If it has the value, + SET_TO_SERVER_TIME, the corresponding attribute is set by the + server to its local time; no data is provided by the client. + Finally, if set_it has the value, SET_TO_CLIENT_TIME, the + attribute is set to the time passed by the client in an nfstime3 + structure. (See FSINFO on page 86, which addresses the issue of + time granularity). + + diropargs3 + + struct diropargs3 { + nfs_fh3 dir; + filename3 name; + }; + + The diropargs3 structure is used in directory operations. The + file handle, dir, identifies the directory in which to + manipulate or access the file, name. See additional comments in + File name component handling on page 101. + +3. Server Procedures + + The following sections define the RPC procedures that are + supplied by an NFS version 3 protocol server. The RPC + procedure number is given at the top of the page with the + name. The SYNOPSIS provides the name of the procedure, the + list of the names of the arguments, the list of the names of + the results, followed by the XDR argument declarations and + results declarations. The information in the SYNOPSIS is + specified in RPC Data Description Language as defined in + [RFC1014]. The DESCRIPTION section tells what the procedure + + + +Callaghan, el al Informational [Page 27] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + is expected to do and how its arguments and results are used. + The ERRORS section lists the errors returned for specific + types of failures. These lists are not intended to be the + definitive statement of all of the errors which can be + returned by any specific procedure, but as a guide for the + more common errors which may be returned. Client + implementations should be prepared to deal with unexpected + errors coming from a server. The IMPLEMENTATION field gives + information about how the procedure is expected to work and + how it should be used by clients. + + program NFS_PROGRAM { + version NFS_V3 { + + void + NFSPROC3_NULL(void) = 0; + + GETATTR3res + NFSPROC3_GETATTR(GETATTR3args) = 1; + + SETATTR3res + NFSPROC3_SETATTR(SETATTR3args) = 2; + + LOOKUP3res + NFSPROC3_LOOKUP(LOOKUP3args) = 3; + + ACCESS3res + NFSPROC3_ACCESS(ACCESS3args) = 4; + + READLINK3res + NFSPROC3_READLINK(READLINK3args) = 5; + + READ3res + NFSPROC3_READ(READ3args) = 6; + + WRITE3res + NFSPROC3_WRITE(WRITE3args) = 7; + + CREATE3res + NFSPROC3_CREATE(CREATE3args) = 8; + + MKDIR3res + NFSPROC3_MKDIR(MKDIR3args) = 9; + + SYMLINK3res + NFSPROC3_SYMLINK(SYMLINK3args) = 10; + + + + + +Callaghan, el al Informational [Page 28] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + MKNOD3res + NFSPROC3_MKNOD(MKNOD3args) = 11; + + REMOVE3res + NFSPROC3_REMOVE(REMOVE3args) = 12; + + RMDIR3res + NFSPROC3_RMDIR(RMDIR3args) = 13; + + RENAME3res + NFSPROC3_RENAME(RENAME3args) = 14; + + LINK3res + NFSPROC3_LINK(LINK3args) = 15; + + READDIR3res + NFSPROC3_READDIR(READDIR3args) = 16; + + READDIRPLUS3res + NFSPROC3_READDIRPLUS(READDIRPLUS3args) = 17; + + FSSTAT3res + NFSPROC3_FSSTAT(FSSTAT3args) = 18; + + FSINFO3res + NFSPROC3_FSINFO(FSINFO3args) = 19; + + PATHCONF3res + NFSPROC3_PATHCONF(PATHCONF3args) = 20; + + COMMIT3res + NFSPROC3_COMMIT(COMMIT3args) = 21; + + } = 3; + } = 100003; + + Out of range (undefined) procedure numbers result in RPC + errors. Refer to [RFC1057] for more detail. + +3.1 General comments on attributes and consistency data on failure + + For those procedures that return either post_op_attr or wcc_data + structures on failure, the discriminated union may contain the + pre-operation attributes of the object or object parent + directory. This depends on the error encountered and may also + depend on the particular server implementation. Implementors are + strongly encouraged to return as much attribute data as possible + upon failure, but client implementors need to be aware that + + + +Callaghan, el al Informational [Page 29] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + their implementation must correctly handle the variant return + instance where no attributes or consistency data is returned. + +3.2 General comments on filenames + + The following comments apply to all NFS version 3 protocol + procedures in which the client provides one or more filenames in + the arguments: LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD, REMOVE, + RMDIR, RENAME, and LINK. + + 1. The filename must not be null nor may it be the null + string. The server should return the error, NFS3ERR_ACCES, if + it receives such a filename. On some clients, the filename, ``'' + or a null string, is assumed to be an alias for the current + directory. Clients which require this functionality should + implement it for themselves and not depend upon the server to + support such semantics. + + 2. A filename having the value of "." is assumed to be an + alias for the current directory. Clients which require this + functionality should implement it for themselves and not depend + upon the server to support such semantics. However, the server + should be able to handle such a filename correctly. + + 3. A filename having the value of ".." is assumed to be an + alias for the parent of the current directory, i.e. the + directory which contains the current directory. The server + should be prepared to handle this semantic, if it supports + directories, even if those directories do not contain UNIX-style + "." or ".." entries. + + 4. If the filename is longer than the maximum for the file + system (see PATHCONF on page 90, specifically name_max), the + result depends on the value of the PATHCONF flag, no_trunc. If + no_trunc is FALSE, the filename will be silently truncated to + name_max bytes. If no_trunc is TRUE and the filename exceeds the + server's file system maximum filename length, the operation will + fail with the error, NFS3ERR_NAMETOOLONG. + + 5. In general, there will be characters that a server will + not be able to handle as part of a filename. This set of + characters will vary from server to server and from + implementation to implementation. In most cases, it is the + server which will control the client's view of the file system. + If the server receives a filename containing characters that it + can not handle, the error, NFS3ERR_EACCES, should be returned. + Client implementations should be prepared to handle this side + affect of heterogeneity. + + + +Callaghan, el al Informational [Page 30] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + See also comments in File name component handling on page 101. + +3.3.0 Procedure 0: NULL - Do nothing + + SYNOPSIS + + void NFSPROC3_NULL(void) = 0; + + DESCRIPTION + + Procedure NULL does not do any work. It is made available to + allow server response testing and timing. + + IMPLEMENTATION + + It is important that this procedure do no work at all so + that it can be used to measure the overhead of processing + a service request. By convention, the NULL procedure + should never require any authentication. A server may + choose to ignore this convention, in a more secure + implementation, where responding to the NULL procedure + call acknowledges the existence of a resource to an + unauthenticated client. + + ERRORS + + Since the NULL procedure takes no NFS version 3 protocol + arguments and returns no NFS version 3 protocol response, + it can not return an NFS version 3 protocol error. + However, it is possible that some server implementations + may return RPC errors based on security and authentication + requirements. + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 31] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.1 Procedure 1: GETATTR - Get file attributes + + SYNOPSIS + + GETATTR3res NFSPROC3_GETATTR(GETATTR3args) = 1; + + struct GETATTR3args { + nfs_fh3 object; + }; + + struct GETATTR3resok { + fattr3 obj_attributes; + }; + + union GETATTR3res switch (nfsstat3 status) { + case NFS3_OK: + GETATTR3resok resok; + default: + void; + }; + + DESCRIPTION + + Procedure GETATTR retrieves the attributes for a specified + file system object. The object is identified by the file + handle that the server returned as part of the response + from a LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD, or + READDIRPLUS procedure (or from the MOUNT service, + described elsewhere). On entry, the arguments in + GETATTR3args are: + + object + The file handle of an object whose attributes are to be + retrieved. + + On successful return, GETATTR3res.status is NFS3_OK and + GETATTR3res.resok contains: + + obj_attributes + The attributes for the object. + + Otherwise, GETATTR3res.status contains the error on failure and + no other results are returned. + + IMPLEMENTATION + + The attributes of file system objects is a point of major + disagreement between different operating systems. Servers + + + +Callaghan, el al Informational [Page 32] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + should make a best attempt to support all of the + attributes in the fattr3 structure so that clients can + count on this as a common ground. Some mapping may be + required to map local attributes to those in the fattr3 + structure. + + Today, most client NFS version 3 protocol implementations + implement a time-bounded attribute caching scheme to + reduce over-the-wire attribute checks. + + ERRORS + + NFS3ERR_IO + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + ACCESS. + +3.3.2 Procedure 2: SETATTR - Set file attributes + + SYNOPSIS + + SETATTR3res NFSPROC3_SETATTR(SETATTR3args) = 2; + + union sattrguard3 switch (bool check) { + case TRUE: + nfstime3 obj_ctime; + case FALSE: + void; + }; + + struct SETATTR3args { + nfs_fh3 object; + sattr3 new_attributes; + sattrguard3 guard; + }; + + struct SETATTR3resok { + wcc_data obj_wcc; + }; + + struct SETATTR3resfail { + wcc_data obj_wcc; + }; + + + + +Callaghan, el al Informational [Page 33] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + union SETATTR3res switch (nfsstat3 status) { + case NFS3_OK: + SETATTR3resok resok; + default: + SETATTR3resfail resfail; + }; + + DESCRIPTION + + Procedure SETATTR changes one or more of the attributes of + a file system object on the server. The new attributes are + specified by a sattr3 structure. On entry, the arguments + in SETATTR3args are: + + object + The file handle for the object. + + new_attributes + A sattr3 structure containing booleans and + enumerations describing the attributes to be set and the new + values for those attributes. + + guard + A sattrguard3 union: + + check + TRUE if the server is to verify that guard.obj_ctime + matches the ctime for the object; FALSE otherwise. + + A client may request that the server check that the object + is in an expected state before performing the SETATTR + operation. To do this, it sets the argument guard.check to + TRUE and the client passes a time value in guard.obj_ctime. + If guard.check is TRUE, the server must compare the value of + guard.obj_ctime to the current ctime of the object. If the + values are different, the server must preserve the object + attributes and must return a status of NFS3ERR_NOT_SYNC. + If guard.check is FALSE, the server will not perform this + check. + + On successful return, SETATTR3res.status is NFS3_OK and + SETATTR3res.resok contains: + + obj_wcc + A wcc_data structure containing the old and new + attributes for the object. + + + + + +Callaghan, el al Informational [Page 34] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Otherwise, SETATTR3res.status contains the error on + failure and SETATTR3res.resfail contains the following: + + obj_wcc + A wcc_data structure containing the old and new + attributes for the object. + + IMPLEMENTATION + + The guard.check mechanism allows the client to avoid + changing the attributes of an object on the basis of stale + attributes. It does not guarantee exactly-once semantics. + In particular, if a reply is lost and the server does not + detect the retransmission of the request, the procedure + can fail with the error, NFS3ERR_NOT_SYNC, even though the + attribute setting was previously performed successfully. + The client can attempt to recover from this error by + getting fresh attributes from the server and sending a new + SETATTR request using the new ctime. The client can + optionally check the attributes to avoid the second + SETATTR request if the new attributes show that the + attributes have already been set as desired (though it may + not have been the issuing client that set the + attributes). + + The new_attributes.size field is used to request changes + to the size of a file. A value of 0 causes the file to be + truncated, a value less than the current size of the file + causes data from new size to the end of the file to be + discarded, and a size greater than the current size of the + file causes logically zeroed data bytes to be added to the + end of the file. Servers are free to implement this using + holes or actual zero data bytes. Clients should not make + any assumptions regarding a server's implementation of + this feature, beyond that the bytes returned will be + zeroed. Servers must support extending the file size via + SETATTR. + + SETATTR is not guaranteed atomic. A failed SETATTR may + partially change a file's attributes. + + Changing the size of a file with SETATTR indirectly + changes the mtime. A client must account for this as size + changes can result in data deletion. + + If server and client times differ, programs that compare + client time to file times can break. A time maintenance + protocol should be used to limit client/server time skew. + + + +Callaghan, el al Informational [Page 35] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + In a heterogeneous environment, it is quite possible that + the server will not be able to support the full range of + SETATTR requests. The error, NFS3ERR_INVAL, may be + returned if the server can not store a uid or gid in its + own representation of uids or gids, respectively. If the + server can only support 32 bit offsets and sizes, a + SETATTR request to set the size of a file to larger than + can be represented in 32 bits will be rejected with this + same error. + + ERRORS + + NFS3ERR_PERM + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_INVAL + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_DQUOT + NFS3ERR_NOT_SYNC + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + CREATE, MKDIR, SYMLINK, and MKNOD. + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 36] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.3 Procedure 3: LOOKUP - Lookup filename + + SYNOPSIS + + LOOKUP3res NFSPROC3_LOOKUP(LOOKUP3args) = 3; + + struct LOOKUP3args { + diropargs3 what; + }; + + struct LOOKUP3resok { + nfs_fh3 object; + post_op_attr obj_attributes; + post_op_attr dir_attributes; + }; + + struct LOOKUP3resfail { + post_op_attr dir_attributes; + }; + + union LOOKUP3res switch (nfsstat3 status) { + case NFS3_OK: + LOOKUP3resok resok; + default: + LOOKUP3resfail resfail; + }; + + DESCRIPTION + + Procedure LOOKUP searches a directory for a specific name + and returns the file handle for the corresponding file + system object. On entry, the arguments in LOOKUP3args + are: + + what + Object to look up: + + dir + The file handle for the directory to search. + + name + The filename to be searched for. Refer to General + comments on filenames on page 30. + + On successful return, LOOKUP3res.status is NFS3_OK and + LOOKUP3res.resok contains: + + + + + +Callaghan, el al Informational [Page 37] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + object + The file handle of the object corresponding to + what.name. + + obj_attributes + The attributes of the object corresponding to + what.name. + + dir_attributes + The post-operation attributes of the directory, + what.dir. + + Otherwise, LOOKUP3res.status contains the error on failure and + LOOKUP3res.resfail contains the following: + + dir_attributes + The post-operation attributes for the directory, + what.dir. + + IMPLEMENTATION + + At first glance, in the case where what.name refers to a + mount point on the server, two different replies seem + possible. The server can return either the file handle for + the underlying directory that is mounted on or the file + handle of the root of the mounted directory. This + ambiguity is simply resolved. A server will not allow a + LOOKUP operation to cross a mountpoint to the root of a + different filesystem, even if the filesystem is exported. + This does not prevent a client from accessing a hierarchy + of filesystems exported by a server, but the client must + mount each of the filesystems individually so that the + mountpoint crossing takes place on the client. A given + server implementation may refine these rules given + capabilities or limitations particular to that + implementation. Refer to [X/OpenNFS] for a discussion on + exporting file systems. + + Two filenames are distinguished, as in the NFS version 2 + protocol. The name, ".", is an alias for the current + directory and the name, "..", is an alias for the parent + directory; that is, the directory that includes the + specified directory as a member. There is no facility for + dealing with a multiparented directory and the NFS + protocol assumes a hierarchical organization, organized as + a single-rooted tree. + + + + + +Callaghan, el al Informational [Page 38] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Note that this procedure does not follow symbolic links. + The client is responsible for all parsing of filenames + including filenames that are modified by symbolic links + encountered during the lookup process. + + ERRORS + + NFS3ERR_IO + NFS3ERR_NOENT + NFS3ERR_ACCES + NFS3ERR_NOTDIR + NFS3ERR_NAMETOOLONG + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + CREATE, MKDIR, SYMLINK, MKNOD, READDIRPLUS, and PATHCONF. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 39] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.4 Procedure 4: ACCESS - Check Access Permission + + SYNOPSIS + + ACCESS3res NFSPROC3_ACCESS(ACCESS3args) = 4; + + const ACCESS3_READ = 0x0001; + const ACCESS3_LOOKUP = 0x0002; + const ACCESS3_MODIFY = 0x0004; + const ACCESS3_EXTEND = 0x0008; + const ACCESS3_DELETE = 0x0010; + const ACCESS3_EXECUTE = 0x0020; + + struct ACCESS3args { + nfs_fh3 object; + uint32 access; + }; + + struct ACCESS3resok { + post_op_attr obj_attributes; + uint32 access; + }; + + struct ACCESS3resfail { + post_op_attr obj_attributes; + }; + + union ACCESS3res switch (nfsstat3 status) { + case NFS3_OK: + ACCESS3resok resok; + default: + ACCESS3resfail resfail; + }; + + DESCRIPTION + + Procedure ACCESS determines the access rights that a user, + as identified by the credentials in the request, has with + respect to a file system object. The client encodes the + set of permissions that are to be checked in a bit mask. + The server checks the permissions encoded in the bit mask. + A status of NFS3_OK is returned along with a bit mask + encoded with the permissions that the client is allowed. + + The results of this procedure are necessarily advisory in + nature. That is, a return status of NFS3_OK and the + appropriate bit set in the bit mask does not imply that + such access will be allowed to the file system object in + + + +Callaghan, el al Informational [Page 40] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + the future, as access rights can be revoked by the server + at any time. + + On entry, the arguments in ACCESS3args are: + + object + The file handle for the file system object to which + access is to be checked. + + access + A bit mask of access permissions to check. + + The following access permissions may be requested: + + ACCESS3_READ + Read data from file or read a directory. + + ACCESS3_LOOKUP + Look up a name in a directory (no meaning for + non-directory objects). + + ACCESS3_MODIFY + Rewrite existing file data or modify existing + directory entries. + + ACCESS3_EXTEND + Write new data or add directory entries. + + ACCESS3_DELETE + Delete an existing directory entry. + + ACCESS3_EXECUTE + Execute file (no meaning for a directory). + + On successful return, ACCESS3res.status is NFS3_OK. The + server should return a status of NFS3_OK if no errors + occurred that prevented the server from making the + required access checks. The results in ACCESS3res.resok + are: + + obj_attributes + The post-operation attributes of object. + + access + A bit mask of access permissions indicating access + rights for the authentication credentials provided with + the request. + + + + +Callaghan, el al Informational [Page 41] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Otherwise, ACCESS3res.status contains the error on failure + and ACCESS3res.resfail contains the following: + + obj_attributes + The attributes of object - if access to attributes is + permitted. + + IMPLEMENTATION + + In general, it is not sufficient for the client to attempt + to deduce access permissions by inspecting the uid, gid, + and mode fields in the file attributes, since the server + may perform uid or gid mapping or enforce additional + access control restrictions. It is also possible that the + NFS version 3 protocol server may not be in the same ID + space as the NFS version 3 protocol client. In these cases + (and perhaps others), the NFS version 3 protocol client + can not reliably perform an access check with only current + file attributes. + + In the NFS version 2 protocol, the only reliable way to + determine whether an operation was allowed was to try it + and see if it succeeded or failed. Using the ACCESS + procedure in the NFS version 3 protocol, the client can + ask the server to indicate whether or not one or more + classes of operations are permitted. The ACCESS operation + is provided to allow clients to check before doing a + series of operations. This is useful in operating systems + (such as UNIX) where permission checking is done only when + a file or directory is opened. This procedure is also + invoked by NFS client access procedure (called possibly + through access(2)). The intent is to make the behavior of + opening a remote file more consistent with the behavior of + opening a local file. + + The information returned by the server in response to an + ACCESS call is not permanent. It was correct at the exact + time that the server performed the checks, but not + necessarily afterwards. The server can revoke access + permission at any time. + + The NFS version 3 protocol client should use the effective + credentials of the user to build the authentication + information in the ACCESS request used to determine access + rights. It is the effective user and group credentials + that are used in subsequent read and write operations. See + the comments in Permission issues on page 98 for more + information on this topic. + + + +Callaghan, el al Informational [Page 42] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Many implementations do not directly support the + ACCESS3_DELETE permission. Operating systems like UNIX + will ignore the ACCESS3_DELETE bit if set on an access + request on a non-directory object. In these systems, + delete permission on a file is determined by the access + permissions on the directory in which the file resides, + instead of being determined by the permissions of the file + itself. Thus, the bit mask returned for such a request + will have the ACCESS3_DELETE bit set to 0, indicating that + the client does not have this permission. + + ERRORS + + NFS3ERR_IO + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + GETATTR. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 43] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.5 Procedure 5: READLINK - Read from symbolic link + + SYNOPSIS + + READLINK3res NFSPROC3_READLINK(READLINK3args) = 5; + + struct READLINK3args { + nfs_fh3 symlink; + }; + + struct READLINK3resok { + post_op_attr symlink_attributes; + nfspath3 data; + }; + + struct READLINK3resfail { + post_op_attr symlink_attributes; + }; + + union READLINK3res switch (nfsstat3 status) { + case NFS3_OK: + READLINK3resok resok; + default: + READLINK3resfail resfail; + }; + + DESCRIPTION + + Procedure READLINK reads the data associated with a + symbolic link. The data is an ASCII string that is opaque + to the server. That is, whether created by the NFS + version 3 protocol software from a client or created + locally on the server, the data in a symbolic link is not + interpreted when created, but is simply stored. On entry, + the arguments in READLINK3args are: + + symlink + The file handle for a symbolic link (file system object + of type NF3LNK). + + On successful return, READLINK3res.status is NFS3_OK and + READLINK3res.resok contains: + + data + The data associated with the symbolic link. + + symlink_attributes + The post-operation attributes for the symbolic link. + + + +Callaghan, el al Informational [Page 44] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Otherwise, READLINK3res.status contains the error on + failure and READLINK3res.resfail contains the following: + + symlink_attributes + The post-operation attributes for the symbolic link. + + IMPLEMENTATION + + A symbolic link is nominally a pointer to another file. + The data is not necessarily interpreted by the server, + just stored in the file. It is possible for a client + implementation to store a path name that is not meaningful + to the server operating system in a symbolic link. A + READLINK operation returns the data to the client for + interpretation. If different implementations want to share + access to symbolic links, then they must agree on the + interpretation of the data in the symbolic link. + + The READLINK operation is only allowed on objects of type, + NF3LNK. The server should return the error, + NFS3ERR_INVAL, if the object is not of type, NF3LNK. + (Note: The X/Open XNFS Specification for the NFS version 2 + protocol defined the error status in this case as + NFSERR_NXIO. This is inconsistent with existing server + practice.) + + ERRORS + + NFS3ERR_IO + NFS3ERR_INVAL + NFS3ERR_ACCES + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + READLINK, SYMLINK. + + + + + + + + + + + + +Callaghan, el al Informational [Page 45] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.6 Procedure 6: READ - Read From file + + SYNOPSIS + + READ3res NFSPROC3_READ(READ3args) = 6; + + struct READ3args { + nfs_fh3 file; + offset3 offset; + count3 count; + }; + + struct READ3resok { + post_op_attr file_attributes; + count3 count; + bool eof; + opaque data<>; + }; + + struct READ3resfail { + post_op_attr file_attributes; + }; + + union READ3res switch (nfsstat3 status) { + case NFS3_OK: + READ3resok resok; + default: + READ3resfail resfail; + }; + + DESCRIPTION + + Procedure READ reads data from a file. On entry, the + arguments in READ3args are: + + file + The file handle of the file from which data is to be + read. This must identify a file system object of type, + NF3REG. + + offset + The position within the file at which the read is to + begin. An offset of 0 means to read data starting at + the beginning of the file. If offset is greater than or + equal to the size of the file, the status, NFS3_OK, is + returned with count set to 0 and eof set to TRUE, + subject to access permissions checking. + + + + +Callaghan, el al Informational [Page 46] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + count + The number of bytes of data that are to be read. If + count is 0, the READ will succeed and return 0 bytes of + data, subject to access permissions checking. count + must be less than or equal to the value of the rtmax + field in the FSINFO reply structure for the file system + that contains file. If greater, the server may return + only rtmax bytes, resulting in a short read. + + On successful return, READ3res.status is NFS3_OK and + READ3res.resok contains: + + file_attributes + The attributes of the file on completion of the read. + + count + The number of bytes of data returned by the read. + + eof + If the read ended at the end-of-file (formally, in a + correctly formed READ request, if READ3args.offset plus + READ3resok.count is equal to the size of the file), eof + is returned as TRUE; otherwise it is FALSE. A + successful READ of an empty file will always return eof + as TRUE. + + data + The counted data read from the file. + + Otherwise, READ3res.status contains the error on failure + and READ3res.resfail contains the following: + + file_attributes + The post-operation attributes of the file. + + IMPLEMENTATION + + The nfsdata type used for the READ and WRITE operations in + the NFS version 2 protocol defining the data portion of a + request or reply has been changed to a variable-length + opaque byte array. The maximum size allowed by the + protocol is now limited by what XDR and underlying + transports will allow. There are no artificial limits + imposed by the NFS version 3 protocol. Consult the FSINFO + procedure description for details. + + + + + + +Callaghan, el al Informational [Page 47] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + It is possible for the server to return fewer than count + bytes of data. If the server returns less than the count + requested and eof set to FALSE, the client should issue + another READ to get the remaining data. A server may + return less data than requested under several + circumstances. The file may have been truncated by another + client or perhaps on the server itself, changing the file + size from what the requesting client believes to be the + case. This would reduce the actual amount of data + available to the client. It is possible that the server + may back off the transfer size and reduce the read request + return. Server resource exhaustion may also occur + necessitating a smaller read return. + + Some NFS version 2 protocol client implementations chose + to interpret a short read response as indicating EOF. The + addition of the eof flag in the NFS version 3 protocol + provides a correct way of handling EOF. + + Some NFS version 2 protocol server implementations + incorrectly returned NFSERR_ISDIR if the file system + object type was not a regular file. The correct return + value for the NFS version 3 protocol is NFS3ERR_INVAL. + + ERRORS + + NFS3ERR_IO + NFS3ERR_NXIO + NFS3ERR_ACCES + NFS3ERR_INVAL + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + READLINK. + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 48] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.7 Procedure 7: WRITE - Write to file + + SYNOPSIS + + WRITE3res NFSPROC3_WRITE(WRITE3args) = 7; + + enum stable_how { + UNSTABLE = 0, + DATA_SYNC = 1, + FILE_SYNC = 2 + }; + + struct WRITE3args { + nfs_fh3 file; + offset3 offset; + count3 count; + stable_how stable; + opaque data<>; + }; + + struct WRITE3resok { + wcc_data file_wcc; + count3 count; + stable_how committed; + writeverf3 verf; + }; + + struct WRITE3resfail { + wcc_data file_wcc; + }; + + union WRITE3res switch (nfsstat3 status) { + case NFS3_OK: + WRITE3resok resok; + default: + WRITE3resfail resfail; + }; + + DESCRIPTION + + Procedure WRITE writes data to a file. On entry, the + arguments in WRITE3args are: + + file + The file handle for the file to which data is to be + written. This must identify a file system object of + type, NF3REG. + + + + +Callaghan, el al Informational [Page 49] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + offset + The position within the file at which the write is to + begin. An offset of 0 means to write data starting at + the beginning of the file. + + count + The number of bytes of data to be written. If count is + 0, the WRITE will succeed and return a count of 0, + barring errors due to permissions checking. The size of + data must be less than or equal to the value of the + wtmax field in the FSINFO reply structure for the file + system that contains file. If greater, the server may + write only wtmax bytes, resulting in a short write. + + stable + If stable is FILE_SYNC, the server must commit the data + written plus all file system metadata to stable storage + before returning results. This corresponds to the NFS + version 2 protocol semantics. Any other behavior + constitutes a protocol violation. If stable is + DATA_SYNC, then the server must commit all of the data + to stable storage and enough of the metadata to + retrieve the data before returning. The server + implementor is free to implement DATA_SYNC in the same + fashion as FILE_SYNC, but with a possible performance + drop. If stable is UNSTABLE, the server is free to + commit any part of the data and the metadata to stable + storage, including all or none, before returning a + reply to the client. There is no guarantee whether or + when any uncommitted data will subsequently be + committed to stable storage. The only guarantees made + by the server are that it will not destroy any data + without changing the value of verf and that it will not + commit the data and metadata at a level less than that + requested by the client. See the discussion on COMMIT + on page 92 for more information on if and when + data is committed to stable storage. + + data + The data to be written to the file. + + On successful return, WRITE3res.status is NFS3_OK and + WRITE3res.resok contains: + + file_wcc + Weak cache consistency data for the file. For a client + that requires only the post-write file attributes, + these can be found in file_wcc.after. + + + +Callaghan, el al Informational [Page 50] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + count + The number of bytes of data written to the file. The + server may write fewer bytes than requested. If so, the + actual number of bytes written starting at location, + offset, is returned. + + committed + The server should return an indication of the level of + commitment of the data and metadata via committed. If + the server committed all data and metadata to stable + storage, committed should be set to FILE_SYNC. If the + level of commitment was at least as strong as + DATA_SYNC, then committed should be set to DATA_SYNC. + Otherwise, committed must be returned as UNSTABLE. If + stable was FILE_SYNC, then committed must also be + FILE_SYNC: anything else constitutes a protocol + violation. If stable was DATA_SYNC, then committed may + be FILE_SYNC or DATA_SYNC: anything else constitutes a + protocol violation. If stable was UNSTABLE, then + committed may be either FILE_SYNC, DATA_SYNC, or + UNSTABLE. + + verf + This is a cookie that the client can use to determine + whether the server has changed state between a call to + WRITE and a subsequent call to either WRITE or COMMIT. + This cookie must be consistent during a single instance + of the NFS version 3 protocol service and must be + unique between instances of the NFS version 3 protocol + server, where uncommitted data may be lost. + + Otherwise, WRITE3res.status contains the error on failure + and WRITE3res.resfail contains the following: + + file_wcc + Weak cache consistency data for the file. For a client + that requires only the post-write file attributes, + these can be found in file_wcc.after. Even though the + write failed, full wcc_data is returned to allow the + client to determine whether the failed write resulted + in any change to the file. + + If a client writes data to the server with the stable + argument set to UNSTABLE and the reply yields a committed + response of DATA_SYNC or UNSTABLE, the client will follow + up some time in the future with a COMMIT operation to + synchronize outstanding asynchronous data and metadata + with the server's stable storage, barring client error. It + + + +Callaghan, el al Informational [Page 51] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + is possible that due to client crash or other error that a + subsequent COMMIT will not be received by the server. + + IMPLEMENTATION + + The nfsdata type used for the READ and WRITE operations in + the NFS version 2 protocol defining the data portion of a + request or reply has been changed to a variable-length + opaque byte array. The maximum size allowed by the + protocol is now limited by what XDR and underlying + transports will allow. There are no artificial limits + imposed by the NFS version 3 protocol. Consult the FSINFO + procedure description for details. + + It is possible for the server to write fewer than count + bytes of data. In this case, the server should not return + an error unless no data was written at all. If the server + writes less than count bytes, the client should issue + another WRITE to write the remaining data. + + It is assumed that the act of writing data to a file will + cause the mtime of the file to be updated. However, the + mtime of the file should not be changed unless the + contents of the file are changed. Thus, a WRITE request + with count set to 0 should not cause the mtime of the file + to be updated. + + The NFS version 3 protocol introduces safe asynchronous + writes. The combination of WRITE with stable set to + UNSTABLE followed by a COMMIT addresses the performance + bottleneck found in the NFS version 2 protocol, the need + to synchronously commit all writes to stable storage. + + The definition of stable storage has been historically a + point of contention. The following expected properties of + stable storage may help in resolving design issues in the + implementation. Stable storage is persistent storage that + survives: + + 1. Repeated power failures. + + 2. Hardware failures (of any board, power supply, and so on.). + + 3. Repeated software crashes, including reboot cycle. + + This definition does not address failure of the stable + storage module itself. + + + + +Callaghan, el al Informational [Page 52] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + A cookie, verf, is defined to allow a client to detect + different instances of an NFS version 3 protocol server + over which cached, uncommitted data may be lost. In the + most likely case, the verf allows the client to detect + server reboots. This information is required so that the + client can safely determine whether the server could have + lost cached data. If the server fails unexpectedly and the + client has uncommitted data from previous WRITE requests + (done with the stable argument set to UNSTABLE and in + which the result committed was returned as UNSTABLE as + well) it may not have flushed cached data to stable + storage. The burden of recovery is on the client and the + client will need to retransmit the data to the server. + + A suggested verf cookie would be to use the time that the + server was booted or the time the server was last started + (if restarting the server without a reboot results in lost + buffers). + + The committed field in the results allows the client to do + more effective caching. If the server is committing all + WRITE requests to stable storage, then it should return + with committed set to FILE_SYNC, regardless of the value + of the stable field in the arguments. A server that uses + an NVRAM accelerator may choose to implement this policy. + The client can use this to increase the effectiveness of + the cache by discarding cached data that has already been + committed on the server. + + Some implementations may return NFS3ERR_NOSPC instead of + NFS3ERR_DQUOT when a user's quota is exceeded. + + Some NFS version 2 protocol server implementations + incorrectly returned NFSERR_ISDIR if the file system + object type was not a regular file. The correct return + value for the NFS version 3 protocol is NFS3ERR_INVAL. + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_FBIG + NFS3ERR_DQUOT + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_INVAL + NFS3ERR_STALE + NFS3ERR_BADHANDLE + + + +Callaghan, el al Informational [Page 53] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3ERR_SERVERFAULT + + SEE ALSO + + COMMIT. + +3.3.8 Procedure 8: CREATE - Create a file + + SYNOPSIS + + CREATE3res NFSPROC3_CREATE(CREATE3args) = 8; + + enum createmode3 { + UNCHECKED = 0, + GUARDED = 1, + EXCLUSIVE = 2 + }; + + union createhow3 switch (createmode3 mode) { + case UNCHECKED: + case GUARDED: + sattr3 obj_attributes; + case EXCLUSIVE: + createverf3 verf; + }; + + struct CREATE3args { + diropargs3 where; + createhow3 how; + }; + + struct CREATE3resok { + post_op_fh3 obj; + post_op_attr obj_attributes; + wcc_data dir_wcc; + }; + + struct CREATE3resfail { + wcc_data dir_wcc; + }; + + union CREATE3res switch (nfsstat3 status) { + case NFS3_OK: + CREATE3resok resok; + default: + CREATE3resfail resfail; + }; + + + + +Callaghan, el al Informational [Page 54] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + DESCRIPTION + + Procedure CREATE creates a regular file. On entry, the + arguments in CREATE3args are: + + where + The location of the file to be created: + + dir + The file handle for the directory in which the file + is to be created. + + name + The name that is to be associated with the created + file. Refer to General comments on filenames on + page 30. + + When creating a regular file, there are three ways to + create the file as defined by: + + how + A discriminated union describing how the server is to + handle the file creation along with the appropriate + attributes: + + mode + One of UNCHECKED, GUARDED, and EXCLUSIVE. UNCHECKED + means that the file should be created without checking + for the existence of a duplicate file in the same + directory. In this case, how.obj_attributes is a sattr3 + describing the initial attributes for the file. GUARDED + specifies that the server should check for the presence + of a duplicate file before performing the create and + should fail the request with NFS3ERR_EXIST if a + duplicate file exists. If the file does not exist, the + request is performed as described for UNCHECKED. + EXCLUSIVE specifies that the server is to follow + exclusive creation semantics, using the verifier to + ensure exclusive creation of the target. No attributes + may be provided in this case, since the server may use + the target file metadata to store the createverf3 + verifier. + + On successful return, CREATE3res.status is NFS3_OK and the + results in CREATE3res.resok are: + + obj + The file handle of the newly created regular file. + + + +Callaghan, el al Informational [Page 55] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + obj_attributes + The attributes of the regular file just created. + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires on the + post-CREATE directory attributes, these can be found in + dir_wcc.after. + + Otherwise, CREATE3res.status contains the error on failure + and CREATE3res.resfail contains the following: + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-CREATE directory attributes, these can be found in + dir_wcc.after. Even though the CREATE failed, full + wcc_data is returned to allow the client to determine + whether the failing CREATE resulted in any change to + the directory. + + IMPLEMENTATION + + Unlike the NFS version 2 protocol, in which certain fields + in the initial attributes structure were overloaded to + indicate creation of devices and FIFOs in addition to + regular files, this procedure only supports the creation + of regular files. The MKNOD procedure was introduced in + the NFS version 3 protocol to handle creation of devices + and FIFOs. Implementations should have no reason in the + NFS version 3 protocol to overload CREATE semantics. + + One aspect of the NFS version 3 protocol CREATE procedure + warrants particularly careful consideration: the mechanism + introduced to support the reliable exclusive creation of + regular files. The mechanism comes into play when how.mode + is EXCLUSIVE. In this case, how.verf contains a verifier + that can reasonably be expected to be unique. A + combination of a client identifier, perhaps the client + network address, and a unique number generated by the + client, perhaps the RPC transaction identifier, may be + appropriate. + + If the file does not exist, the server creates the file + and stores the verifier in stable storage. For file + systems that do not provide a mechanism for the storage of + arbitrary file attributes, the server may use one or more + elements of the file metadata to store the verifier. The + + + +Callaghan, el al Informational [Page 56] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + verifier must be stored in stable storage to prevent + erroneous failure on retransmission of the request. It is + assumed that an exclusive create is being performed + because exclusive semantics are critical to the + application. Because of the expected usage, exclusive + CREATE does not rely solely on the normally volatile + duplicate request cache for storage of the verifier. The + duplicate request cache in volatile storage does not + survive a crash and may actually flush on a long network + partition, opening failure windows. In the UNIX local + file system environment, the expected storage location for + the verifier on creation is the metadata (time stamps) of + the file. For this reason, an exclusive file create may + not include initial attributes because the server would + have nowhere to store the verifier. + + If the server can not support these exclusive create + semantics, possibly because of the requirement to commit + the verifier to stable storage, it should fail the CREATE + request with the error, NFS3ERR_NOTSUPP. + + During an exclusive CREATE request, if the file already + exists, the server reconstructs the file's verifier and + compares it with the verifier in the request. If they + match, the server treats the request as a success. The + request is presumed to be a duplicate of an earlier, + successful request for which the reply was lost and that + the server duplicate request cache mechanism did not + detect. If the verifiers do not match, the request is + rejected with the status, NFS3ERR_EXIST. + + Once the client has performed a successful exclusive + create, it must issue a SETATTR to set the correct file + attributes. Until it does so, it should not rely upon any + of the file attributes, since the server implementation + may need to overload file metadata to store the verifier. + + Use of the GUARDED attribute does not provide exactly-once + semantics. In particular, if a reply is lost and the + server does not detect the retransmission of the request, + the procedure can fail with NFS3ERR_EXIST, even though the + create was performed successfully. + + Refer to General comments on filenames on page 30. + + + + + + + +Callaghan, el al Informational [Page 57] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_EXIST + NFS3ERR_NOTDIR + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_NAMETOOLONG + NFS3ERR_DQUOT + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + MKDIR, SYMLINK, MKNOD, and PATHCONF. + +3.3.9 Procedure 9: MKDIR - Create a directory + + SYNOPSIS + + MKDIR3res NFSPROC3_MKDIR(MKDIR3args) = 9; + + struct MKDIR3args { + diropargs3 where; + sattr3 attributes; + }; + + struct MKDIR3resok { + post_op_fh3 obj; + post_op_attr obj_attributes; + wcc_data dir_wcc; + }; + + struct MKDIR3resfail { + wcc_data dir_wcc; + }; + + union MKDIR3res switch (nfsstat3 status) { + case NFS3_OK: + MKDIR3resok resok; + default: + MKDIR3resfail resfail; + }; + + + + + +Callaghan, el al Informational [Page 58] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + DESCRIPTION + + Procedure MKDIR creates a new subdirectory. On entry, the + arguments in MKDIR3args are: + + where + The location of the subdirectory to be created: + + dir + The file handle for the directory in which the + subdirectory is to be created. + + name + The name that is to be associated with the created + subdirectory. Refer to General comments on filenames + on page 30. + + attributes + The initial attributes for the subdirectory. + + On successful return, MKDIR3res.status is NFS3_OK and the + results in MKDIR3res.resok are: + + obj + The file handle for the newly created directory. + + obj_attributes + The attributes for the newly created subdirectory. + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-MKDIR directory attributes, these can be found in + dir_wcc.after. + + Otherwise, MKDIR3res.status contains the error on failure + and MKDIR3res.resfail contains the following: + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-MKDIR directory attributes, these can be found in + dir_wcc.after. Even though the MKDIR failed, full + wcc_data is returned to allow the client to determine + whether the failing MKDIR resulted in any change to the + directory. + + + + + +Callaghan, el al Informational [Page 59] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + IMPLEMENTATION + + Many server implementations will not allow the filenames, + "." or "..", to be used as targets in a MKDIR operation. + In this case, the server should return NFS3ERR_EXIST. + Refer to General comments on filenames on page 30. + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_EXIST + NFS3ERR_NOTDIR + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_NAMETOOLONG + NFS3ERR_DQUOT + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + CREATE, SYMLINK, MKNOD, and PATHCONF. + + + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 60] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.10 Procedure 10: SYMLINK - Create a symbolic link + + SYNOPSIS + + SYMLINK3res NFSPROC3_SYMLINK(SYMLINK3args) = 10; + + struct symlinkdata3 { + sattr3 symlink_attributes; + nfspath3 symlink_data; + }; + + struct SYMLINK3args { + diropargs3 where; + symlinkdata3 symlink; + }; + + struct SYMLINK3resok { + post_op_fh3 obj; + post_op_attr obj_attributes; + wcc_data dir_wcc; + }; + + struct SYMLINK3resfail { + wcc_data dir_wcc; + }; + + union SYMLINK3res switch (nfsstat3 status) { + case NFS3_OK: + SYMLINK3resok resok; + default: + SYMLINK3resfail resfail; + }; + + DESCRIPTION + + Procedure SYMLINK creates a new symbolic link. On entry, + the arguments in SYMLINK3args are: + + where + The location of the symbolic link to be created: + + dir + The file handle for the directory in which the + symbolic link is to be created. + + + + + + + +Callaghan, el al Informational [Page 61] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + name + The name that is to be associated with the created + symbolic link. Refer to General comments on + filenames on page 30. + + symlink + The symbolic link to create: + + symlink_attributes + The initial attributes for the symbolic link. + + symlink_data + The string containing the symbolic link data. + + On successful return, SYMLINK3res.status is NFS3_OK and + SYMLINK3res.resok contains: + + obj + The file handle for the newly created symbolic link. + + obj_attributes + The attributes for the newly created symbolic link. + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-SYMLINK directory attributes, these can be found + in dir_wcc.after. + + Otherwise, SYMLINK3res.status contains the error on + failure and SYMLINK3res.resfail contains the following: + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-SYMLINK directory attributes, these can be found + in dir_wcc.after. Even though the SYMLINK failed, full + wcc_data is returned to allow the client to determine + whether the failing SYMLINK changed the directory. + + IMPLEMENTATION + + Refer to General comments on filenames on page 30. + + For symbolic links, the actual file system node and its + contents are expected to be created in a single atomic + operation. That is, once the symbolic link is visible, + there must not be a window where a READLINK would fail or + + + +Callaghan, el al Informational [Page 62] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + return incorrect data. + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_EXIST + NFS3ERR_NOTDIR + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_NAMETOOLONG + NFS3ERR_DQUOT + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + READLINK, CREATE, MKDIR, MKNOD, FSINFO, and PATHCONF. + +3.3.11 Procedure 11: MKNOD - Create a special device + + SYNOPSIS + + MKNOD3res NFSPROC3_MKNOD(MKNOD3args) = 11; + + struct devicedata3 { + sattr3 dev_attributes; + specdata3 spec; + }; + + union mknoddata3 switch (ftype3 type) { + case NF3CHR: + case NF3BLK: + devicedata3 device; + case NF3SOCK: + case NF3FIFO: + sattr3 pipe_attributes; + default: + void; + }; + + struct MKNOD3args { + diropargs3 where; + mknoddata3 what; + }; + + + + +Callaghan, el al Informational [Page 63] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + struct MKNOD3resok { + post_op_fh3 obj; + post_op_attr obj_attributes; + wcc_data dir_wcc; + }; + + struct MKNOD3resfail { + wcc_data dir_wcc; + }; + + union MKNOD3res switch (nfsstat3 status) { + case NFS3_OK: + MKNOD3resok resok; + default: + MKNOD3resfail resfail; + }; + + DESCRIPTION + + Procedure MKNOD creates a new special file of the type, + what.type. Special files can be device files or named + pipes. On entry, the arguments in MKNOD3args are: + + where + The location of the special file to be created: + + dir + The file handle for the directory in which the + special file is to be created. + + name + The name that is to be associated with the created + special file. Refer to General comments on filenames + on page 30. + + what + A discriminated union identifying the type of the + special file to be created along with the data and + attributes appropriate to the type of the special + file: + + type + The type of the object to be created. + + When creating a character special file (what.type is + NF3CHR) or a block special file (what.type is NF3BLK), + what includes: + + + + +Callaghan, el al Informational [Page 64] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + device + A structure devicedata3 with the following components: + + dev_attributes + The initial attributes for the special file. + + spec + The major number stored in device.spec.specdata1 and + the minor number stored in device.spec.specdata2. + + When creating a socket (what.type is NF3SOCK) or a FIFO + (what.type is NF3FIFO), what includes: + + pipe_attributes + The initial attributes for the special file. + + On successful return, MKNOD3res.status is NFS3_OK and + MKNOD3res.resok contains: + + obj + The file handle for the newly created special file. + + obj_attributes + The attributes for the newly created special file. + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-MKNOD directory attributes, these can be found in + dir_wcc.after. + + Otherwise, MKNOD3res.status contains the error on failure + and MKNOD3res.resfail contains the following: + + dir_wcc + Weak cache consistency data for the directory, + where.dir. For a client that requires only the + post-MKNOD directory attributes, these can be found in + dir_wcc.after. Even though the MKNOD failed, full + wcc_data is returned to allow the client to determine + whether the failing MKNOD changed the directory. + + IMPLEMENTATION + + Refer to General comments on filenames on page 30. + + Without explicit support for special file type creation in + the NFS version 2 protocol, fields in the CREATE arguments + + + +Callaghan, el al Informational [Page 65] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + were overloaded to indicate creation of certain types of + objects. This overloading is not necessary in the NFS + version 3 protocol. + + If the server does not support any of the defined types, + the error, NFS3ERR_NOTSUPP, should be returned. Otherwise, + if the server does not support the target type or the + target type is illegal, the error, NFS3ERR_BADTYPE, should + be returned. Note that NF3REG, NF3DIR, and NF3LNK are + illegal types for MKNOD. The procedures, CREATE, MKDIR, + and SYMLINK should be used to create these file types, + respectively, instead of MKNOD. + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_EXIST + NFS3ERR_NOTDIR + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_NAMETOOLONG + NFS3ERR_DQUOT + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + NFS3ERR_BADTYPE + + SEE ALSO + + CREATE, MKDIR, SYMLINK, and PATHCONF. + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 66] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.12 Procedure 12: REMOVE - Remove a File + + SYNOPSIS + + REMOVE3res NFSPROC3_REMOVE(REMOVE3args) = 12; + + struct REMOVE3args { + diropargs3 object; + }; + + struct REMOVE3resok { + wcc_data dir_wcc; + }; + + struct REMOVE3resfail { + wcc_data dir_wcc; + }; + + union REMOVE3res switch (nfsstat3 status) { + case NFS3_OK: + REMOVE3resok resok; + default: + REMOVE3resfail resfail; + }; + + DESCRIPTION + + Procedure REMOVE removes (deletes) an entry from a + directory. If the entry in the directory was the last + reference to the corresponding file system object, the + object may be destroyed. On entry, the arguments in + REMOVE3args are: + + object + A diropargs3 structure identifying the entry to be + removed: + + dir + The file handle for the directory from which the entry + is to be removed. + + name + The name of the entry to be removed. Refer to General + comments on filenames on page 30. + + On successful return, REMOVE3res.status is NFS3_OK and + REMOVE3res.resok contains: + + + + +Callaghan, el al Informational [Page 67] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + dir_wcc + Weak cache consistency data for the directory, + object.dir. For a client that requires only the + post-REMOVE directory attributes, these can be found in + dir_wcc.after. + + Otherwise, REMOVE3res.status contains the error on failure + and REMOVE3res.resfail contains the following: + + dir_wcc + Weak cache consistency data for the directory, + object.dir. For a client that requires only the + post-REMOVE directory attributes, these can be found in + dir_wcc.after. Even though the REMOVE failed, full + wcc_data is returned to allow the client to determine + whether the failing REMOVE changed the directory. + + IMPLEMENTATION + + In general, REMOVE is intended to remove non-directory + file objects and RMDIR is to be used to remove + directories. However, REMOVE can be used to remove + directories, subject to restrictions imposed by either the + client or server interfaces. This had been a source of + confusion in the NFS version 2 protocol. + + The concept of last reference is server specific. However, + if the nlink field in the previous attributes of the + object had the value 1, the client should not rely on + referring to the object via a file handle. Likewise, the + client should not rely on the resources (disk space, + directory entry, and so on.) formerly associated with the + object becoming immediately available. Thus, if a client + needs to be able to continue to access a file after using + REMOVE to remove it, the client should take steps to make + sure that the file will still be accessible. The usual + mechanism used is to use RENAME to rename the file from + its old name to a new hidden name. + + Refer to General comments on filenames on page 30. + + ERRORS + + NFS3ERR_NOENT + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_NOTDIR + NFS3ERR_NAMETOOLONG + + + +Callaghan, el al Informational [Page 68] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + NFS3ERR_ROFS + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + RMDIR and RENAME. + +3.3.13 Procedure 13: RMDIR - Remove a Directory + + SYNOPSIS + + RMDIR3res NFSPROC3_RMDIR(RMDIR3args) = 13; + + struct RMDIR3args { + diropargs3 object; + }; + + struct RMDIR3resok { + wcc_data dir_wcc; + }; + + struct RMDIR3resfail { + wcc_data dir_wcc; + }; + + union RMDIR3res switch (nfsstat3 status) { + case NFS3_OK: + RMDIR3resok resok; + default: + RMDIR3resfail resfail; + }; + + DESCRIPTION + + Procedure RMDIR removes (deletes) a subdirectory from a + directory. If the directory entry of the subdirectory is + the last reference to the subdirectory, the subdirectory + may be destroyed. On entry, the arguments in RMDIR3args + are: + + object + A diropargs3 structure identifying the directory entry + to be removed: + + + + + + +Callaghan, el al Informational [Page 69] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + dir + The file handle for the directory from which the + subdirectory is to be removed. + + name + The name of the subdirectory to be removed. Refer to + General comments on filenames on page 30. + + On successful return, RMDIR3res.status is NFS3_OK and + RMDIR3res.resok contains: + + dir_wcc + Weak cache consistency data for the directory, + object.dir. For a client that requires only the + post-RMDIR directory attributes, these can be found in + dir_wcc.after. + + Otherwise, RMDIR3res.status contains the error on failure + and RMDIR3res.resfail contains the following: + + dir_wcc + Weak cache consistency data for the directory, + object.dir. For a client that requires only the + post-RMDIR directory attributes, these can be found in + dir_wcc.after. Note that even though the RMDIR failed, + full wcc_data is returned to allow the client to + determine whether the failing RMDIR changed the + directory. + + IMPLEMENTATION + + Note that on some servers, removal of a non-empty + directory is disallowed. + + On some servers, the filename, ".", is illegal. These + servers will return the error, NFS3ERR_INVAL. On some + servers, the filename, "..", is illegal. These servers + will return the error, NFS3ERR_EXIST. This would seem + inconsistent, but allows these servers to comply with + their own specific interface definitions. Clients should + be prepared to handle both cases. + + The client should not rely on the resources (disk space, + directory entry, and so on.) formerly associated with the + directory becoming immediately available. + + + + + + +Callaghan, el al Informational [Page 70] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + ERRORS + + NFS3ERR_NOENT + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_INVAL + NFS3ERR_EXIST + NFS3ERR_NOTDIR + NFS3ERR_NAMETOOLONG + NFS3ERR_ROFS + NFS3ERR_NOTEMPTY + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + REMOVE. + +3.3.14 Procedure 14: RENAME - Rename a File or Directory + + SYNOPSIS + + RENAME3res NFSPROC3_RENAME(RENAME3args) = 14; + + struct RENAME3args { + diropargs3 from; + diropargs3 to; + }; + + struct RENAME3resok { + wcc_data fromdir_wcc; + wcc_data todir_wcc; + }; + + struct RENAME3resfail { + wcc_data fromdir_wcc; + wcc_data todir_wcc; + }; + + union RENAME3res switch (nfsstat3 status) { + case NFS3_OK: + RENAME3resok resok; + default: + RENAME3resfail resfail; + }; + + + + +Callaghan, el al Informational [Page 71] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + DESCRIPTION + + Procedure RENAME renames the file identified by from.name + in the directory, from.dir, to to.name in the di- rectory, + to.dir. The operation is required to be atomic to the + client. To.dir and from.dir must reside on the same file + system and server. On entry, the arguments in RENAME3args + are: + + from + A diropargs3 structure identifying the source (the file + system object to be re-named): + + from.dir + The file handle for the directory from which the + entry is to be renamed. + + from.name + The name of the entry that identifies the object to + be renamed. Refer to General comments on filenames + on page 30. + + to + A diropargs3 structure identifying the target (the new + name of the object): + + to.dir + The file handle for the directory to which the + object is to be renamed. + + to.name + The new name for the object. Refer to General + comments on filenames on page 30. + + If the directory, to.dir, already contains an entry with + the name, to.name, the source object must be compatible + with the target: either both are non-directories or both + are directories and the target must be empty. If + compatible, the existing target is removed before the + rename occurs. If they are not compatible or if the target + is a directory but not empty, the server should return the + error, NFS3ERR_EXIST. + + On successful return, RENAME3res.status is NFS3_OK and + RENAME3res.resok contains: + + + + + + +Callaghan, el al Informational [Page 72] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + fromdir_wcc + Weak cache consistency data for the directory, + from.dir. + + todir_wcc + Weak cache consistency data for the directory, to.dir. + + Otherwise, RENAME3res.status contains the error on failure + and RENAME3res.resfail contains the following: + + fromdir_wcc + Weak cache consistency data for the directory, + from.dir. + + todir_wcc + Weak cache consistency data for the directory, to.dir. + + IMPLEMENTATION + The RENAME operation must be atomic to the client. The + message "to.dir and from.dir must reside on the same file + system on the server, [or the operation will fail]" means + that the fsid fields in the attributes for the directories + are the same. If they reside on different file systems, + the error, NFS3ERR_XDEV, is returned. Even though the + operation is atomic, the status, NFS3ERR_MLINK, may be + returned if the server used a "unlink/link/unlink" + sequence internally. + + A file handle may or may not become stale on a rename. + However, server implementors are strongly encouraged to + attempt to keep file handles from becoming stale in this + fashion. + + On some servers, the filenames, "." and "..", are illegal + as either from.name or to.name. In addition, neither + from.name nor to.name can be an alias for from.dir. These + servers will return the error, NFS3ERR_INVAL, in these + cases. + + If from and to both refer to the same file (they might + be hard links of each other), then RENAME should perform + no action and return NFS3_OK. + + Refer to General comments on filenames on page 30. + + + + + + + +Callaghan, el al Informational [Page 73] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + ERRORS + + NFS3ERR_NOENT + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_EXIST + NFS3ERR_XDEV + NFS3ERR_NOTDIR + NFS3ERR_ISDIR + NFS3ERR_INVAL + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_MLINK + NFS3ERR_NAMETOOLONG + NFS3ERR_NOTEMPTY + NFS3ERR_DQUOT + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + REMOVE and LINK. + +3.3.15 Procedure 15: LINK - Create Link to an object + + SYNOPSIS + + LINK3res NFSPROC3_LINK(LINK3args) = 15; + + struct LINK3args { + nfs_fh3 file; + diropargs3 link; + }; + + struct LINK3resok { + post_op_attr file_attributes; + wcc_data linkdir_wcc; + }; + + struct LINK3resfail { + post_op_attr file_attributes; + wcc_data linkdir_wcc; + }; + + union LINK3res switch (nfsstat3 status) { + case NFS3_OK: + + + +Callaghan, el al Informational [Page 74] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + LINK3resok resok; + default: + LINK3resfail resfail; + }; + + DESCRIPTION + + Procedure LINK creates a hard link from file to link.name, + in the directory, link.dir. file and link.dir must reside + on the same file system and server. On entry, the + arguments in LINK3args are: + + file + The file handle for the existing file system object. + + link + The location of the link to be created: + + link.dir + The file handle for the directory in which the link + is to be created. + + link.name + The name that is to be associated with the created + link. Refer to General comments on filenames on page + 17. + + On successful return, LINK3res.status is NFS3_OK and + LINK3res.resok contains: + + file_attributes + The post-operation attributes of the file system object + identified by file. + + linkdir_wcc + Weak cache consistency data for the directory, + link.dir. + + Otherwise, LINK3res.status contains the error on failure + and LINK3res.resfail contains the following: + + file_attributes + The post-operation attributes of the file system object + identified by file. + + linkdir_wcc + Weak cache consistency data for the directory, + link.dir. + + + +Callaghan, el al Informational [Page 75] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + IMPLEMENTATION + + Changes to any property of the hard-linked files are + reflected in all of the linked files. When a hard link is + made to a file, the attributes for the file should have a + value for nlink that is one greater than the value before + the LINK. + + The comments under RENAME regarding object and target + residing on the same file system apply here as well. The + comments regarding the target name applies as well. Refer + to General comments on filenames on page 30. + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_EXIST + NFS3ERR_XDEV + NFS3ERR_NOTDIR + NFS3ERR_INVAL + NFS3ERR_NOSPC + NFS3ERR_ROFS + NFS3ERR_MLINK + NFS3ERR_NAMETOOLONG + NFS3ERR_DQUOT + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + SYMLINK, RENAME and FSINFO. + +3.3.16 Procedure 16: READDIR - Read From Directory + + SYNOPSIS + + READDIR3res NFSPROC3_READDIR(READDIR3args) = 16; + + struct READDIR3args { + nfs_fh3 dir; + cookie3 cookie; + cookieverf3 cookieverf; + count3 count; + }; + + + + +Callaghan, el al Informational [Page 76] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + struct entry3 { + fileid3 fileid; + filename3 name; + cookie3 cookie; + entry3 *nextentry; + }; + + struct dirlist3 { + entry3 *entries; + bool eof; + }; + + struct READDIR3resok { + post_op_attr dir_attributes; + cookieverf3 cookieverf; + dirlist3 reply; + }; + + struct READDIR3resfail { + post_op_attr dir_attributes; + }; + + union READDIR3res switch (nfsstat3 status) { + case NFS3_OK: + READDIR3resok resok; + default: + READDIR3resfail resfail; + }; + + DESCRIPTION + + Procedure READDIR retrieves a variable number of entries, + in sequence, from a directory and returns the name and + file identifier for each, with information to allow the + client to request additional directory entries in a + subsequent READDIR request. On entry, the arguments in + READDIR3args are: + + dir + The file handle for the directory to be read. + + cookie + This should be set to 0 in the first request to read + the directory. On subsequent requests, it should be a + cookie as returned by the server. + + + + + + +Callaghan, el al Informational [Page 77] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + cookieverf + This should be set to 0 in the first request to read + the directory. On subsequent requests, it should be a + cookieverf as returned by the server. The cookieverf + must match that returned by the READDIR in which the + cookie was acquired. + + count + The maximum size of the READDIR3resok structure, in + bytes. The size must include all XDR overhead. The + server is free to return less than count bytes of + data. + + On successful return, READDIR3res.status is NFS3_OK and + READDIR3res.resok contains: + + dir_attributes + The attributes of the directory, dir. + + cookieverf + The cookie verifier. + + reply + The directory list: + + entries + Zero or more directory (entry3) entries. + + eof + TRUE if the last member of reply.entries is the last + entry in the directory or the list reply.entries is + empty and the cookie corresponded to the end of the + directory. If FALSE, there may be more entries to + read. + + Otherwise, READDIR3res.status contains the error on + failure and READDIR3res.resfail contains the following: + + dir_attributes + The attributes of the directory, dir. + + IMPLEMENTATION + + In the NFS version 2 protocol, each directory entry + returned included a cookie identifying a point in the + directory. By including this cookie in a subsequent + READDIR, the client could resume the directory read at any + point in the directory. One problem with this scheme was + + + +Callaghan, el al Informational [Page 78] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + that there was no easy way for a server to verify that a + cookie was valid. If two READDIRs were separated by one or + more operations that changed the directory in some way + (for example, reordering or compressing it), it was + possible that the second READDIR could miss entries, or + process entries more than once. If the cookie was no + longer usable, for example, pointing into the middle of a + directory entry, the server would have to either round the + cookie down to the cookie of the previous entry or round + it up to the cookie of the next entry in the directory. + Either way would possibly lead to incorrect results and + the client would be unaware that any problem existed. + + In the NFS version 3 protocol, each READDIR request + includes both a cookie and a cookie verifier. For the + first call, both are set to 0. The response includes a + new cookie verifier, with a cookie per entry. For + subsequent READDIRs, the client must present both the + cookie and the corresponding cookie verifier. If the + server detects that the cookie is no longer valid, the + server will reject the READDIR request with the status, + NFS3ERR_BAD_COOKIE. The client should be careful to + avoid holding directory entry cookies across operations + that modify the directory contents, such as REMOVE and + CREATE. + + One implementation of the cookie-verifier mechanism might + be for the server to use the modification time of the + directory. This might be overly restrictive, however. A + better approach would be to record the time of the last + directory modification that changed the directory + organization in a way that would make it impossible to + reliably interpret a cookie. Servers in which directory + cookies are always valid are free to use zero as the + verifier always. + + The server may return fewer than count bytes of + XDR-encoded entries. The count specified by the client in + the request should be greater than or equal to FSINFO + dtpref. + + Since UNIX clients give a special meaning to the fileid + value zero, UNIX clients should be careful to map zero + fileid values to some other value and servers should try + to avoid sending a zero fileid. + + + + + + +Callaghan, el al Informational [Page 79] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_NOTDIR + NFS3ERR_BAD_COOKIE + NFS3ERR_TOOSMALL + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + READDIRPLUS and FSINFO. + +3.3.17 Procedure 17: READDIRPLUS - Extended read from directory + + SYNOPSIS + + READDIRPLUS3res NFSPROC3_READDIRPLUS(READDIRPLUS3args) = 17; + + struct READDIRPLUS3args { + nfs_fh3 dir; + cookie3 cookie; + cookieverf3 cookieverf; + count3 dircount; + count3 maxcount; + }; + + struct entryplus3 { + fileid3 fileid; + filename3 name; + cookie3 cookie; + post_op_attr name_attributes; + post_op_fh3 name_handle; + entryplus3 *nextentry; + }; + + struct dirlistplus3 { + entryplus3 *entries; + bool eof; + }; + + struct READDIRPLUS3resok { + post_op_attr dir_attributes; + cookieverf3 cookieverf; + dirlistplus3 reply; + }; + + + +Callaghan, el al Informational [Page 80] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + + struct READDIRPLUS3resfail { + post_op_attr dir_attributes; + }; + + union READDIRPLUS3res switch (nfsstat3 status) { + case NFS3_OK: + READDIRPLUS3resok resok; + default: + READDIRPLUS3resfail resfail; + }; + + DESCRIPTION + + Procedure READDIRPLUS retrieves a variable number of + entries from a file system directory and returns complete + information about each along with information to allow the + client to request additional directory entries in a + subsequent READDIRPLUS. READDIRPLUS differs from READDIR + only in the amount of information returned for each + entry. In READDIR, each entry returns the filename and + the fileid. In READDIRPLUS, each entry returns the name, + the fileid, attributes (including the fileid), and file + handle. On entry, the arguments in READDIRPLUS3args are: + + dir + The file handle for the directory to be read. + + cookie + This should be set to 0 on the first request to read a + directory. On subsequent requests, it should be a + cookie as returned by the server. + + cookieverf + This should be set to 0 on the first request to read a + directory. On subsequent requests, it should be a + cookieverf as returned by the server. The cookieverf + must match that returned by the READDIRPLUS call in + which the cookie was acquired. + + dircount + The maximum number of bytes of directory information + returned. This number should not include the size of + the attributes and file handle portions of the result. + + maxcount + The maximum size of the READDIRPLUS3resok structure, in + bytes. The size must include all XDR overhead. The + + + +Callaghan, el al Informational [Page 81] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + server is free to return fewer than maxcount bytes of + data. + + On successful return, READDIRPLUS3res.status is NFS3_OK + and READDIRPLUS3res.resok contains: + + dir_attributes + The attributes of the directory, dir. + + cookieverf + The cookie verifier. + + reply + The directory list: + + entries + Zero or more directory (entryplus3) entries. + + eof + TRUE if the last member of reply.entries is the last + entry in the directory or the list reply.entries is + empty and the cookie corresponded to the end of the + directory. If FALSE, there may be more entries to + read. + + Otherwise, READDIRPLUS3res.status contains the error on + failure and READDIRPLUS3res.resfail contains the following: + + dir_attributes + The attributes of the directory, dir. + + IMPLEMENTATION + + Issues that need to be understood for this procedure + include increased cache flushing activity on the client + (as new file handles are returned with names which are + entered into caches) and over-the-wire overhead versus + expected subsequent LOOKUP elimination. It is thought that + this procedure may improve performance for directory + browsing where attributes are always required as on the + Apple Macintosh operating system and for MS-DOS. + + The dircount and maxcount fields are included as an + optimization. Consider a READDIRPLUS call on a UNIX + operating system implementation for 1048 bytes; the reply + does not contain many entries because of the overhead due + to attributes and file handles. An alternative is to issue + a READDIRPLUS call for 8192 bytes and then only use the + + + +Callaghan, el al Informational [Page 82] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + first 1048 bytes of directory information. However, the + server doesn't know that all that is needed is 1048 bytes + of directory information (as would be returned by + READDIR). It sees the 8192 byte request and issues a + VOP_READDIR for 8192 bytes. It then steps through all of + those directory entries, obtaining attributes and file + handles for each entry. When it encodes the result, the + server only encodes until it gets 8192 bytes of results + which include the attributes and file handles. Thus, it + has done a larger VOP_READDIR and many more attribute + fetches than it needed to. The ratio of the directory + entry size to the size of the attributes plus the size of + the file handle is usually at least 8 to 1. The server has + done much more work than it needed to. + + The solution to this problem is for the client to provide + two counts to the server. The first is the number of bytes + of directory information that the client really wants, + dircount. The second is the maximum number of bytes in + the result, including the attributes and file handles, + maxcount. Thus, the server will issue a VOP_READDIR for + only the number of bytes that the client really wants to + get, not an inflated number. This should help to reduce + the size of VOP_READDIR requests on the server, thus + reducing the amount of work done there, and to reduce the + number of VOP_LOOKUP, VOP_GETATTR, and other calls done by + the server to construct attributes and file handles. + + ERRORS + + NFS3ERR_IO + NFS3ERR_ACCES + NFS3ERR_NOTDIR + NFS3ERR_BAD_COOKIE + NFS3ERR_TOOSMALL + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_NOTSUPP + NFS3ERR_SERVERFAULT + + SEE ALSO + + READDIR. + + + + + + + + +Callaghan, el al Informational [Page 83] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +3.3.18 Procedure 18: FSSTAT - Get dynamic file system information + + SYNOPSIS + + FSSTAT3res NFSPROC3_FSSTAT(FSSTAT3args) = 18; + + struct FSSTAT3args { + nfs_fh3 fsroot; + }; + + struct FSSTAT3resok { + post_op_attr obj_attributes; + size3 tbytes; + size3 fbytes; + size3 abytes; + size3 tfiles; + size3 ffiles; + size3 afiles; + uint32 invarsec; + }; + + struct FSSTAT3resfail { + post_op_attr obj_attributes; + }; + + union FSSTAT3res switch (nfsstat3 status) { + case NFS3_OK: + FSSTAT3resok resok; + default: + FSSTAT3resfail resfail; + }; + + DESCRIPTION + + Procedure FSSTAT retrieves volatile file system state + information. On entry, the arguments in FSSTAT3args are: + + fsroot + A file handle identifying a object in the file system. + This is normally a file handle for a mount point for a + file system, as originally obtained from the MOUNT + service on the server. + + On successful return, FSSTAT3res.status is NFS3_OK and + FSSTAT3res.resok contains: + + + + + + +Callaghan, el al Informational [Page 84] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + obj_attributes + The attributes of the file system object specified in + fsroot. + + tbytes + The total size, in bytes, of the file system. + + fbytes + The amount of free space, in bytes, in the file + system. + + abytes + The amount of free space, in bytes, available to the + user identified by the authentication information in + the RPC. (This reflects space that is reserved by the + file system; it does not reflect any quota system + implemented by the server.) + + tfiles + The total number of file slots in the file system. (On + a UNIX server, this often corresponds to the number of + inodes configured.) + + ffiles + The number of free file slots in the file system. + + afiles + The number of free file slots that are available to the + user corresponding to the authentication information in + the RPC. (This reflects slots that are reserved by the + file system; it does not reflect any quota system + implemented by the server.) + + invarsec + A measure of file system volatility: this is the number + of seconds for which the file system is not expected to + change. For a volatile, frequently updated file system, + this will be 0. For an immutable file system, such as a + CD-ROM, this would be the largest unsigned integer. For + file systems that are infrequently modified, for + example, one containing local executable programs and + on-line documentation, a value corresponding to a few + hours or days might be used. The client may use this as + a hint in tuning its cache management. Note however, + this measure is assumed to be dynamic and may change at + any time. + + + + + +Callaghan, el al Informational [Page 85] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + Otherwise, FSSTAT3res.status contains the error on failure + and FSSTAT3res.resfail contains the following: + + obj_attributes + The attributes of the file system object specified in + fsroot. + + IMPLEMENTATION + + Not all implementations can support the entire list of + attributes. It is expected that servers will make a best + effort at supporting all the attributes. + + ERRORS + + NFS3ERR_IO + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + FSINFO. + +3.3.19 Procedure 19: FSINFO - Get static file system Information + + SYNOPSIS + + FSINFO3res NFSPROC3_FSINFO(FSINFO3args) = 19; + + const FSF3_LINK = 0x0001; + const FSF3_SYMLINK = 0x0002; + const FSF3_HOMOGENEOUS = 0x0008; + const FSF3_CANSETTIME = 0x0010; + + struct FSINFOargs { + nfs_fh3 fsroot; + }; + + struct FSINFO3resok { + post_op_attr obj_attributes; + uint32 rtmax; + uint32 rtpref; + uint32 rtmult; + uint32 wtmax; + uint32 wtpref; + uint32 wtmult; + uint32 dtpref; + + + +Callaghan, el al Informational [Page 86] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + size3 maxfilesize; + nfstime3 time_delta; + uint32 properties; + }; + + struct FSINFO3resfail { + post_op_attr obj_attributes; + }; + + union FSINFO3res switch (nfsstat3 status) { + case NFS3_OK: + FSINFO3resok resok; + default: + FSINFO3resfail resfail; + }; + + DESCRIPTION + + Procedure FSINFO retrieves nonvolatile file system state + information and general information about the NFS version + 3 protocol server implementation. On entry, the arguments + in FSINFO3args are: + + fsroot + A file handle identifying a file object. Normal usage + is to provide a file handle for a mount point for a + file system, as originally obtained from the MOUNT + service on the server. + + On successful return, FSINFO3res.status is NFS3_OK and + FSINFO3res.resok contains: + + obj_attributes + The attributes of the file system object specified in + fsroot. + + rtmax + The maximum size in bytes of a READ request supported + by the server. Any READ with a number greater than + rtmax will result in a short read of rtmax bytes or + less. + + rtpref + The preferred size of a READ request. This should be + the same as rtmax unless there is a clear benefit in + performance or efficiency. + + + + + +Callaghan, el al Informational [Page 87] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + rtmult + The suggested multiple for the size of a READ request. + + wtmax + The maximum size of a WRITE request supported by the + server. In general, the client is limited by wtmax + since there is no guarantee that a server can handle a + larger write. Any WRITE with a count greater than wtmax + will result in a short write of at most wtmax bytes. + + wtpref + The preferred size of a WRITE request. This should be + the same as wtmax unless there is a clear benefit in + performance or efficiency. + + wtmult + The suggested multiple for the size of a WRITE + request. + + dtpref + The preferred size of a READDIR request. + + maxfilesize + The maximum size of a file on the file system. + + time_delta + The server time granularity. When setting a file time + using SETATTR, the server guarantees only to preserve + times to this accuracy. If this is {0, 1}, the server + can support nanosecond times, {0, 1000000} denotes + millisecond precision, and {1, 0} indicates that times + are accurate only to the nearest second. + + properties + A bit mask of file system properties. The following + values are defined: + + FSF_LINK + If this bit is 1 (TRUE), the file system supports + hard links. + + FSF_SYMLINK + If this bit is 1 (TRUE), the file system supports + symbolic links. + + FSF_HOMOGENEOUS + If this bit is 1 (TRUE), the information returned by + PATHCONF is identical for every file and directory + + + +Callaghan, el al Informational [Page 88] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + in the file system. If it is 0 (FALSE), the client + should retrieve PATHCONF information for each file + and directory as required. + + FSF_CANSETTIME + If this bit is 1 (TRUE), the server will set the + times for a file via SETATTR if requested (to the + accuracy indicated by time_delta). If it is 0 + (FALSE), the server cannot set times as requested. + + Otherwise, FSINFO3res.status contains the error on failure + and FSINFO3res.resfail contains the following: + + attributes + The attributes of the file system object specified in + fsroot. + + IMPLEMENTATION + + Not all implementations can support the entire list of + attributes. It is expected that a server will make a best + effort at supporting all the attributes. + + The file handle provided is expected to be the file handle + of the file system root, as returned to the MOUNT + operation. Since mounts may occur anywhere within an + exported tree, the server should expect FSINFO requests + specifying file handles within the exported file system. + A server may export different types of file systems with + different attributes returned to the FSINFO call. The + client should retrieve FSINFO information for each mount + completed. Though a server may return different FSINFO + information for different files within a file system, + there is no requirement that a client obtain FSINFO + information for other than the file handle returned at + mount. + + The maxfilesize field determines whether a server's + particular file system uses 32 bit sizes and offsets or 64 + bit file sizes and offsets. This may affect a client's + processing. + + The preferred sizes for requests are nominally tied to an + exported file system mounted by a client. A surmountable + issue arises in that the transfer size for an NFS version + 3 protocol request is not only dependent on + characteristics of the file system but also on + characteristics of the network interface, particularly the + + + +Callaghan, el al Informational [Page 89] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + maximum transfer unit (MTU). A server implementation can + advertise different transfer sizes (for the fields, rtmax, + rtpref, wtmax, wtpref, and dtpref) depending on the + interface on which the FSINFO request is received. This is + an implementation issue. + + ERRORS + + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + READLINK, WRITE, READDIR, FSSTAT and PATHCONF. + +3.3.20 Procedure 20: PATHCONF - Retrieve POSIX information + + SYNOPSIS + + PATHCONF3res NFSPROC3_PATHCONF(PATHCONF3args) = 20; + + struct PATHCONF3args { + nfs_fh3 object; + }; + + struct PATHCONF3resok { + post_op_attr obj_attributes; + uint32 linkmax; + uint32 name_max; + bool no_trunc; + bool chown_restricted; + bool case_insensitive; + bool case_preserving; + }; + + struct PATHCONF3resfail { + post_op_attr obj_attributes; + }; + + union PATHCONF3res switch (nfsstat3 status) { + case NFS3_OK: + PATHCONF3resok resok; + default: + PATHCONF3resfail resfail; + }; + + + + + +Callaghan, el al Informational [Page 90] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + DESCRIPTION + + Procedure PATHCONF retrieves the pathconf information for + a file or directory. If the FSF_HOMOGENEOUS bit is set in + FSFINFO3resok.properties, the pathconf information will be + the same for all files and directories in the exported + file system in which this file or directory resides. On + entry, the arguments in PATHCONF3args are: + + object + The file handle for the file system object. + + On successful return, PATHCONF3res.status is NFS3_OK and + PATHCONF3res.resok contains: + + obj_attributes + The attributes of the object specified by object. + + linkmax + The maximum number of hard links to an object. + + name_max + The maximum length of a component of a filename. + + no_trunc + If TRUE, the server will reject any request that + includes a name longer than name_max with the error, + NFS3ERR_NAMETOOLONG. If FALSE, any length name over + name_max bytes will be silently truncated to name_max + bytes. + + chown_restricted + If TRUE, the server will reject any request to change + either the owner or the group associated with a file if + the caller is not the privileged user. (Uid 0.) + + case_insensitive + If TRUE, the server file system does not distinguish + case when interpreting filenames. + + case_preserving + If TRUE, the server file system will preserve the case + of a name during a CREATE, MKDIR, MKNOD, SYMLINK, + RENAME, or LINK operation. + + Otherwise, PATHCONF3res.status contains the error on + failure and PATHCONF3res.resfail contains the following: + + + + +Callaghan, el al Informational [Page 91] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + obj_attributes + The attributes of the object specified by object. + + IMPLEMENTATION + + In some implementations of the NFS version 2 protocol, + pathconf information was obtained at mount time through + the MOUNT protocol. The proper place to obtain it, is as + here, in the NFS version 3 protocol itself. + + ERRORS + + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD, RENAME, LINK and FSINFO. + +3.3.21 Procedure 21: COMMIT - Commit cached data on a server to stable + storage + + SYNOPSIS + + COMMIT3res NFSPROC3_COMMIT(COMMIT3args) = 21; + + struct COMMIT3args { + nfs_fh3 file; + offset3 offset; + count3 count; + }; + + struct COMMIT3resok { + wcc_data file_wcc; + writeverf3 verf; + }; + + struct COMMIT3resfail { + wcc_data file_wcc; + }; + + union COMMIT3res switch (nfsstat3 status) { + case NFS3_OK: + COMMIT3resok resok; + default: + COMMIT3resfail resfail; + }; + + + +Callaghan, el al Informational [Page 92] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + + DESCRIPTION + + Procedure COMMIT forces or flushes data to stable storage + that was previously written with a WRITE procedure call + with the stable field set to UNSTABLE. On entry, the + arguments in COMMIT3args are: + + file + The file handle for the file to which data is to be + flushed (committed). This must identify a file system + object of type, NF3REG. + + offset + The position within the file at which the flush is to + begin. An offset of 0 means to flush data starting at + the beginning of the file. + + count + The number of bytes of data to flush. If count is 0, a + flush from offset to the end of file is done. + + On successful return, COMMIT3res.status is NFS3_OK and + COMMIT3res.resok contains: + + file_wcc + Weak cache consistency data for the file. For a client + that requires only the post-operation file attributes, + these can be found in file_wcc.after. + + verf + This is a cookie that the client can use to determine + whether the server has rebooted between a call to WRITE + and a subsequent call to COMMIT. This cookie must be + consistent during a single boot session and must be + unique between instances of the NFS version 3 protocol + server where uncommitted data may be lost. + + Otherwise, COMMIT3res.status contains the error on failure + and COMMIT3res.resfail contains the following: + + file_wcc + Weak cache consistency data for the file. For a client + that requires only the post-write file attributes, + these can be found in file_wcc.after. Even though the + COMMIT failed, full wcc_data is returned to allow the + client to determine whether the file changed on the + server between calls to WRITE and COMMIT. + + + +Callaghan, el al Informational [Page 93] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + IMPLEMENTATION + + Procedure COMMIT is similar in operation and semantics to + the POSIX fsync(2) system call that synchronizes a file's + state with the disk, that is it flushes the file's data + and metadata to disk. COMMIT performs the same operation + for a client, flushing any unsynchronized data and + metadata on the server to the server's disk for the + specified file. Like fsync(2), it may be that there is + some modified data or no modified data to synchronize. The + data may have been synchronized by the server's normal + periodic buffer synchronization activity. COMMIT will + always return NFS3_OK, unless there has been an unexpected + error. + + COMMIT differs from fsync(2) in that it is possible for + the client to flush a range of the file (most likely + triggered by a buffer-reclamation scheme on the client + before file has been completely written). + + The server implementation of COMMIT is reasonably simple. + If the server receives a full file COMMIT request, that is + starting at offset 0 and count 0, it should do the + equivalent of fsync()'ing the file. Otherwise, it should + arrange to have the cached data in the range specified by + offset and count to be flushed to stable storage. In both + cases, any metadata associated with the file must be + flushed to stable storage before returning. It is not an + error for there to be nothing to flush on the server. + This means that the data and metadata that needed to be + flushed have already been flushed or lost during the last + server failure. + + The client implementation of COMMIT is a little more + complex. There are two reasons for wanting to commit a + client buffer to stable storage. The first is that the + client wants to reuse a buffer. In this case, the offset + and count of the buffer are sent to the server in the + COMMIT request. The server then flushes any cached data + based on the offset and count, and flushes any metadata + associated with the file. It then returns the status of + the flush and the verf verifier. The other reason for the + client to generate a COMMIT is for a full file flush, such + as may be done at close. In this case, the client would + gather all of the buffers for this file that contain + uncommitted data, do the COMMIT operation with an offset + of 0 and count of 0, and then free all of those buffers. + Any other dirty buffers would be sent to the server in the + + + +Callaghan, el al Informational [Page 94] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + normal fashion. + + This implementation will require some modifications to the + buffer cache on the client. After a buffer is written with + stable UNSTABLE, it must be considered as dirty by the + client system until it is either flushed via a COMMIT + operation or written via a WRITE operation with stable set + to FILE_SYNC or DATA_SYNC. This is done to prevent the + buffer from being freed and reused before the data can be + flushed to stable storage on the server. + + When a response comes back from either a WRITE or a COMMIT + operation that contains an unexpected verf, the client + will need to retransmit all of the buffers containing + uncommitted cached data to the server. How this is to be + done is up to the implementor. If there is only one buffer + of interest, then it should probably be sent back over in + a WRITE request with the appropriate stable flag. If there + more than one, it might be worthwhile retransmitting all + of the buffers in WRITE requests with stable set to + UNSTABLE and then retransmitting the COMMIT operation to + flush all of the data on the server to stable storage. The + timing of these retransmissions is left to the + implementor. + + The above description applies to page-cache-based systems + as well as buffer-cache-based systems. In those systems, + the virtual memory system will need to be modified instead + of the buffer cache. + + See additional comments on WRITE on page 49. + + ERRORS + + NFS3ERR_IO + NFS3ERR_STALE + NFS3ERR_BADHANDLE + NFS3ERR_SERVERFAULT + + SEE ALSO + + WRITE. + + + + + + + + + +Callaghan, el al Informational [Page 95] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +4. Implementation issues + + The NFS version 3 protocol was designed to allow different + operating systems to share files. However, since it was + designed in a UNIX environment, many operations have + semantics similar to the operations of the UNIX file system. + This section discusses some of the general + implementation-specific details and semantic issues. + Procedure descriptions have implementation comments specific + to that procedure. + + A number of papers have been written describing issues + encountered when constructing an NFS version 2 protocol + implementation. The best overview paper is still [Sandberg]. + [Israel], [Macklem], and [Pawlowski] describe other + implementations. [X/OpenNFS] provides a complete description + of the NFS version 2 protocol and supporting protocols, as + well as a discussion on implementation issues and procedure + and error semantics. Many of the issues encountered when + constructing an NFS version 2 protocol implementation will be + encountered when constructing an NFS version 3 protocol + implementation. + +4.1 Multiple version support + + The RPC protocol provides explicit support for versioning of + a service. Client and server implementations of NFS version 3 + protocol should support both versions, for full backwards + compatibility, when possible. Default behavior of the RPC + binding protocol is the client and server bind using the + highest version number they both support. Client or server + implementations that cannot easily support both versions (for + example, because of memory restrictions) will have to choose + what version to support. The NFS version 2 protocol would be + a safe choice since fully capable clients and servers should + support both versions. However, this choice would need to be + made keeping all requirements in mind. + +4.2 Server/client relationship + + The NFS version 3 protocol is designed to allow servers to be + as simple and general as possible. Sometimes the simplicity + of the server can be a problem, if the client implements + complicated file system semantics. + + For example, some operating systems allow removal of open + files. A process can open a file and, while it is open, + remove it from the directory. The file can be read and + + + +Callaghan, el al Informational [Page 96] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + written as long as the process keeps it open, even though the + file has no name in the file system. It is impossible for a + stateless server to implement these semantics. The client + can do some tricks such as renaming the file on remove (to a + hidden name), and only physically deleting it on close. The + NFS version 3 protocol provides sufficient functionality to + implement most file system semantics on a client. + + Every NFS version 3 protocol client can also potentially be a + server, and remote and local mounted file systems can be + freely mixed. This leads to some problems when a client + travels down the directory tree of a remote file system and + reaches the mount point on the server for another remote file + system. Allowing the server to follow the second remote mount + would require loop detection, server lookup, and user + revalidation. Instead, both NFS version 2 protocol and NFS + version 3 protocol implementations do not typically let + clients cross a server's mount point. When a client does a + LOOKUP on a directory on which the server has mounted a file + system, the client sees the underlying directory instead of + the mounted directory. + + For example, if a server has a file system called /usr and + mounts another file system on /usr/src, if a client mounts + /usr, it does not see the mounted version of /usr/src. A + client could do remote mounts that match the server's mount + points to maintain the server's view. In this example, the + client would also have to mount /usr/src in addition to /usr, + even if they are from the same server. + +4.3 Path name interpretation + + There are a few complications to the rule that path names are + always parsed on the client. For example, symbolic links + could have different interpretations on different clients. + There is no answer to this problem in this specification. + + Another common problem for non-UNIX implementations is the + special interpretation of the pathname, "..", to mean the + parent of a given directory. A future revision of the + protocol may use an explicit flag to indicate the parent + instead - however it is not a problem as many working + non-UNIX implementations exist. + + + + + + + + +Callaghan, el al Informational [Page 97] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +4.4 Permission issues + + The NFS version 3 protocol, strictly speaking, does not + define the permission checking used by servers. However, it + is expected that a server will do normal operating system + permission checking using AUTH_UNIX style authentication as + the basis of its protection mechanism, or another stronger + form of authentication such as AUTH_DES or AUTH_KERB. With + AUTH_UNIX authentication, the server gets the client's + effective uid, effective gid, and groups on each call and + uses them to check permission. These are the so-called UNIX + credentials. AUTH_DES and AUTH_KERB use a network name, or + netname, as the basis for identification (from which a UNIX + server derives the necessary standard UNIX credentials). + There are problems with this method that have been solved. + + Using uid and gid implies that the client and server share + the same uid list. Every server and client pair must have the + same mapping from user to uid and from group to gid. Since + every client can also be a server, this tends to imply that + the whole network shares the same uid/gid space. If this is + not the case, then it usually falls upon the server to + perform some custom mapping of credentials from one + authentication domain into another. A discussion of + techniques for managing a shared user space or for providing + mechanisms for user ID mapping is beyond the scope of this + specification. + + Another problem arises due to the usually stateful open + operation. Most operating systems check permission at open + time, and then check that the file is open on each read and + write request. With stateless servers, the server cannot + detect that the file is open and must do permission checking + on each read and write call. UNIX client semantics of access + permission checking on open can be provided with the ACCESS + procedure call in this revision, which allows a client to + explicitly check access permissions without resorting to + trying the operation. On a local file system, a user can open + a file and then change the permissions so that no one is + allowed to touch it, but will still be able to write to the + file because it is open. On a remote file system, by + contrast, the write would fail. To get around this problem, + the server's permission checking algorithm should allow the + owner of a file to access it regardless of the permission + setting. This is needed in a practical NFS version 3 protocol + server implementation, but it does depart from correct local + file system semantics. This should not affect the return + result of access permissions as returned by the ACCESS + + + +Callaghan, el al Informational [Page 98] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + procedure, however. + + A similar problem has to do with paging in an executable + program over the network. The operating system usually checks + for execute permission before opening a file for demand + paging, and then reads blocks from the open file. In a local + UNIX file system, an executable file does not need read + permission to execute (pagein). An NFS version 3 protocol + server can not tell the difference between a normal file read + (where the read permission bit is meaningful) and a demand + pagein read (where the server should allow access to the + executable file if the execute bit is set for that user or + group or public). To make this work, the server allows + reading of files if the uid given in the call has either + execute or read permission on the file, through ownership, + group membership or public access. Again, this departs from + correct local file system semantics. + + In most operating systems, a particular user (on UNIX, the + uid 0) has access to all files, no matter what permission and + ownership they have. This superuser permission may not be + allowed on the server, since anyone who can become superuser + on their client could gain access to all remote files. A UNIX + server by default maps uid 0 to a distinguished value + (UID_NOBODY), as well as mapping the groups list, before + doing its access checking. A server implementation may + provide a mechanism to change this mapping. This works except + for NFS version 3 protocol root file systems (required for + diskless NFS version 3 protocol client support), where + superuser access cannot be avoided. Export options are used, + on the server, to restrict the set of clients allowed + superuser access. + +4.5 Duplicate request cache + + The typical NFS version 3 protocol failure recovery model + uses client time-out and retry to handle server crashes, + network partitions, and lost server replies. A retried + request is called a duplicate of the original. + + When used in a file server context, the term idempotent can + be used to distinguish between operation types. An idempotent + request is one that a server can perform more than once with + equivalent results (though it may in fact change, as a side + effect, the access time on a file, say for READ). Some NFS + operations are obviously non-idempotent. They cannot be + reprocessed without special attention simply because they may + fail if tried a second time. The CREATE request, for example, + + + +Callaghan, el al Informational [Page 99] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + can be used to create a file for which the owner does not + have write permission. A duplicate of this request cannot + succeed if the original succeeded. Likewise, a file can be + removed only once. + + The side effects caused by performing a duplicate + non-idempotent request can be destructive (for example, a + truncate operation causing lost writes). The combination of a + stateless design with the common choice of an unreliable + network transport (UDP) implies the possibility of + destructive replays of non-idempotent requests. Though to be + more accurate, it is the inherent stateless design of the NFS + version 3 protocol on top of an unreliable RPC mechanism that + yields the possibility of destructive replays of + non-idempotent requests, since even in an implementation of + the NFS version 3 protocol over a reliable + connection-oriented transport, a connection break with + automatic reestablishment requires duplicate request + processing (the client will retransmit the request, and the + server needs to deal with a potential duplicate + non-idempotent request). + + Most NFS version 3 protocol server implementations use a + cache of recent requests (called the duplicate request cache) + for the processing of duplicate non-idempotent requests. The + duplicate request cache provides a short-term memory + mechanism in which the original completion status of a + request is remembered and the operation attempted only once. + If a duplicate copy of this request is received, then the + original completion status is returned. + + The duplicate-request cache mechanism has been useful in + reducing destructive side effects caused by duplicate NFS + version 3 protocol requests. This mechanism, however, does + not guarantee against these destructive side effects in all + failure modes. Most servers store the duplicate request cache + in RAM, so the contents are lost if the server crashes. The + exception to this may possibly occur in a redundant server + approach to high availability, where the file system itself + may be used to share the duplicate request cache state. Even + if the cache survives server reboots (or failovers in the + high availability case), its effectiveness is a function of + its size. A network partition can cause a cache entry to be + reused before a client receives a reply for the corresponding + request. If this happens, the duplicate request will be + processed as a new one, possibly with destructive side + effects. + + + + +Callaghan, el al Informational [Page 100] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + A good description of the implementation and use of a + duplicate request cache can be found in [Juszczak]. + +4.6 File name component handling + + Server implementations of NFS version 3 protocol will + frequently impose restrictions on the names which can be + created. Many servers will also forbid the use of names that + contain certain characters, such as the path component + separator used by the server operating system. For example, + the UFS file system will reject a name which contains "/", + while "." and ".." are distinguished in UFS, and may not be + specified as the name when creating a file system object. + The exact error status values return for these errors is + specified in the description of each procedure argument. The + values (which conform to NFS version 2 protocol server + practice) are not necessarily obvious, nor are they + consistent from one procedure to the next. + +4.7 Synchronous modifying operations + + Data-modifying operations in the NFS version 3 protocol are + synchronous. When a procedure returns to the client, the + client can assume that the operation has completed and any + data associated with the request is now on stable storage. + +4.8 Stable storage + + NFS version 3 protocol servers must be able to recover + without data loss from multiple power failures (including + cascading power failures, that is, several power failures in + quick succession), operating system failures, and hardware + failure of components other than the storage medium itself + (for example, disk, nonvolatile RAM). + + Some examples of stable storage that are allowable for an NFS + server include: + + 1. Media commit of data, that is, the modified data has + been successfully written to the disk media, for example, + the disk platter. + + 2. An immediate reply disk drive with battery-backed + on-drive intermediate storage or uninterruptible power + system (UPS). + + 3. Server commit of data with battery-backed intermediate + storage and recovery software. + + + +Callaghan, el al Informational [Page 101] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + 4. Cache commit with uninterruptible power system (UPS) and + recovery software. + + Conversely, the following are not examples of stable + storage: + + 1. An immediate reply disk drive without battery-backed + on-drive intermediate storage or uninterruptible power + system (UPS). + + 2. Cache commit without both uninterruptible power system + (UPS) and recovery software. + + The only exception to this (introduced in this protocol + revision) is as described under the WRITE procedure on the + handling of the stable bit, and the use of the COMMIT + procedure. It is the use of the synchronous COMMIT procedure + that provides the necessary semantic support in the NFS + version 3 protocol. + +4.9 Lookups and name resolution + + A common objection to the NFS version 3 protocol is the + philosophy of component-by-component LOOKUP by the client in + resolving a name. The objection is that this is inefficient, + as latencies for component-by-component LOOKUP would be + unbearable. + + Implementation practice solves this issue. A name cache, + providing component to file-handle mapping, is kept on the + client to short circuit actual LOOKUP invocations over the + wire. The cache is subject to cache timeout parameters that + bound attributes. + +4.10 Adaptive retransmission + + Most client implementations use either an exponential + back-off strategy to some maximum retransmission value, or a + more adaptive strategy that attempts congestion avoidance. + Congestion avoidance schemes in NFS request retransmission + are modelled on the work presented in [Jacobson]. [Nowicki] + and [Macklem] describe congestion avoidance schemes to be + applied to the NFS protocol over UDP. + +4.11 Caching policies + + The NFS version 3 protocol does not define a policy for + caching on the client or server. In particular, there is no + + + +Callaghan, el al Informational [Page 102] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + support for strict cache consistency between a client and + server, nor between different clients. See [Kazar] for a + discussion of the issues of cache synchronization and + mechanisms in several distributed file systems. + +4.12 Stable versus unstable writes + + The setting of the stable field in the WRITE arguments, that + is whether or not to do asynchronous WRITE requests, is + straightforward on a UNIX client. If the NFS version 3 + protocol client receives a write request that is not marked + as being asynchronous, it should generate the RPC with stable + set to TRUE. If the request is marked as being asynchronous, + the RPC should be generated with stable set to FALSE. If the + response comes back with the committed field set to TRUE, the + client should just mark the write request as done and no + further action is required. If committed is set to FALSE, + indicating that the buffer was not synchronized with the + server's disk, the client will need to mark the buffer in + some way which indicates that a copy of the buffer lives on + the server and that a new copy does not need to be sent to + the server, but that a commit is required. + + Note that this algorithm introduces a new state for buffers, + thus there are now three states for buffers. The three states + are dirty, done but needs to be committed, and done. This + extra state on the client will likely require modifications + to the system outside of the NFS version 3 protocol client. + + One proposal that was rejected was the addition of a boolean + commit argument to the WRITE operation. It would be used to + indicate whether the server should do a full file commit + after doing the write. This seems as if it could be useful if + the client knew that it was doing the last write on the file. + It is difficult to see how this could be used, given existing + client architectures though. + + The asynchronous write opens up the window of problems + associated with write sharing. For example: client A writes + some data asynchronously. Client A is still holding the + buffers cached, waiting to commit them later. Client B reads + the modified data and writes it back to the server. The + server then crashes. When it comes back up, client A issues a + COMMIT operation which returns with a different cookie as + well as changed attributes. In this case, the correct action + may or may not be to retransmit the cached buffers. + Unfortunately, client A can't tell for sure, so it will need + to retransmit the buffers, thus overwriting the changes from + + + +Callaghan, el al Informational [Page 103] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + client B. Fortunately, write sharing is rare and the + solution matches the current write sharing situation. Without + using locking for synchronization, the behaviour will be + indeterminate. + + In a high availability (redundant system) server + implementation, two cases exist which relate to the verf + changing. If the high availability server implementation + does not use a shared-memory scheme, then the verf should + change on failover, since the unsynchronized data is not + available to the second processor and there is no guarantee + that the system which had the data cached was able to flush + it to stable storage before going down. The client will need + to retransmit the data to be safe. In a shared-memory high + availability server implementation, the verf would not need + to change because the server would still have the cached data + available to it to be flushed. The exact policy regarding the + verf in a shared memory high availability implementation, + however, is up to the server implementor. + +4.13 32 bit clients/servers and 64 bit clients/servers + + The 64 bit nature of the NFS version 3 protocol introduces + several compatibility problems. The most notable two are + mismatched clients and servers, that is, a 32 bit client and + a 64 bit server or a 64 bit client and a 32 bit server. + + The problems of a 64 bit client and a 32 bit server are easy + to handle. The client will never encounter a file that it can + not handle. If it sends a request to the server that the + server can not handle, the server should reject the request + with an appropriate error. + + The problems of a 32 bit client and a 64 bit server are much + harder to handle. In this situation, the server does not have + a problem because it can handle anything that the client can + generate. However, the client may encounter a file that it + can not handle. The client will not be able to handle a file + whose size can not be expressed in 32 bits. Thus, the client + will not be able to properly decode the size of the file into + its local attributes structure. Also, a file can grow beyond + the limit of the client while the client is accessing the + file. + + The solutions to these problems are left up to the individual + implementor. However, there are two common approaches used to + resolve this situation. The implementor can choose between + them or even can invent a new solution altogether. + + + +Callaghan, el al Informational [Page 104] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + The most common solution is for the client to deny access to + any file whose size can not be expressed in 32 bits. This is + probably the safest, but does introduce some strange + semantics when the file grows beyond the limit of the client + while it is being access by that client. The file becomes + inaccessible even while it is being accessed. + + The second solution is for the client to map any size greater + than it can handle to the maximum size that it can handle. + Effectively, it is lying to the application program. This + allows the application access as much of the file as possible + given the 32 bit offset restriction. This eliminates the + strange semantic of the file effectively disappearing after + it has been accessed, but does introduce other problems. The + client will not be able to access the entire file. + + Currently, the first solution is the recommended solution. + However, client implementors are encouraged to do the best + that they can to reduce the effects of this situation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 105] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.0 Appendix I: Mount protocol + + The changes from the NFS version 2 protocol to the NFS version 3 + protocol have required some changes to be made in the MOUNT + protocol. To meet the needs of the NFS version 3 protocol, a + new version of the MOUNT protocol has been defined. This new + protocol satisfies the requirements of the NFS version 3 + protocol and addresses several other current market + requirements. + +5.1 RPC Information + +5.1.1 Authentication + + The MOUNT service uses AUTH_NONE in the NULL procedure. + AUTH_UNIX, AUTH_SHORT, AUTH_DES, or AUTH_KERB are used for all + other procedures. Other authentication types may be supported + in the future. + +5.1.2 Constants + + These are the RPC constants needed to call the MOUNT service. + They are given in decimal. + + PROGRAM 100005 + VERSION 3 + +5.1.3 Transport address + + The MOUNT service is normally supported over the TCP and UDP + protocols. The rpcbind daemon should be queried for the correct + transport address. + +5.1.4 Sizes + + const MNTPATHLEN = 1024; /* Maximum bytes in a path name */ + const MNTNAMLEN = 255; /* Maximum bytes in a name */ + const FHSIZE3 = 64; /* Maximum bytes in a V3 file handle */ + +5.1.5 Basic Data Types + + typedef opaque fhandle3<FHSIZE3>; + typedef string dirpath<MNTPATHLEN>; + typedef string name<MNTNAMLEN>; + + + + + + + +Callaghan, el al Informational [Page 106] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + enum mountstat3 { + MNT3_OK = 0, /* no error */ + MNT3ERR_PERM = 1, /* Not owner */ + MNT3ERR_NOENT = 2, /* No such file or directory */ + MNT3ERR_IO = 5, /* I/O error */ + MNT3ERR_ACCES = 13, /* Permission denied */ + MNT3ERR_NOTDIR = 20, /* Not a directory */ + MNT3ERR_INVAL = 22, /* Invalid argument */ + MNT3ERR_NAMETOOLONG = 63, /* Filename too long */ + MNT3ERR_NOTSUPP = 10004, /* Operation not supported */ + MNT3ERR_SERVERFAULT = 10006 /* A failure on the server */ + }; + +5.2 Server Procedures + + The following sections define the RPC procedures supplied by a + MOUNT version 3 protocol server. The RPC procedure number is + given at the top of the page with the name and version. The + SYNOPSIS provides the name of the procedure, the list of the + names of the arguments, the list of the names of the results, + followed by the XDR argument declarations and results + declarations. The information in the SYNOPSIS is specified in + RPC Data Description Language as defined in [RFC1014]. The + DESCRIPTION section tells what the procedure is expected to do + and how its arguments and results are used. The ERRORS section + lists the errors returned for specific types of failures. The + IMPLEMENTATION field describes how the procedure is expected to + work and how it should be used by clients. + + program MOUNT_PROGRAM { + version MOUNT_V3 { + void MOUNTPROC3_NULL(void) = 0; + mountres3 MOUNTPROC3_MNT(dirpath) = 1; + mountlist MOUNTPROC3_DUMP(void) = 2; + void MOUNTPROC3_UMNT(dirpath) = 3; + void MOUNTPROC3_UMNTALL(void) = 4; + exports MOUNTPROC3_EXPORT(void) = 5; + } = 3; + } = 100005; + + + + + + + + + + + + +Callaghan, el al Informational [Page 107] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.2.0 Procedure 0: Null - Do nothing + + SYNOPSIS + + void MOUNTPROC3_NULL(void) = 0; + + DESCRIPTION + + Procedure NULL does not do any work. It is made available + to allow server response testing and timing. + + IMPLEMENTATION + + It is important that this procedure do no work at all so + that it can be used to measure the overhead of processing + a service request. By convention, the NULL procedure + should never require any authentication. A server may + choose to ignore this convention, in a more secure + implementation, where responding to the NULL procedure + call acknowledges the existence of a resource to an + unauthenticated client. + + ERRORS + + Since the NULL procedure takes no MOUNT protocol arguments + and returns no MOUNT protocol response, it can not return + a MOUNT protocol error. However, it is possible that some + server implementations may return RPC errors based on + security and authentication requirements. + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 108] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.2.1 Procedure 1: MNT - Add mount entry + + SYNOPSIS + + mountres3 MOUNTPROC3_MNT(dirpath) = 1; + + struct mountres3_ok { + fhandle3 fhandle; + int auth_flavors<>; + }; + + union mountres3 switch (mountstat3 fhs_status) { + case MNT_OK: + mountres3_ok mountinfo; + default: + void; + }; + + DESCRIPTION + + Procedure MNT maps a pathname on the server to a file + handle. The pathname is an ASCII string that describes a + directory on the server. If the call is successful + (MNT3_OK), the server returns an NFS version 3 protocol + file handle and a vector of RPC authentication flavors + that are supported with the client's use of the file + handle (or any file handles derived from it). The + authentication flavors are defined in Section 7.2 and + section 9 of [RFC1057]. + + IMPLEMENTATION + + If mountres3.fhs_status is MNT3_OK, then + mountres3.mountinfo contains the file handle for the + directory and a list of acceptable authentication + flavors. This file handle may only be used in the NFS + version 3 protocol. This procedure also results in the + server adding a new entry to its mount list recording that + this client has mounted the directory. AUTH_UNIX + authentication or better is required. + + ERRORS + + MNT3ERR_NOENT + MNT3ERR_IO + MNT3ERR_ACCES + MNT3ERR_NOTDIR + MNT3ERR_NAMETOOLONG + + + +Callaghan, el al Informational [Page 109] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.2.2 Procedure 2: DUMP - Return mount entries + + SYNOPSIS + + mountlist MOUNTPROC3_DUMP(void) = 2; + + + typedef struct mountbody *mountlist; + + struct mountbody { + name ml_hostname; + dirpath ml_directory; + mountlist ml_next; + }; + + DESCRIPTION + + Procedure DUMP returns the list of remotely mounted file + systems. The mountlist contains one entry for each client + host name and directory pair. + + IMPLEMENTATION + + This list is derived from a list maintained on the server + of clients that have requested file handles with the MNT + procedure. Entries are removed from this list only when a + client calls the UMNT or UMNTALL procedure. Entries may + become stale if a client crashes and does not issue either + UMNT calls for all of the file systems that it had + previously mounted or a UMNTALL to remove all entries that + existed for it on the server. + + ERRORS + + There are no MOUNT protocol errors which can be returned + from this procedure. However, RPC errors may be returned + for authentication or other RPC failures. + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 110] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.2.3 Procedure 3: UMNT - Remove mount entry + + SYNOPSIS + + void MOUNTPROC3_UMNT(dirpath) = 3; + + DESCRIPTION + + Procedure UMNT removes the mount list entry for the + directory that was previously the subject of a MNT call + from this client. AUTH_UNIX authentication or better is + required. + + IMPLEMENTATION + + Typically, server implementations have maintained a list + of clients which have file systems mounted. In the past, + this list has been used to inform clients that the server + was going to be shutdown. + + ERRORS + + There are no MOUNT protocol errors which can be returned + from this procedure. However, RPC errors may be returned + for authentication or other RPC failures. + + + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 111] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.2.4 Procedure 4: UMNTALL - Remove all mount entries + + SYNOPSIS + + void MOUNTPROC3_UMNTALL(void) = 4; + + DESCRIPTION + + Procedure UMNTALL removes all of the mount entries for + this client previously recorded by calls to MNT. AUTH_UNIX + authentication or better is required. + + IMPLEMENTATION + + This procedure should be used by clients when they are + recovering after a system shutdown. If the client could + not successfully unmount all of its file systems before + being shutdown or the client crashed because of a software + or hardware problem, there may be servers which still have + mount entries for this client. This is an easy way for the + client to inform all servers at once that it does not have + any mounted file systems. However, since this procedure + is generally implemented using broadcast RPC, it is only + of limited usefullness. + + ERRORS + + There are no MOUNT protocol errors which can be returned + from this procedure. However, RPC errors may be returned + for authentication or other RPC failures. + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 112] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +5.2.5 Procedure 5: EXPORT - Return export list + + SYNOPSIS + + exports MOUNTPROC3_EXPORT(void) = 5; + + typedef struct groupnode *groups; + + struct groupnode { + name gr_name; + groups gr_next; + }; + + typedef struct exportnode *exports; + + struct exportnode { + dirpath ex_dir; + groups ex_groups; + exports ex_next; + }; + + DESCRIPTION + + Procedure EXPORT returns a list of all the exported file + systems and which clients are allowed to mount each one. + The names in the group list are implementation-specific + and cannot be directly interpreted by clients. These names + can represent hosts or groups of hosts. + + IMPLEMENTATION + + This procedure generally returns the contents of a list of + shared or exported file systems. These are the file + systems which are made available to NFS version 3 protocol + clients. + + ERRORS + + There are no MOUNT protocol errors which can be returned + from this procedure. However, RPC errors may be returned + for authentication or other RPC failures. + + + + + + + + + + +Callaghan, el al Informational [Page 113] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +6.0 Appendix II: Lock manager protocol + + Because the NFS version 2 protocol as well as the NFS version 3 + protocol is stateless, an additional Network Lock Manager (NLM) + protocol is required to support locking of NFS-mounted files. + The NLM version 3 protocol, which is used with the NFS version 2 + protocol, is documented in [X/OpenNFS]. + + Some of the changes in the NFS version 3 protocol require a + new version of the NLM protocol. This new protocol is the NLM + version 4 protocol. The following table summarizes the + correspondence between versions of the NFS protocol and NLM + protocol. + + NFS and NLM protocol compatibility + + +---------+---------+ + | NFS | NLM | + | Version | Version | + +===================+ + | 2 | 1,3 | + +---------+---------+ + | 3 | 4 | + +---------+---------+ + + This appendix only discusses the differences between the NLM + version 3 protocol and the NLM version 4 protocol. As in the + NFS version 3 protocol, almost all the names in the NLM version + 4 protocol have been changed to include a version number. This + appendix does not discuss changes that consist solely of a name + change. + +6.1 RPC Information + +6.1.1 Authentication + + The NLM service uses AUTH_NONE in the NULL procedure. + AUTH_UNIX, AUTH_SHORT, AUTH_DES, and AUTH_KERB are used for + all other procedures. Other authentication types may be + supported in the future. + +6.1.2 Constants + + These are the RPC constants needed to call the NLM service. + They are given in decimal. + + PROGRAM 100021 + VERSION 4 + + + +Callaghan, el al Informational [Page 114] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +6.1.3 Transport Address + + The NLM service is normally supported over the TCP and UDP + protocols. The rpcbind daemon should be queried for the + correct transport address. + +6.1.4 Basic Data Types + + uint64 + typedef unsigned hyper uint64; + + int64 + typedef hyper int64; + + uint32 + typedef unsigned long uint32; + + int32 + typedef long int32; + + These types are new for the NLM version 4 protocol. They are + the same as in the NFS version 3 protocol. + + nlm4_stats + + enum nlm4_stats { + NLM4_GRANTED = 0, + NLM4_DENIED = 1, + NLM4_DENIED_NOLOCKS = 2, + NLM4_BLOCKED = 3, + NLM4_DENIED_GRACE_PERIOD = 4, + NLM4_DEADLCK = 5, + NLM4_ROFS = 6, + NLM4_STALE_FH = 7, + NLM4_FBIG = 8, + NLM4_FAILED = 9 + }; + + Nlm4_stats indicates the success or failure of a call. This + version contains several new error codes, so that clients can + provide more precise failure information to applications. + + NLM4_GRANTED + The call completed successfully. + + NLM4_DENIED + The call failed. For attempts to set a lock, this status + implies that if the client retries the call later, it may + + + +Callaghan, el al Informational [Page 115] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + succeed. + + NLM4_DENIED_NOLOCKS + The call failed because the server could not allocate the + necessary resources. + + NLM4_BLOCKED + Indicates that a blocking request cannot be granted + immediately. The server will issue an NLMPROC4_GRANTED + callback to the client when the lock is granted. + + NLM4_DENIED_GRACE_PERIOD + The call failed because the server is reestablishing old + locks after a reboot and is not yet ready to resume normal + service. + + NLM4_DEADLCK + The request could not be granted and blocking would cause + a deadlock. + + NLM4_ROFS + The call failed because the remote file system is + read-only. For example, some server implementations might + not support exclusive locks on read-only file systems. + + NLM4_STALE_FH + The call failed because it uses an invalid file handle. + This can happen if the file has been removed or if access + to the file has been revoked on the server. + + NLM4_FBIG + The call failed because it specified a length or offset + that exceeds the range supported by the server. + + NLM4_FAILED + The call failed for some reason not already listed. The + client should take this status as a strong hint not to + retry the request. + + nlm4_holder + + struct nlm4_holder { + bool exclusive; + int32 svid; + netobj oh; + uint64 l_offset; + uint64 l_len; + }; + + + +Callaghan, el al Informational [Page 116] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + This structure indicates the holder of a lock. The exclusive + field tells whether the holder has an exclusive lock or a + shared lock. The svid field identifies the process that is + holding the lock. The oh field is an opaque object that + identifies the host or process that is holding the lock. The + l_len and l_offset fields identify the region that is locked. + The only difference between the NLM version 3 protocol and + the NLM version 4 protocol is that in the NLM version 3 + protocol, the l_len and l_offset fields are 32 bits wide, + while they are 64 bits wide in the NLM version 4 protocol. + + nlm4_lock + + struct nlm4_lock { + string caller_name<LM_MAXSTRLEN>; + netobj fh; + netobj oh; + int32 svid; + uint64 l_offset; + uint64 l_len; + }; + + This structure describes a lock request. The caller_name + field identifies the host that is making the request. The fh + field identifies the file to lock. The oh field is an opaque + object that identifies the host or process that is making the + request, and the svid field identifies the process that is + making the request. The l_offset and l_len fields identify + the region of the file that the lock controls. A l_len of 0 + means "to end of file". + + There are two differences between the NLM version 3 protocol + and the NLM version 4 protocol versions of this structure. + First, in the NLM version 3 protocol, the length and offset + are 32 bits wide, while they are 64 bits wide in the NLM + version 4 protocol. Second, in the NLM version 3 protocol, + the file handle is a fixed-length NFS version 2 protocol file + handle, which is encoded as a byte count followed by a byte + array. In the NFS version 3 protocol, the file handle is + already variable-length, so it is copied directly into the fh + field. That is, the first four bytes of the fh field are the + same as the byte count in an NFS version 3 protocol nfs_fh3. + The rest of the fh field contains the byte array from the NFS + version 3 protocol nfs_fh3. + + + + + + + +Callaghan, el al Informational [Page 117] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + nlm4_share + + struct nlm4_share { + string caller_name<LM_MAXSTRLEN>; + netobj fh; + netobj oh; + fsh4_mode mode; + fsh4_access access; + }; + + This structure is used to support DOS file sharing. The + caller_name field identifies the host making the request. + The fh field identifies the file to be operated on. The oh + field is an opaque object that identifies the host or process + that is making the request. The mode and access fields + specify the file-sharing and access modes. The encoding of fh + is a byte count, followed by the file handle byte array. See + the description of nlm4_lock for more details. + +6.2 NLM Procedures + + The procedures in the NLM version 4 protocol are semantically + the same as those in the NLM version 3 protocol. The only + semantic difference is the addition of a NULL procedure that + can be used to test for server responsiveness. The procedure + names with _MSG and _RES suffixes denote asynchronous + messages; for these the void response implies no reply. A + syntactic change is that the procedures were renamed to avoid + name conflicts with the values of nlm4_stats. Thus the + procedure definition is as follows. + + version NLM4_VERS { + void + NLMPROC4_NULL(void) = 0; + + nlm4_testres + NLMPROC4_TEST(nlm4_testargs) = 1; + + nlm4_res + NLMPROC4_LOCK(nlm4_lockargs) = 2; + + nlm4_res + NLMPROC4_CANCEL(nlm4_cancargs) = 3; + + nlm4_res + NLMPROC4_UNLOCK(nlm4_unlockargs) = 4; + + + + + +Callaghan, el al Informational [Page 118] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + nlm4_res + NLMPROC4_GRANTED(nlm4_testargs) = 5; + + void + NLMPROC4_TEST_MSG(nlm4_testargs) = 6; + + void + NLMPROC4_LOCK_MSG(nlm4_lockargs) = 7; + + void + NLMPROC4_CANCEL_MSG(nlm4_cancargs) = 8; + + void + NLMPROC4_UNLOCK_MSG(nlm4_unlockargs) = 9; + + void + NLMPROC4_GRANTED_MSG(nlm4_testargs) = 10; + + void + NLMPROC4_TEST_RES(nlm4_testres) = 11; + + void + NLMPROC4_LOCK_RES(nlm4_res) = 12; + + void + NLMPROC4_CANCEL_RES(nlm4_res) = 13; + + void + NLMPROC4_UNLOCK_RES(nlm4_res) = 14; + + void + NLMPROC4_GRANTED_RES(nlm4_res) = 15; + + nlm4_shareres + NLMPROC4_SHARE(nlm4_shareargs) = 20; + + nlm4_shareres + NLMPROC4_UNSHARE(nlm4_shareargs) = 21; + + nlm4_res + NLMPROC4_NM_LOCK(nlm4_lockargs) = 22; + + void + NLMPROC4_FREE_ALL(nlm4_notify) = 23; + + } = 4; + + + + + +Callaghan, el al Informational [Page 119] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +6.2.0 Procedure 0: NULL - Do nothing + + SYNOPSIS + + void NLMPROC4_NULL(void) = 0; + + DESCRIPTION + + The NULL procedure does no work. It is made available in + all RPC services to allow server response testing and + timing. + + IMPLEMENTATION + + It is important that this procedure do no work at all so + that it can be used to measure the overhead of processing + a service request. By convention, the NULL procedure + should never require any authentication. + + ERRORS + + It is possible that some server implementations may return + RPC errors based on security and authentication + requirements. + +6.3 Implementation issues + +6.3.1 64-bit offsets and lengths + + Some NFS version 3 protocol servers can only support + requests where the file offset or length fits in 32 or + fewer bits. For these servers, the lock manager will have + the same restriction. If such a lock manager receives a + request that it cannot handle (because the offset or + length uses more than 32 bits), it should return the + error, NLM4_FBIG. + +6.3.2 File handles + + The change in the file handle format from the NFS version + 2 protocol to the NFS version 3 protocol complicates the + lock manager. First, the lock manager needs some way to + tell when an NFS version 2 protocol file handle refers to + the same file as an NFS version 3 protocol file handle. + (This is assuming that the lock manager supports both NLM + version 3 protocol clients and NLM version 4 protocol + clients.) Second, if the lock manager runs the file handle + through a hashing function, the hashing function may need + + + +Callaghan, el al Informational [Page 120] + +RFC 1813 NFS Version 3 Protocol June 1995 + + + to be retuned to work with NFS version 3 protocol file + handles as well as NFS version 2 protocol file handles. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 121] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +7.0 Appendix III: Bibliography + +[Corbin] Corbin, John, "The Art of Distributed + Programming-Programming Techniques for Remote + Procedure Calls." Springer-Verlag, New York, New + York. 1991. Basic description of RPC and XDR + and how to program distributed applications + using them. + +[Glover] Glover, Fred, "TNFS Protocol Specification," + Trusted System Interest Group, Work in + Progress. + +[Israel] Israel, Robert K., Sandra Jett, James Pownell, + George M. Ericson, "Eliminating Data Copies in + UNIX-based NFS Servers," Uniforum Conference + Proceedings, San Francisco, CA, + February 27 - March 2, 1989. Describes two + methods for reducing data copies in NFS server + code. + +[Jacobson] Jacobson, V., "Congestion Control and + Avoidance," Proc. ACM SIGCOMM `88, Stanford, CA, + August 1988. The paper describing improvements + to TCP to allow use over Wide Area Networks and + through gateways connecting networks of varying + capacity. This work was a starting point for the + NFS Dynamic Retransmission work. + +[Juszczak] Juszczak, Chet, "Improving the Performance and + Correctness of an NFS Server," USENIX Conference + Proceedings, USENIX Association, Berkeley, CA, + June 1990, pages 53-63. Describes reply cache + implementation that avoids work in the server by + handling duplicate requests. More important, + though listed as a side-effect, the reply cache + aids in the avoidance of destructive + non-idempotent operation re-application -- + improving correctness. + +[Kazar] Kazar, Michael Leon, "Synchronization and Caching + Issues in the Andrew File System," USENIX Conference + Proceedings, USENIX Association, Berkeley, CA, + Dallas Winter 1988, pages 27-36. A description + of the cache consistency scheme in AFS. + Contrasted with other distributed file systems. + + + + + +Callaghan, el al Informational [Page 122] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +[Macklem] Macklem, Rick, "Lessons Learned Tuning the + 4.3BSD Reno Implementation of the NFS Protocol," + Winter USENIX Conference Proceedings, USENIX + Association, Berkeley, CA, January 1991. + Describes performance work in tuning the 4.3BSD + Reno NFS implementation. Describes performance + improvement (reduced CPU loading) through + elimination of data copies. + +[Mogul] Mogul, Jeffrey C., "A Recovery Protocol for Spritely + NFS," USENIX File System Workshop Proceedings, + Ann Arbor, MI, USENIX Association, Berkeley, CA, + May 1992. Second paper on Spritely NFS proposes + a lease-based scheme for recovering state of + consistency protocol. + +[Nowicki] Nowicki, Bill, "Transport Issues in the Network + File System," ACM SIGCOMM newsletter Computer + Communication Review, April 1989. A brief + description of the basis for the dynamic + retransmission work. + +[Pawlowski] Pawlowski, Brian, Ron Hixon, Mark Stein, Joseph + Tumminaro, "Network Computing in the UNIX and + IBM Mainframe Environment," Uniforum `89 Conf. + Proc., (1989) Description of an NFS server + implementation for IBM's MVS operating system. + +[RFC1014] Sun Microsystems, Inc., "XDR: External Data + Representation Standard", RFC 1014, + Sun Microsystems, Inc., June 1987. + Specification for canonical format for data + exchange, used with RPC. + +[RFC1057] Sun Microsystems, Inc., "RPC: Remote Procedure + Call Protocol Specification", RFC 1057, + Sun Microsystems, Inc., June 1988. + Remote procedure protocol specification. + +[RFC1094] Sun Microsystems, Inc., "Network Filesystem + Specification", RFC 1094, Sun Microsystems, Inc., + March 1989. NFS version 2 protocol + specification. + + + + + + + + +Callaghan, el al Informational [Page 123] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +[Sandberg] Sandberg, R., D. Goldberg, S. Kleiman, D. Walsh, + B. Lyon, "Design and Implementation of the Sun + Network Filesystem," USENIX Conference + Proceedings, USENIX Association, Berkeley, CA, + Summer 1985. The basic paper describing the + SunOS implementation of the NFS version 2 + protocol, and discusses the goals, protocol + specification and trade-offs. + +[Srinivasan] Srinivasan, V., Jeffrey C. Mogul, "Spritely + NFS: Implementation and Performance of Cache + Consistency Protocols", WRL Research Report + 89/5, Digital Equipment Corporation Western + Research Laboratory, 100 Hamilton Ave., Palo + Alto, CA, 94301, May 1989. This paper analyzes + the effect of applying a Sprite-like consistency + protocol applied to standard NFS. The issues of + recovery in a stateful environment are covered + in [Mogul]. + +[X/OpenNFS] X/Open Company, Ltd., X/Open CAE Specification: + Protocols for X/Open Internetworking: XNFS, + X/Open Company, Ltd., Apex Plaza, Forbury Road, + Reading Berkshire, RG1 1AX, United Kingdom, + 1991. This is an indispensable reference for + NFS version 2 protocol and accompanying + protocols, including the Lock Manager and the + Portmapper. + +[X/OpenPCNFS] X/Open Company, Ltd., X/Open CAE Specification: + Protocols for X/Open Internetworking: (PC)NFS, + Developer's Specification, X/Open Company, Ltd., + Apex Plaza, Forbury Road, Reading Berkshire, RG1 + 1AX, United Kingdom, 1991. This is an + indispensable reference for NFS version 2 + protocol and accompanying protocols, including + the Lock Manager and the Portmapper. + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 124] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +8. Security Considerations + + Since sensitive file data may be transmitted or received + from a server by the NFS protocol, authentication, privacy, + and data integrity issues should be addressed by implementations + of this protocol. + + As with the previous protocol revision (version 2), NFS + version 3 defers to the authentication provisions of the + supporting RPC protocol [RFC1057], and assumes that data + privacy and integrity are provided by underlying transport + layers as available in each implementation of the protocol. + See section 4.4 for a discussion relating to file access + permissions. + +9. Acknowledgements + + This description of the protocol is derived from an original + document written by Brian Pawlowski and revised by Peter + Staubach. This protocol is the result of a co-operative + effort that comprises the contributions of Geoff Arnold, + Brent Callaghan, John Corbin, Fred Glover, Chet Juszczak, + Mike Eisler, John Gillono, Dave Hitz, Mike Kupfer, Rick + Macklem, Ron Minnich, Brian Pawlowski, David Robinson, Rusty + Sandberg, Craig Schamp, Spencer Shepler, Carl Smith, Mark + Stein, Peter Staubach, Tom Talpey, Rob Thurlow, and Mark + Wittle. + + + + + + + + + + + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 125] + +RFC 1813 NFS Version 3 Protocol June 1995 + + +10. Authors' Addresses + + Address comments related to this protocol to: + + nfs3@eng.sun.com + + + Brent Callaghan + Sun Microsystems, Inc. + 2550 Garcia Avenue + Mailstop UMTV05-44 + Mountain View, CA 94043-1100 + + Phone: 1-415-336-1051 + Fax: 1-415-336-6015 + EMail: brent.callaghan@eng.sun.com + + + Brian Pawlowski + Network Appliance Corp. + 319 North Bernardo Ave. + Mountain View, CA 94043 + + Phone: 1-415-428-5136 + Fax: 1-415-428-5151 + EMail: beepy@netapp.com + + + Peter Staubach + Sun Microsystems, Inc. + 2550 Garcia Avenue + Mailstop UMTV05-44 + Mountain View, CA 94043-1100 + + Phone: 1-415-336-5615 + Fax: 1-415-336-6015 + EMail: peter.staubach@eng.sun.com + + + + + + + + + + + + + + +Callaghan, el al Informational [Page 126] + |