<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="pre5378Trust200902" docName="draft-ietf-nfsv4-nfs-acl-05" category="info" submissionType="IETF" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="NFS ACL Protocol">The Network File System Access Control List Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-nfs-acl-05"/>
    <author fullname="Chuck Lever" role="editor">
      <organization>Independent</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>cel-ietf@chucklever.net</email>
      </address>
    </author>
    <date year="2026" month="September" day="15"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFS</keyword>
    <keyword>ACL</keyword>
    <abstract>
      <?line 94?>

<t>This Informational document describes the NFS_ACL protocol.
NFS_ACL is a legacy member of the Network File System family
of protocols that NFS clients use to view and update Access
Control Lists stored on an NFS version 2 or version 3 server.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-nfsv4.github.io/i-d-nfs-acl/draft-ietf-nfsv4-nfs-acl.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-nfsv4-nfs-acl/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network File System Version 4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-nfsv4/i-d-nfs-acl"/>.</t>
    </note>
  </front>
  <middle>
    <?line 102?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Network File System protocol (NFS) was introduced by Sun
Microsystems in the 1980s. This protocol enabled applications
to access and modify files, via local POSIX system interfaces,
that reside on a remote host <xref target="RFC1094"/>.</t>
      <t>Traditionally, permission to access files stored in NFS file
systems is granted by permission bits, mimicking <xref target="POSIX"/>.
Permission bits provide coarse-grained access control. The
file owner can control only whether members of her group can
read, write, or execute the file contents, or whether anyone
else (without exception) has those rights.</t>
      <t>An Access Control List, or ACL, is a mechanism that enables
file owners to grant specific users fine-grained access
rights to file content <xref target="IEEE"/>.</t>
      <t>Version 2 of NFS is described in <xref target="RFC1094"/>, and version 3
in <xref target="RFC1813"/>. Neither of these protocols include a method
for managing ACLs associated with files shared via the NFS
protocol, even though the local file systems shared via NFS
often implemented ACLs and gave local users mechanisms to
read and update them.</t>
      <t>Sun created the NFS_ACL protocol to provide that mechanism
for files accessed remotely via NFS. Later, other operating
systems, including Linux, implemented NFS_ACL for similar
reasons.</t>
      <t>This document describes the protocol based on the nfs_acl.x
file that is publicly available in the OpenSolaris
code base <xref target="OpenSolaris"/>. The editor has attempted to
introduce no changes to the protocol as it is implemented
in OpenSolaris and in Linux.</t>
      <t>The document assumes readers are already familiar with the
NFS version 2 or 3 protocols and at least one implementation
of them.</t>
      <t>Issues of compatibility between the protocol described in
this document and NFSv4 ACLs (as described by <xref target="RFC8881"/>)
are considered out of scope. More information on this topic
is available in <xref target="I-D.ietf-nfsv4-posix-acls"/>.</t>
      <t>Local file systems on NFSv2 and NFSv3 servers determine the
particular semantics of each Access Control List -- in other
words, how the server uses each Access Control List to
authorize access to file content. This document serves only
as a description of the network protocol used to exchange
ACLs between NFS clients and servers.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>As an Informational document, this RFC does not make compliance
mandates on implementations of the protocol described herein.
Therefore it does not make use of the conformance language
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>. A capitalized key
word that appears in text quoted from another document carries
the meaning that document gives it.</t>
      <section anchor="glossary">
        <name>Glossary</name>
        <t>The following are a set of foundational terms used throughout
this document.</t>
        <dl>
          <dt>application:</dt>
          <dd>
            <t>A program that executes on a client system.</t>
          </dd>
          <dt>client:</dt>
          <dd>
            <t>A computer system that utilizes compute resources provided by one or
more servers.</t>
          </dd>
          <dt>file:</dt>
          <dd>
            <t>A unit of data storage consisting of an ordered stream of
bytes and a set of metadata attributes.</t>
          </dd>
          <dt>gid:</dt>
          <dd>
            <t>A 32-bit unsigned integer that represents a group of users.</t>
          </dd>
          <dt>server:</dt>
          <dd>
            <t>A computer system that provides compute resources to network peers.</t>
          </dd>
          <dt>uid:</dt>
          <dd>
            <t>A 32-bit unsigned integer that represents a specific user.</t>
          </dd>
          <dt>user:</dt>
          <dd>
            <t>A person logged in on a client system.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="general-concepts">
      <name>General Concepts</name>
      <section anchor="remote-procedure-call">
        <name>Remote Procedure Call</name>
        <t>The Sun Remote Procedure Call (SunRPC) protocol 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 that are accessed using different protocol version
numbers.</t>
        <t>The NFS and NFS_ACL protocols are both based on SunRPC. The
remainder of this document assumes an NFS environment that is
implemented on top of SunRPC, as it is specified in <xref target="RFC5531"/>.</t>
      </section>
      <section anchor="external-data-representation">
        <name>External Data Representation</name>
        <t>The eXternal Data Representation (XDR) specification provides a
standard way of representing a set of data types on a network.
XDR addresses the problem of communication between network
peers with different byte orders, structure alignment, and data
type representation.</t>
        <t>This document utilizes the RPC Data Description Language to
specify the XDR format arguments and results to each of the RPC
service procedures that an NFS_ACL server provides.</t>
        <t>Readers can find a full guide to XDR and the RPC Data Description
Language in <xref target="RFC4506"/>.</t>
        <section anchor="xdr-types-not-defined-in-rfc-4506">
          <name>XDR Types Not Defined in RFC 4506</name>
          <t>The original NFS_ACL RPC language specification uses the "unsigned short" and
"unsigned long" types. <xref target="RFC4506"/> describes neither, though most current
implementations of the rpcgen program accept both. This section describes the
"unsigned short" and "unsigned long" integer types as used in this document,
based on those implementations, so that the NFS_ACL RPC language specification
appearing here accurately reflects the wire behavior of existing
implementations. It does not add these types to the RPC Data Description
Language.</t>
          <t>The XDR wire representation of each of these types is a network-endian 32-bit
integer. This maintains XDR's consistent 4-octet alignment for all basic
integer types while allowing applications to use narrower types internally.
The subsections below describe how a value of each type occupies that 32-bit
field.</t>
          <section anchor="unsigned-short">
            <name>unsigned short</name>
            <t>The unsigned short type is zero-extended, with the high-order two octets each
containing zeroes on the wire. The value range of this type is zero to 65,535,
inclusive.</t>
            <t>Example: 0xFFFF (65535) appears as 0x0000FFFF on the wire.</t>
          </section>
          <section anchor="unsigned-long">
            <name>unsigned long</name>
            <t>The unsigned long type occupies all four octets of the 32-bit field and
requires no extension. Its wire representation is identical to that of the
"unsigned int" type described in <xref section="4.2" sectionFormat="of" target="RFC4506"/>. The value range
of this type is zero to 4,294,967,295, inclusive.</t>
            <t>The NFS version 3 protocol specification <xref target="RFC1813"/> uses this type name for
32-bit unsigned quantities, and this document retains it in the data types
that it inherits from that protocol.</t>
          </section>
        </section>
      </section>
      <section anchor="auth-and-authz">
        <name>Authentication and Authorization</name>
        <t>The RPC protocol includes fields in every procedure call for
user authentication parameters. The specific content of the
authentication parameters is determined by the type of
authentication used by the server and client. A discussion
of the mechanics of RPC user authentication appears in
<xref target="RFC5531"/>, in particular Sections 9 and 10.</t>
        <t>For NFS ACLs, the user ID carried in RPC calls is used
for two purposes:</t>
        <ul spacing="normal">
          <li>
            <t>When setting an ACL via the SETACL procedure, the NFS_ACL
service verifies that the calling user has been granted
permission to perform the procedure. The GETACL procedure
carries no such check of its own. The server passes the
calling user's credential to the local file system, which
may or may not restrict who can read an object's ACL.</t>
          </li>
          <li>
            <t>Each Access Control Entry (see below) contains an element
that identifies the user to which the ACE applies. That
user is represented by a 32-bit user ID. The value of the
user ID in each ACE has the same meaning and mapping as
the value of incoming RPC calls.</t>
          </li>
        </ul>
        <t>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 number 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.</t>
        <t>RPCSEC_GSS authentication provides stronger
security through the use of cryptographic authentication.
The server and client must agree on the mapping of the
user's GSS principal to a local UID on the server, but
the name to identity mapping is more operating system
independent than the uid and gid mapping in AUTH_SYS.</t>
      </section>
      <section anchor="file-access-control">
        <name>File Access Control</name>
        <t>This section describes the abstractions that an NFS server
uses to determine whether an access or modification
to a file is permitted. The exact behavior of a server
implementation may vary.</t>
        <section anchor="file-ownership">
          <name>File Ownership</name>
          <t>A file's "owner" is the designated user that is always granted
permission to update that file's security attributes. As part of
creating a file, the NFS server assigns the file's owner. Under
normal circumstances the initial file owner is the RPC user who
issued the NFS CREATE procedure. However, server security policies
can mandate replacement of that user (also known as user squashing)
as part of processing a CREATE procedure.</t>
          <t>An existing file's designated owner can subsequently be changed by
an NFS SETATTR procedure. After that change, the new owner is
granted permission to update the file's security attributes and
the old owner is no longer treated specially.</t>
          <t>A file's "owner group" is a short list of users that have
similar privileges as the file's owner, but are treated as a
separate category for the purpose of permission checking.</t>
          <t>Any user who is not a file's owner or a member of its owner
group falls into the third category, known as "everyone" or
"other".</t>
          <section anchor="superuser-access">
            <name>Superuser Access</name>
            <t>On most operating systems, there is a category of users known as
privileged users or superusers. These users can bypass most or
all access controls on files.</t>
          </section>
        </section>
        <section anchor="categories-of-access">
          <name>Categories of Access</name>
          <t>In NFS versions 2 and 3, there are three rudimentary categories
of access:</t>
          <dl>
            <dt>Read access:</dt>
            <dd>
              <t>Read access grants permission for a user to read a file or
directory.</t>
            </dd>
            <dt>Write access:</dt>
            <dd>
              <t>Write access grants permission for a user to modify a file
or directory.</t>
            </dd>
            <dt>Execute access:</dt>
            <dd>
              <t>For a file, execute access grants permission for the user to
treat the file content as executable. For a directory object,
execute access grants permission for the user to perform a
lookup in that directory.</t>
            </dd>
          </dl>
        </section>
        <section anchor="traditional-permission-bits">
          <name>Traditional Permission Bits</name>
          <t>Permission bits, or mode bits, are the simplest and perhaps
oldest form of access control. Each file object has a set
of mode bits <xref target="POSIX"/>.</t>
          <t>Each of the user categories is given a set of three access
type bits. Altogether there are then nine bit flags for
every file object.</t>
        </section>
        <section anchor="access-control-lists">
          <name>Access Control Lists</name>
          <t>An Access Control Entry, or ACE, represents a set of access categories
and a specific user or group. An Access Control List is a list of ACEs.</t>
          <t>Mode bits, as explained in the previous section, are essentially an
ACL that always contains exactly three ACEs: one for the file's owner,
one for the file's owner group, and one for everyone else.</t>
          <section anchor="interpreting-acls">
            <name>Interpreting Access Control Lists</name>
            <t>NFS clients do not perform access checks based on their
interpretation of an ACL read from the server. NFS servers
are solely responsible for authorizing and restricting
access to file content via the NFS protocol.</t>
            <t>An NFS Access Control List is a list of three or more
Access Control Entries (ACEs) associated with one file
system object. Each Access Control Entry in this list
specifies a user and a set of access types granted to
that user.</t>
            <t>Only ACEs that match the requester are considered. Each
ACE is processed until all of the bits of the requester's
access have been ALLOWED. Once a bit has been ALLOWED,
that bit is no longer considered in the processing
of subsequent ACEs in the list.</t>
            <t>When the ACL has been fully processed, if there are bits
in the requester's mask that have not been ALLOWED,
access of that type is denied.</t>
            <t>Note that an ACL might not be the sole determiner of access. For example:</t>
            <ul spacing="normal">
              <li>
                <t>In the case of a file system exported as read-only,
the server may deny write access even though an object's
ACL grants it.</t>
              </li>
              <li>
                <t>Server implementations can grant some limited permission
to update an ACL in order to prevent a situation from
arising in which there is no valid way to ever modify the ACL.</t>
              </li>
              <li>
                <t>Server implementations can allow a user to read the data
of a file when only the execute permission is granted (that
is, when the ACL denies the user NA_READ but allows NA_EXEC),
since a server has to read the file to execute it.</t>
              </li>
              <li>
                <t>Some server implementations have the notion of
owner-override, in which the owner of the object is allowed
to override accesses that are denied by the ACL. This can be
helpful, for example, to allow users continued access to
open files on which the permissions have changed.</t>
              </li>
              <li>
                <t>Some server implementations have the notion of a
"superuser" that has privileges beyond an ordinary user.
The superuser may be able to read or write data or metadata
in ways that would otherwise not be permitted by the object's
ACL.</t>
              </li>
            </ul>
            <t>NFS clients can use either the NFS_ACL version 2 ACCESS
procedure or the NFS version 3 ACCESS procedure to ask the
server to perform an access check based on the requesting
user and the ACL present on a file system object. Clients are
also free to simply try an operation to see what works, then
recover if the server denies access.</t>
          </section>
          <section anchor="acls-in-operation">
            <name>ACLs in Operation</name>
            <t>The SETACL procedure sets two types of Access Control Lists:</t>
            <dl>
              <dt>Access:</dt>
              <dd>
                <t>An NFS access ACL specifies the access permission
for a file object. Access Control Entries in an ACL's
"aclent" field comprise the object's access ACL.</t>
              </dd>
              <dt>Default:</dt>
              <dd>
                <t>An NFS default ACL specifies the default ACL that
is set on objects that are children of a directory.
Access Control Entries in an ACL's "dfaclent" comprise
an object's default ACL. The default ACL does not affect
access to the object on which it is set.</t>
              </dd>
            </dl>
            <t>An access ACL, and a default ACL that has any ACEs, must have
one ACE for each of NA_USER_OBJ, NA_GROUP_OBJ, and
NA_OTHER_OBJ. An NFS ACL that consists only of these
three ACEs is referred to as a minimal NFS ACL. A default ACL
with no ACEs means the directory has no default ACL.</t>
            <t>An NFS ACL may have zero or more NA_USER and/or NA_GROUP
ACEs.</t>
            <t>On the wire, a minimal NFS ACL is represented as either
three or four Access Control Entries.</t>
            <ul spacing="normal">
              <li>
                <t>A sender can send the list as the file system stores it.
Such a sender sends three entries for an object whose ACL
has no mask entry, and four for a manufactured ACL
(<xref target="no-acl-support"/>), which always occupies four entries
in the "aclent" array and none in the "dfaclent" array and
whose NA_CLASS_OBJ entry is not always formed as described
above. A receiver accepts either representation in either
array.</t>
              </li>
              <li>
                <t>A sender can expand a three-entry list to four. Such a
sender adds an NA_CLASS_OBJ entry to the NA_USER_OBJ,
NA_GROUP_OBJ, and NA_OTHER_OBJ entries, and derives that
entry's "perm" element from the permission bits of the
object's owning group, in both the "aclent" and the
"dfaclent" array.</t>
              </li>
            </ul>
            <t>The two representations are not interchangeable in every
case. Implementations follow different drafts of POSIX
1003.1e, and the drafts differ in their treatment of the
mask entry in a four-entry ACL; <xref target="Gruenbacher"/> describes
the difference. A receiver that follows draft 17 removes the
NA_CLASS_OBJ entry from a four-entry list when its "perm"
element equals that of the NA_GROUP_OBJ entry, restoring the
three-entry form, and keeps the entry when the two differ.</t>
            <t>The Access Control Entries in the "aclent" and "dfaclent"
arrays can appear in any order. A receiver does not depend on
the order in which the entries arrive.</t>
            <t>When a client presents a SETACL operation that a server
finds is invalid or it cannot process, the server responds
with ACL2ERR_INVAL or ACL3ERR_INVAL, depending on the version
of NFS_ACL that is in use. ACLs that are not valid include:</t>
            <ul spacing="normal">
              <li>
                <t>The presented ACL does not contain one ACE for each of
NA_USER_OBJ, NA_GROUP_OBJ, and NA_OTHER_OBJ</t>
              </li>
              <li>
                <t>The presented ACL contains an NA_GROUP ACE but no
NA_CLASS_OBJ ACE</t>
              </li>
              <li>
                <t>The presented ACL is a default ACL but the target object
is not a directory</t>
              </li>
              <li>
                <t>The presented ACL contains an ACE whose "type" field
sets more than one of the base type values NA_USER_OBJ,
NA_USER, NA_GROUP_OBJ, NA_GROUP, NA_CLASS_OBJ, and
NA_OTHER_OBJ (the NA_ACL_DEFAULT flag may accompany
exactly one such value)</t>
              </li>
              <li>
                <t>The presented ACL contains an ACE whose type or perm
field has a bit set that is not defined by this protocol</t>
              </li>
              <li>
                <t>The count for a non-empty "aclent" or "dfaclent" array
differs from the number of entries in that array</t>
              </li>
            </ul>
            <t>Whether an ACL that contains an NA_USER ACE but no
NA_CLASS_OBJ ACE is valid depends on the exported file
system. A server responds with ACL2ERR_INVAL or ACL3ERR_INVAL
when the exported file system rejects such an ACL.</t>
            <t>An ACL that has no more than NFS_ACL_MAX_ENTRIES entries in
each array can still exceed what the exported file system
stores in one ACL. A server reports that with ACL2ERR_NOSPC or
ACL3ERR_NOSPC, or with ACL2ERR_INVAL or ACL3ERR_INVAL when the
file system rejects the list as invalid.</t>
            <t>The NA_ACL_DEFAULT bit is a flag that a sender combines with
one of the base type values (for example, NA_ACL_DEFAULT |
NA_USER_OBJ) to mark an Access Control Entry as a default
entry: one that a directory contributes to its newly created
children rather than one that controls access to the directory
itself. Every entry in the "dfaclent" array has the
NA_ACL_DEFAULT bit set in its "type" field, and no entry in the
"aclent" array has it set. Segregating default entries into the
separate "dfaclent" array makes the flag redundant on the wire;
a sender nonetheless sets it on every "dfaclent" entry so that a
receiver can reconstruct the single, flag-tagged Access Control
list that some file access APIs present to applications.</t>
            <t>The "id" field in an Access Control Entry is interpreted as follows:</t>
            <ul spacing="normal">
              <li>
                <t>For an ACE that specifies an NA_USER_OBJ, NA_USER,
NA_GROUP, and NA_GROUP_OBJ, the "id" field contains
a UID or GID value that identifies the user on the
server whose access permission is being set.</t>
              </li>
              <li>
                <t>For an ACE that specifies other types of permission (for
example, NA_CLASS_OBJ or NA_OTHER_OBJ), the "id" field is
undefined. A sender sets this field to zero, and a receiver
ignores its value.</t>
              </li>
            </ul>
          </section>
          <section anchor="relationship-between-acls-and-other-file-attributes">
            <name>Relationship Between ACLs and Other File Attributes</name>
            <t>When an ACL is present on a file, the ACL controls the
requesting user's access to the file. Typically the NFS
server ignores the file's mode bits.</t>
            <t>Depending on the behavior of the local file system
implementation, changing the file's ACL via the SETACL
procedure may alter the file's mode bits, and changing
the mode bits via the SETATTR procedure may alter the
content of the ACL in any way. NFS clients should
refresh cached ACLs or file modes after one of these
operations.</t>
            <t>When an ACL is present on a file, changing the file's owner
(say, via the SETATTR operation) may alter the server's
interpretation of any ACE that targets NA_USER_OBJ.</t>
            <t>When an ACL is present on a file, changing the file's group
(say, via the SETATTR operation) may alter the server's
interpretation of any ACE that targets NA_GROUP_OBJ.</t>
            <t>If an NFS client observes that a file's ctime attribute
has changed, it should assume that any ACLs that are
present might have been modified.</t>
          </section>
          <section anchor="acl-inheritance">
            <name>ACL Inheritance</name>
            <t>A directory's default ACL takes effect when a client uses one
of the NFS CREATE, MKDIR, or MKNOD procedures to create an
object in that directory. The exported file system derives the
new object's access ACL and mode bits from the parent's default
ACL and the mode the client requested, and gives a new
directory the parent's default ACL as its own. That derivation
is a property of the exported file system rather than of this
protocol. <xref target="Gruenbacher"/> describes the POSIX 1003.1e rules for
that derivation, including how a default ACL takes the place of
the umask. A client observes the result by
retrieving the new object's ACL with GETACL.</t>
          </section>
          <section anchor="historical-references">
            <name>Historical References</name>
            <t>The section entitled "The POSIX 1003.1e/1003.2c Working Group"
in <xref target="Gruenbacher"/> details the history of POSIX standards efforts
with regard to file access control. The editor recommends that
readers familiarize themselves with the extent to which POSIX
specifies the content and behavior of ACLs.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="protocol-elements-common-to-both-versions">
      <name>Protocol Elements Common to Both Versions</name>
      <section anchor="rpc-authentication">
        <name>RPC Authentication</name>
        <t>The NFS_ACL service uses AUTH_NONE in the NULL procedure.
All RPC authentication flavors may be used for other procedures.
That records what implementations accept, not what a deployment
should use; see <xref target="unprotected-exchange"/> and
<xref target="protecting-an-exchange"/>.</t>
      </section>
      <section anchor="constants">
        <name>Constants</name>
        <t>These are the RPC constants needed to call the NFS_ACL
service.  They are given in decimal.</t>
        <dl>
          <dt>100227</dt>
          <dd>
            <t>The RPC program number for the NFS_ACL protocol</t>
          </dd>
        </dl>
        <t>This document describes versions 2 and 3 of this RPC program.
Version 4 was used by a Solaris prototype and is not available
for reuse (see <xref target="nfs-acl-v4"/>).</t>
      </section>
      <section anchor="transport-address">
        <name>Transport address</name>
        <t>The NFS_ACL protocol can operate over the TCP and UDP transport
protocols, on port 2049, and over RPC-over-RDMA version 1
<xref target="RFC8166"/>, on port 20049. In each case this is the port of
the NFS service that NFS_ACL accompanies. <xref section="5.2" sectionFormat="of" target="RFC8267"/> gives the upper-layer binding for NFS_ACL on
RPC-over-RDMA.</t>
      </section>
      <section anchor="sizes">
        <name>Sizes</name>
        <sourcecode type="xdr"><![CDATA[
NFS_ACL_MAX_ENTRIES 1024
]]></sourcecode>
        <t>The maximum number of Access Control Entries allowed in one
Access Control List array.</t>
      </section>
      <section anchor="basic-data-types">
        <name>Basic Data Types</name>
        <t>The following XDR definitions are basic scalar types that are used in other structures.</t>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned int uid;
]]></sourcecode>
        <sourcecode type="xdr"><![CDATA[
typedef unsigned short o_mode;
]]></sourcecode>
      </section>
      <section anchor="structured-data-types">
        <name>Structured Data types</name>
        <t>The following XDR definitions are common structured data types
that are used in all versions of the NFS_ACL protocol.</t>
        <section anchor="aclent">
          <name>aclent</name>
          <t>This structure represents a single entry in an Access Control List.</t>
          <sourcecode type="xdr"><![CDATA[
struct aclent {
    int type;
    uid id;
    o_mode perm;
};
]]></sourcecode>
          <t>The "type" element in an Access Control Entry is a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_USER_OBJ = 0x1;        /* object owner */
const NA_USER = 0x2;            /* additional users */
const NA_GROUP_OBJ = 0x4;       /* owning group of the object */
const NA_GROUP = 0x8;           /* additional groups */
const NA_CLASS_OBJ = 0x10;      /* file group class and mask entry */
const NA_OTHER_OBJ = 0x20;      /* other entry for the object */
const NA_ACL_DEFAULT = 0x1000;  /* default flag */
]]></sourcecode>
          <t>The "perm" element in an Access Control Entry is also a bit mask.
The bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_READ = 0x4;            /* read permission */
const NA_WRITE = 0x2;           /* write permission */
const NA_EXEC = 0x1;            /* exec permission */
]]></sourcecode>
        </section>
        <section anchor="secattr">
          <name>secattr</name>
          <t>The secattr structure represents, on the wire, the full Access Control
List for one file system object. This list contains an array of
Access Control Entries that apply to the object, plus an array of
default Access Control Entries that are inherited by the object's
children.</t>
          <sourcecode type="xdr"><![CDATA[
struct secattr {
    unsigned int mask;
    int aclcnt;
    aclent aclent<NFS_ACL_MAX_ENTRIES>;
    int dfaclcnt;
    aclent dfaclent<NFS_ACL_MAX_ENTRIES>;
};
]]></sourcecode>
          <t>The "aclcnt" and "dfaclcnt" elements carry the number of
Access Control Entries in the object's access ACL and default
ACL. A count is meaningful whether or not its array is
present: a GETACL reply carries a count for an array whose
count bit alone is set, and carries that array empty (see
<xref target="getacl2"/> and <xref target="getacl3"/>).</t>
          <t>The "mask" element of the secattr structure is a bit mask. The
bit field values in this mask are defined as follows:</t>
          <sourcecode type="xdr"><![CDATA[
const NA_ACL = 0x1;         /* aclent contains a valid list */
const NA_ACLCNT = 0x2;      /* number of entries in the aclent list */
const NA_DFACL = 0x4;       /* dfaclent contains a valid list */
const NA_DFACLCNT = 0x8;    /* number of entries in the dfaclent list */
]]></sourcecode>
          <t>These bit field values are also used in the "mask" element of the
GETACL2args and GETACL3args structures.</t>
          <t>In a GETACL reply, the "mask" element of the returned secattr
structure carries the same value as the "mask" element of the
request. Because the server fills in fields as the request's
"mask" selects them, the reply's "mask" also identifies which
arrays the reply carries. A client decodes a GETACL reply
according to the reply's "mask" and treats a reply whose "mask"
lacks a bit the request set as an error.</t>
          <t>A sender sets no bit in a "mask" element other than the four
defined here. A server that receives a request with an undefined
bit set either responds with ACL2ERR_INVAL or ACL3ERR_INVAL or
ignores the bit and processes the defined ones. Because a GETACL
reply's "mask" echoes the request, the reply can carry the
undefined bit.</t>
          <section anchor="setacl-mask">
            <name>The "mask" Element in a SETACL Request</name>
            <t>In a GETACL request the "mask" element selects which fields
the server fills in, as described in <xref target="getacl2"/> and
<xref target="getacl3"/>. In a SETACL request the element carries the
same bit values, and a server interprets it in one of two
ways.</t>
            <t>A server can treat the element as selective. Such a server
replaces the object's access ACL only when NA_ACL is set
and the object's default ACL only when NA_DFACL is set,
and leaves an unselected list as it found it.</t>
            <t>A server can instead disregard the element and store the
entries the request carries. Such a server rejects a
request whose "mask" is zero with ACL2ERR_INVAL or
ACL3ERR_INVAL, and otherwise replaces both of the object's
lists on every SETACL, so the entries of a list the sender
leaves empty are removed from the object rather than
preserved. When the exported file system does not store
the form of ACL that NFS_ACL carries, such a server
responds with ACL2ERR_NOTSUPP or ACL3ERR_NOTSUPP as
described in <xref target="no-acl-support"/>.</t>
            <t>A SETACL that sets one of NA_ACL and NA_DFACL and clears
the other therefore has no single meaning. Sent to a
directory that holds both an access ACL and a default ACL,
it preserves the unselected list on a server that treats
the element as selective and removes that list's entries
on a server that stores what it receives.</t>
            <t>A client cannot tell from the SETACL reply which way the
server behaved. A SETACL that sets both bits and carries both
lists has the same effect on either server, so a client that
reads back the list it does not intend to change and sends
it unaltered is unaffected by the divergence. A client that
discards its cached copy after a SETACL rather than caching
what it sent is likewise unaffected by any difference
between what it sent and what the server stored.</t>
            <t>A client that instead sends the "mask" element as the local
application supplied it, without reading back the other
list, can send a SETACL that carries one bit without the
other. Such a request relies on the server storing exactly
what it receives. A server that treats the element as
selective leaves the unsent list as it found it, so the
object ends up with a different ACL than the application
supplied.</t>
          </section>
        </section>
        <section anchor="interoperability-considerations">
          <name>Interoperability Considerations</name>
          <t>Interoperability between NFS peers that do not implement
the NFS_ACL protocol is what we already have today.
Interoperability between peers that both implement the NFS_ACL
protocol is described in the rest of this document.</t>
          <t>The following subsections briefly discuss three new
interoperability scenarios.</t>
          <section anchor="client-implements-nfsacl-server-does-not">
            <name>Client Implements NFS_ACL, Server Does Not</name>
            <t>An NFS server that implements the NFS_ACL program can
advertise it via an rpcbind registration <xref target="RFC1833"/>.</t>
            <t>A client can query rpcbind before its first NFS_ACL procedure,
or it can send a procedure and treat the outcome as a probe
for service availability. When a client sends an NFS_ACL
procedure to a server that does not implement the program,
the server responds with an RPC accept_stat of PROG_UNAVAIL
(<xref section="9" sectionFormat="of" target="RFC5531"/>).</t>
          </section>
          <section anchor="server-implements-nfsacl-client-does-not">
            <name>Server Implements NFS_ACL, Client Does Not</name>
            <t>An NFS server that implements advanced access control can
deny requests made by a client by responding with
NFSERR_ACCES or NFS3ERR_ACCES status codes, and an
NFS client has no visibility as to why the denial occurred.
Neither can that client send operations to update
the access control on file objects.</t>
            <t>This is a quality of implementation issue for the client.</t>
          </section>
          <section anchor="no-acl-support">
            <name>Client Implements, Exported File System Does Not</name>
            <t>An NFS server that implements the NFS_ACL protocol might
share both file systems that implement ACLs and
file systems that do not. In this case, NFS clients
detect the presence of an NFS_ACL service on the NFS
server.</t>
            <t>A file system that implements access control lists of a
different form than NFS_ACL carries behaves as this section
describes for every object it holds. GETACL returns a
manufactured ACL, and SETACL fails.</t>
            <t>For file objects that do not implement ACL support:</t>
            <ul spacing="normal">
              <li>
                <t>The server responds to a GETACL procedure by returning
a manufactured minimal ACL that reflects the current mode
bits of the object. The manufactured ACL has four Access
Control Entries in the "aclent" array and none in the
"dfaclent" array; the server does not manufacture a default
ACL. The "perm" element of the manufactured NA_CLASS_OBJ
entry either reflects the permission bits of the object's
owning group, as <xref target="acls-in-operation"/> describes for an
expanded list, or is 7 (NA_READ, NA_WRITE, and NA_EXEC)
regardless of those bits. A receiver therefore cannot take a
manufactured ACL whose NA_CLASS_OBJ and NA_GROUP_OBJ "perm"
elements differ as evidence of an extended ACL.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 3 procedure by
returning ACL3ERR_NOTSUPP.</t>
              </li>
              <li>
                <t>The server responds to a SETACL version 2 procedure by
returning ACL2ERR_NOTSUPP.</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-2">
      <name>NFS_ACL Version 2</name>
      <t>Version 2 of the NFS_ACL protocol is used in conjunction only with
version 2 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-2">
        <name>Data types inherited from NFS version 2</name>
        <section anchor="ftype">
          <name>ftype</name>
          <t>The enumeration "ftype" gives the type of an NFS version 2 file.
This definition comes from <xref section="2.3.2" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype {
    NFNON = 0,
    NFREG = 1,
    NFDIR = 2,
    NFBLK = 3,
    NFCHR = 4,
    NFLNK = 5
};
]]></sourcecode>
        </section>
        <section anchor="fhandle">
          <name>fhandle</name>
          <t>NFS version 2 uses a fixed-size file handle. The following definition
comes from <xref section="2.3.3" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
const FHSIZE = 32;

typedef opaque fhandle[FHSIZE];
]]></sourcecode>
        </section>
        <section anchor="timeval">
          <name>timeval</name>
          <t>NFS version 2's "timeval" structure represents the number of seconds
and microseconds since midnight January 1, 1970, Greenwich Mean Time.
This definition comes from <xref section="2.3.4" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
struct timeval {
    unsigned int seconds;
    unsigned int useconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr">
          <name>nfsfattr</name>
          <t>This document refers to NFS version 2's file attribute structure
as "nfsfattr". This is the same as the fattr structure described
in <xref section="2.3.5" sectionFormat="of" target="RFC1094"/>:</t>
          <sourcecode type="xdr"><![CDATA[
struct fattr {
    ftype        type;
    unsigned int mode;
    unsigned int nlink;
    unsigned int uid;
    unsigned int gid;
    unsigned int size;
    unsigned int blocksize;
    unsigned int rdev;
    unsigned int blocks;
    unsigned int fsid;
    unsigned int fileid;
    timeval      atime;
    timeval      mtime;
    timeval      ctime;
};
]]></sourcecode>
        </section>
        <section anchor="defined-error-numbers">
          <name>Defined Error Numbers</name>
          <t><xref section="2.3.1" sectionFormat="of" target="RFC1094"/> describes an enumerated type called
"stat" which provides a status code for NFS version 2 results.
A matching type called "aclstat2" is defined in this document
for the similar purpose of returning NFS_ACL version 2 procedure
status codes. The numeric values of these two types match up,
though aclstat2 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
          <t>The "stat" type in <xref section="2.3.1" sectionFormat="of" target="RFC1094"/> does not define a
status code corresponding to the POSIX EINVAL error. However,
existing NFS_ACL version 2 server implementations return the value
22 (the numeric value of EINVAL) when a client presents an invalid
argument to a procedure. The aclstat2 type therefore defines
ACL2ERR_INVAL with that value, even though the NFS version 2 "stat"
type has no matching code.</t>
          <t>Similarly, the "stat" type does not define a status code that
reports that a requested operation is not supported. The original
NFS_ACL version 2 server implementation returns the value 45 (its
NFSERR_OPNOTSUPP status code) when a client directs an operation at a
file object whose file system does not support ACLs. The aclstat2
type therefore defines ACL2ERR_NOTSUPP with that value. A server
returns ACL2ERR_NOTSUPP in NFS_ACL version 2 results; the numeric
value 10004 that NFS version 3 assigns to NFS3ERR_NOTSUPP is not used
in NFS_ACL version 2 results.</t>
          <sourcecode type="xdr"><![CDATA[
enum aclstat2 {
    ACL2_OK = 0,
    ACL2ERR_PERM = 1,
    ACL2ERR_NOENT = 2,
    ACL2ERR_IO = 5,
    ACL2ERR_ACCES = 13,
    ACL2ERR_INVAL = 22,
    ACL2ERR_NOSPC = 28,
    ACL2ERR_ROFS = 30,
    ACL2ERR_NOTSUPP = 45,
    ACL2ERR_DQUOT = 69,
    ACL2ERR_STALE = 70
};
]]></sourcecode>
          <t>These status codes carry the following meanings:</t>
          <dl>
            <dt>ACL2ERR_PERM</dt>
            <dd>
              <t>Not owner. The caller does not have correct ownership to perform the requested operation.</t>
            </dd>
            <dt>ACL2ERR_NOENT</dt>
            <dd>
              <t>No such file or directory. The file or directory name specified does not exist.</t>
            </dd>
            <dt>ACL2ERR_IO</dt>
            <dd>
              <t>Some sort of hard error occurred when the operation was in progress.  This could be a disk error, for example.</t>
            </dd>
            <dt>ACL2ERR_ACCES</dt>
            <dd>
              <t>Permission denied.  The caller does not have the correct permission to perform the requested operation.</t>
            </dd>
            <dt>ACL2ERR_INVAL</dt>
            <dd>
              <t>An invalid or unsupported argument was specified for procedure.</t>
            </dd>
            <dt>ACL2ERR_NOSPC</dt>
            <dd>
              <t>No space left on device.  The operation caused the server's file system to reach its limit.</t>
            </dd>
            <dt>ACL2ERR_ROFS</dt>
            <dd>
              <t>Read-only file system.  Write attempted on a read-only file system.</t>
            </dd>
            <dt>ACL2ERR_NOTSUPP</dt>
            <dd>
              <t>Operation is not supported.</t>
            </dd>
            <dt>ACL2ERR_DQUOT</dt>
            <dd>
              <t>Disk quota exceeded.  The client's disk quota on the server has been exceeded.</t>
            </dd>
            <dt>ACL2ERR_STALE</dt>
            <dd>
              <t>The "fhandle" given in the arguments was invalid.  That is, the file referred to by that file handle no longer exists, or access to it has been revoked.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="server-procedures">
        <name>Server Procedures</name>
        <t>The ERRORS subsection of each procedure enumerates the status
values a server returns from that procedure.</t>
        <section anchor="procedure-0-null-no-operation">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implementation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors">
            <name>ERRORS</name>
            <t>Since the NULL procedure returns no result, it can not return an
NFS_ACL error status code. However, some server implementations may
return RPC-level errors based on security or authentication policy
settings.</t>
          </section>
        </section>
        <section anchor="getacl2">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-1">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2args {
    fhandle fh;
    unsigned int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-1">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL2resok {
    fattr attr;
    secattr acl;
};

union GETACL2res switch (aclstat2 status) {
case ACL2_OK:
    GETACL2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-1">
            <name>DESCRIPTION</name>
            <t>The GETACL procedure retrieves Access Control List
information associated with the file system object
specified by the GETACL2args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, or SYMLINK procedures,
or the MOUNT service, as described in <xref target="RFC1094"/>.</t>
            <t>The GETACL2args.mask field specifies which information
is to be returned in the response:</t>
            <ul spacing="normal">
              <li>
                <t>If the NA_ACL bit is set, the server fills in the
object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_ACLCNT bit is set, the server fills in
the number of ACEs that are in the object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_DFACL bit is set, the server fills in
the object's default ACL.</t>
              </li>
              <li>
                <t>If the NA_DFACLCNT bit is set, the server fills in
the number of ACEs that are in the object's default ACL.</t>
              </li>
            </ul>
            <t>The server fills in a count whenever either bit for that
array is set, and fills in the array itself only when the
array's own bit is set. An array the server does not fill in
is empty on the wire. The reply's "mask" element carries the
request's value (see <xref target="secattr"/>).</t>
            <t>If the GETACL procedure is successful, the server sets the
GETACL2res.status field to ACL2_OK. It fills in the
GETACL2resok.attr field with the file object's current
file attributes, as detailed in <xref target="RFC1094"/>. Lastly,
it fills in the GETACL2resok.acl field with two counted
arrays of Access Control Entries (ACEs).</t>
            <t>Otherwise, GETACL2res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-1">
            <name>IMPLEMENTATION</name>
            <t>When GETACL2args.fh represents a file object that does not currently
have an ACL associated with it or does not implement support
for ACLs, the server responds by returning a manufactured
minimal NFS ACL that reflects the current owner, group, and
mode bits of the object (see <xref target="no-acl-support"/>).</t>
            <t>A default ACL applies only to a directory object. When
GETACL2args.fh represents an object that is not a directory,
that object has no default ACL. If the request's NA_DFACL or
NA_DFACLCNT bit is set, the server returns an empty dfaclent
array and a dfaclcnt of zero rather than reporting an error.</t>
          </section>
          <section anchor="errors-1">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_INVAL</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-2-setacl-set-or-replace-an-access-control-list">
          <name>Procedure 2: SETACL - Set or replace an Access Control List</name>
          <section anchor="arguments-2">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL2args {
    fhandle fh;
    secattr acl;
};
]]></sourcecode>
          </section>
          <section anchor="results-2">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL2resok {
    fattr attr;
};

union SETACL2res switch (aclstat2 status) {
case ACL2_OK:
    SETACL2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-2">
            <name>DESCRIPTION</name>
            <t>The SETACL procedure replaces the Access Control Lists
associated with the file system object specified by the
SETACL2args.fh field with the ACLs specified by the
SETACL2args.acl field.  The client obtains the file
handle using one of the NFS version 3 LOOKUP, CREATE,
MKDIR, SYMLINK procedures, or the MOUNT service, as
described in <xref target="RFC1094"/>.</t>
            <t>To remove extended access control from a file object, a client
uses SETACL to replace the object's ACL with a minimal NFS ACL
(see <xref target="acls-in-operation"/>). To remove a directory's default
ACL, a client sends a SETACL with both the NA_ACL and NA_DFACL
bits set, an empty "dfaclent" array, and the directory's
current access ACL in "aclent" (see <xref target="setacl-mask"/>).</t>
            <t>If the SETACL procedure is successful, the server sets the
SETACL2res.status field to ACL2_OK and fills in the
SETACL2resok.attr field with the file object's new
file attributes, as detailed in <xref target="RFC1094"/>.</t>
            <t>Otherwise, SETACL2res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-2">
            <name>IMPLEMENTATION</name>
            <t>A successful reply means that the exported file system has
verified the new ACL, but does not mean that the change has
reached stable storage.</t>
            <t>Changing a file object's ACL changes the object's ctime.
The ctime change is reflected in the attributes returned
in the SETACL response.</t>
            <t>A high-quality server implementation ensures that a
GETACL procedure running concurrently with a SETACL
procedure does not return partially updated (torn)
ACL contents. However, a failed SETACL may partially
change a file's ACLs.</t>
            <t>When SETACL2args.fh represents a file object that does
not implement support for ACLs, the server responds by
setting SETACL2res.status to ACL2ERR_NOTSUPP.</t>
            <t>When the new ACL does not contain at least the minimal
set of ACEs (as described in <xref target="acls-in-operation"/>), the
server responds by setting SETACL2res.status to
ACL2ERR_INVAL.</t>
            <t>Servers differ in how they treat the "mask" element of
SETACL2args.acl. <xref target="setacl-mask"/> describes the divergence
and how a client avoids it.</t>
          </section>
          <section anchor="errors-2">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_ROFS</t>
              </li>
              <li>
                <t>ACL2ERR_PERM</t>
              </li>
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_INVAL</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_NOTSUPP</t>
              </li>
              <li>
                <t>ACL2ERR_DQUOT</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-3-getattr-get-file-attributes">
          <name>Procedure 3: GETATTR - Get file attributes</name>
          <section anchor="arguments-3">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2args {
    fhandle fh;
};
]]></sourcecode>
          </section>
          <section anchor="results-3">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETATTR2resok {
    fattr attr;
};

union GETATTR2res switch (aclstat2 status) {
case ACL2_OK:
    GETATTR2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-3">
            <name>DESCRIPTION</name>
            <t>The GETATTR procedure retrieves the current file
attributes associated with the file system object
specified by the GETATTR2args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, SYMLINK procedures,
or the MOUNT service, as described in <xref target="RFC1094"/>.</t>
            <t>If the GETATTR procedure is successful, the server
sets the GETATTR2res.status field to ACL2_OK, and
fills in the GETATTR2resok.attr field with the file
object's current file attributes, as detailed in
<xref target="RFC1094"/>.</t>
            <t>Otherwise, GETATTR2res.status contains an error
status on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-3">
            <name>IMPLEMENTATION</name>
            <t>Refer to <xref section="2.3.5" sectionFormat="of" target="RFC1094"/> for details
about the content of the returned file attributes.</t>
          </section>
          <section anchor="errors-3">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-4-access-check-access-permission">
          <name>Procedure 4: ACCESS - Check access permission</name>
          <section anchor="arguments-4">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct ACCESS2args {
    fhandle fh;
    unsigned int access;
};
]]></sourcecode>
          </section>
          <section anchor="results-4">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
const ACCESS2_READ = 0x1;       /* read data or readdir a directory */
const ACCESS2_LOOKUP = 0x2;     /* lookup a name in a directory */
const ACCESS2_MODIFY = 0x4;     /* rewrite existing file data or */
                                /* modify existing directory entries */
const ACCESS2_EXTEND = 0x8;     /* write new data or add directory entries */
const ACCESS2_DELETE = 0x10;    /* delete existing directory entry */
const ACCESS2_EXECUTE = 0x20;   /* execute file (no meaning for a directory) */

struct ACCESS2resok {
    fattr attr;
    unsigned int access;
};

union ACCESS2res switch (aclstat2 status) {
case ACL2_OK:
    ACCESS2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-4">
            <name>DESCRIPTION</name>
            <t>The ACCESS procedure determines the access rights
that a user, as identified by the RPC credentials
in the request, has with respect to the file handle
specified by the ACCESS2args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, SYMLINK procedures,
or the MOUNT service, as described in <xref target="RFC1094"/>.
The client encodes the set of permissions that are
to be checked in the ACCESS2args.access field.</t>
            <t>The following access permissions may be requested:</t>
            <dl>
              <dt>ACCESS2_READ</dt>
              <dd>
                <t>Read data from file or read a directory.</t>
              </dd>
              <dt>ACCESS2_LOOKUP</dt>
              <dd>
                <t>Look up a name in a directory (no meaning for non-directory objects).</t>
              </dd>
              <dt>ACCESS2_MODIFY</dt>
              <dd>
                <t>Rewrite existing file data or modify existing directory entries.</t>
              </dd>
              <dt>ACCESS2_EXTEND</dt>
              <dd>
                <t>Write new data or add directory entries.</t>
              </dd>
              <dt>ACCESS2_DELETE</dt>
              <dd>
                <t>Delete an existing directory entry (no meaning for non-directory objects).</t>
              </dd>
              <dt>ACCESS2_EXECUTE</dt>
              <dd>
                <t>Execute file (no meaning for a directory).</t>
              </dd>
            </dl>
            <t>A server grants no permission that this protocol does not
define. A bit set in ACCESS2args.access that is not listed
above is clear in ACCESS2resok.access.</t>
            <t>If the ACCESS procedure is successful, the server
sets the ACCESS2res.status field to ACL2_OK. It
fills in the ACCESS2resok.attr field with the file
object's current file attributes, as detailed in
<xref target="RFC1094"/>. Lastly, it encodes the set of
permissions that the requesting user is granted
in the ACCESS2resok.access field.</t>
          </section>
          <section anchor="implementation-4">
            <name>IMPLEMENTATION</name>
            <t>In the NFS version 2 protocol, the only reliable way to
determine whether an operation is allowed is to try it
and see if it succeeded or failed. Using the ACCESS
procedure in the NFS_ACL version 2 protocol, a client can
ask the server to indicate whether or not one or more
classes of operations are permitted.</t>
            <t>In general, it is not sufficient for a 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 2 protocol server may not be in the same ID
space as the NFS version 2 protocol client. In these cases,
the NFS version 2 protocol client can not reliably perform
an access check with only current file attributes.</t>
            <t>The information returned by the server in response to an
ACCESS call is advisory only. It was correct at the exact
time that the server performed the checks, but not
necessarily afterwards. The server can revoke access
permission to a file object at any time.</t>
            <t>The NFS_ACL version 2 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.</t>
            <t>Many implementations do not directly support the
ACCESS2_DELETE permission. Operating systems like UNIX
may ignore the ACCESS2_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 ACCESS2_DELETE bit set to 0, indicating that
the client does not have this permission.</t>
            <t>The server should return a status of ACL2_OK if no
errors occurred that prevented the server from making
the required access checks.</t>
          </section>
          <section anchor="errors-4">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-5-getxattrdir-get-named-attribute-directory">
          <name>Procedure 5: GETXATTRDIR - Get named attribute directory</name>
          <section anchor="arguments-5">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR2args {
    fhandle fh;
    bool create;
};
]]></sourcecode>
          </section>
          <section anchor="results-5">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR2resok {
    fhandle fh;
    fattr attr;
};

union GETXATTRDIR2res switch (aclstat2 status) {
case ACL2_OK:
    GETXATTRDIR2resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-5">
            <name>DESCRIPTION</name>
            <t><xref section="5.3" sectionFormat="of" target="RFC8881"/> defines a set of generic file attributes known
as "named attributes". The GETXATTRDIR procedure extends this facility
into the NFSv2 protocol.</t>
            <t>The GETXATTRDIR procedure obtains the file handle of the named attribute
directory associated with the file handle in the GETXATTRDIR2args.fh
field. This directory contains only objects of type NFREG.</t>
            <t>If the GETXATTRDIR procedure is successful, the server sets the
GETXATTRDIR2res.status field to ACL2_OK.
It fills in the GETXATTRDIR2resok.fh field with a file handle that
the client may use to look up the target file's named attributes.
It fills in the GETXATTRDIR2resok.attr field with the named attribute
directory's current file attributes, as detailed in <xref target="RFC1094"/>.</t>
            <t>Using the file handle returned in GETXATTRDIR2resok.fh, a client
can utilize the READDIR and LOOKUP procedures to obtain file handles
for the named attributes associated with the target file system object.</t>
            <t>If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR2args.create boolean
field is set to false, the server returns ACL2ERR_NOENT.
If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR2args.create boolean
field is set to true, the server attempts to create the named attribute
directory before returning a result.
If the target file currently has a named attribute directory
associated with it and the GETXATTRDIR2args.create boolean is set
to true, the server returns the file handle of that named attribute
directory.</t>
            <t>If the RPC user does not have read access to the target file, or
if the GETXATTRDIR operation is to create a named attribute directory
and the RPC user does not have permission to do so, the server returns
ACL2ERR_ACCES in the GETXATTRDIR2res.status field.</t>
            <t>If the target file handle designates an object not of type NFREG or
NFDIR, the server returns the value ACL2ERR_INVAL in the GETXATTRDIR2res.status
field. Neither named attributes nor named attribute directories have
their own named attributes.</t>
            <t>Note: This operation is equivalent to the NFSv4 OPENATTR operation as
specified in <xref section="16.17" sectionFormat="of" target="RFC7530"/> and <xref section="18.17" sectionFormat="of" target="RFC8881"/>.</t>
          </section>
          <section anchor="implementation-5">
            <name>IMPLEMENTATION</name>
            <t>Server implementers are free to choose not to implement this procedure.
In this case, the server returns the RPC-level error PROC_UNAVAIL.</t>
            <t>If the server implementation does implement the GETXATTRDIR procedure
but the shared file system containing the file object specified by the
file handle in the GETXATTRDIR2args.fh field does not support named
attributes, the server returns ACL2ERR_NOTSUPP in the
GETXATTRDIR2res.status field.</t>
          </section>
          <section anchor="errors-5">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL2ERR_PERM</t>
              </li>
              <li>
                <t>ACL2ERR_NOENT</t>
              </li>
              <li>
                <t>ACL2ERR_IO</t>
              </li>
              <li>
                <t>ACL2ERR_ACCES</t>
              </li>
              <li>
                <t>ACL2ERR_INVAL</t>
              </li>
              <li>
                <t>ACL2ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL2ERR_ROFS</t>
              </li>
              <li>
                <t>ACL2ERR_STALE</t>
              </li>
              <li>
                <t>ACL2ERR_NOTSUPP</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="nfsacl-version-3">
      <name>NFS_ACL Version 3</name>
      <t>Version 3 of the NFS_ACL protocol is used in conjunction only with
version 3 of the NFS protocol.</t>
      <section anchor="data-types-inherited-from-nfs-version-3">
        <name>Data types inherited from NFS version 3</name>
        <section anchor="scalar-data-types">
          <name>Scalar Data types</name>
          <t>These are defined in <xref section="2.5" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned hyper uint64;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef unsigned long uint32;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 fileid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 uid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 gid3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint64 size3;
]]></sourcecode>
          <sourcecode type="xdr"><![CDATA[
typedef uint32 mode3;
]]></sourcecode>
        </section>
        <section anchor="ftype3">
          <name>ftype3</name>
          <t>The enumeration "ftype3" represents the type of a file object.
This definition is further explained in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
enum ftype3 {
    NF3REG    = 1,
    NF3DIR    = 2,
    NF3BLK    = 3,
    NF3CHR    = 4,
    NF3LNK    = 5,
    NF3SOCK   = 6,
    NF3FIFO   = 7
};
]]></sourcecode>
        </section>
        <section anchor="specdata3">
          <name>specdata3</name>
          <sourcecode type="xdr"><![CDATA[
struct specdata3 {
    uint32     specdata1;
    uint32     specdata2;
};
]]></sourcecode>
          <t>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. 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.</t>
          <t>Further detail is available in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
        </section>
        <section anchor="nfsfh3">
          <name>nfs_fh3</name>
          <t>The nfs_fh3 data type is a variable-length opaque object returned
by the NFS version 3 LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD,
or READDIRPLUS procedures.
A client uses this handle during subsequent NFS operations
to reference the file. This definition comes from
<xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
NFS3_FHSIZE 64
]]></sourcecode>
          <t>The maximum size in bytes of the opaque file handle.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfs_fh3 {
    opaque       data<NFS3_FHSIZE>;
};
]]></sourcecode>
          <t>To the client, a 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. Further, 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.</t>
          <t>Servers may revoke 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, ACL3ERR_STALE,
is returned.</t>
        </section>
        <section anchor="nfstime3">
          <name>nfstime3</name>
          <t>NFS version 3's "nfstime3" structure represents the number of
seconds and nanoseconds since midnight January 1, 1970 Greenwich
Mean Time. Further details are in <xref section="2.6" sectionFormat="of" target="RFC1813"/>.</t>
          <sourcecode type="xdr"><![CDATA[
struct nfstime3 {
    uint32   seconds;
    uint32   nseconds;
};
]]></sourcecode>
        </section>
        <section anchor="nfsfattr3">
          <name>nfsfattr3</name>
          <t>This document refers to NFS version 3's file attribute structure
as "nfsfattr3". This is the same as the fattr3 structure described
in <xref section="2.6" sectionFormat="of" target="RFC1813"/>. A definition of the bit fields in
the "mode" element, which relate to traditional file system access
permissions, can also be found there.</t>
          <sourcecode type="xdr"><![CDATA[
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;
};
]]></sourcecode>
        </section>
        <section anchor="postopattr">
          <name>post_op_attr</name>
          <t>The NFS version 3 "post_op_attr" data type returns file
attributes that are not directly involved in the requested
procedure. See <xref section="2.6" sectionFormat="of" target="RFC1813"/> for more
information.</t>
          <sourcecode type="xdr"><![CDATA[
union post_op_attr switch (bool attributes_follow) {
case TRUE:
    fattr3   attributes;
case FALSE:
    void;
};
]]></sourcecode>
          <t>The format of this data type appears to make returning file
attributes optional. However, server implementers are strongly
encouraged to make a best effort to return attributes whenever
possible, even when returning an error.</t>
        </section>
      </section>
      <section anchor="error-values">
        <name>Error Values</name>
        <t><xref section="2.5" sectionFormat="of" target="RFC1813"/> describes an enumerated type called
"nfsstat3" which provides a status code for NFS version 3 procedure
results.
A matching type called "aclstat3" is defined in this document
for the similar purpose of returning NFS_ACL version 3 procedure
status codes. The numeric values of these two types match up,
although aclstat3 omits some codes that are not relevant to the
NFS_ACL protocol.</t>
        <sourcecode type="xdr"><![CDATA[
enum aclstat3 {
    ACL3_OK             = 0,
    ACL3ERR_PERM        = 1,
    ACL3ERR_NOENT       = 2,
    ACL3ERR_IO          = 5,
    ACL3ERR_ACCES       = 13,
    ACL3ERR_INVAL       = 22,
    ACL3ERR_NOSPC       = 28,
    ACL3ERR_ROFS        = 30,
    ACL3ERR_DQUOT       = 69,
    ACL3ERR_STALE       = 70,
    ACL3ERR_BADHANDLE   = 10001,
    ACL3ERR_NOTSUPP     = 10004,
    ACL3ERR_SERVERFAULT = 10006,
    ACL3ERR_JUKEBOX     = 10008
};
]]></sourcecode>
        <t>These status codes carry the following meanings:</t>
        <dl>
          <dt>ACL3_OK</dt>
          <dd>
            <t>Indicates the call completed successfully.</t>
          </dd>
          <dt>ACL3ERR_PERM</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>ACL3ERR_NOENT</dt>
          <dd>
            <t>No such file or directory. The file or directory name specified does not exist.</t>
          </dd>
          <dt>ACL3ERR_IO</dt>
          <dd>
            <t>I/O error. A hard error (for example, a disk error) occurred while processing the requested operation.</t>
          </dd>
          <dt>ACL3ERR_ACCES</dt>
          <dd>
            <t>Permission denied. The caller does not have the correct permission to perform the requested operation. Contrast this with ACL3ERR_PERM, which restricts itself to owner or privileged user permission failures.</t>
          </dd>
          <dt>ACL3ERR_INVAL</dt>
          <dd>
            <t>An invalid or unsupported argument was specified for procedure.</t>
          </dd>
          <dt>ACL3ERR_NOSPC</dt>
          <dd>
            <t>No space left on device. The operation would have caused the server's file system to exceed its limit.</t>
          </dd>
          <dt>ACL3ERR_ROFS</dt>
          <dd>
            <t>Read-only file system. A modifying operation was attempted on a read-only file system.</t>
          </dd>
          <dt>ACL3ERR_DQUOT</dt>
          <dd>
            <t>Resource (quota) hard limit exceeded. The user's resource limit on the server has been exceeded.</t>
          </dd>
          <dt>ACL3ERR_STALE</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>ACL3ERR_BADHANDLE</dt>
          <dd>
            <t>Illegal NFS file handle. The file handle failed internal consistency checks.</t>
          </dd>
          <dt>ACL3ERR_NOTSUPP</dt>
          <dd>
            <t>Operation is not supported.</t>
          </dd>
          <dt>ACL3ERR_SERVERFAULT</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>ACL3ERR_JUKEBOX</dt>
          <dd>
            <t>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.</t>
          </dd>
        </dl>
      </section>
      <section anchor="server-procedures-1">
        <name>Server Procedures</name>
        <t>The ERRORS subsection of each procedure enumerates the status
values a server returns from that procedure.</t>
        <section anchor="procedure-0-null-no-operation-1">
          <name>Procedure 0: NULL - No Operation</name>
          <section anchor="arguments-6">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="results-6">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
void;
]]></sourcecode>
          </section>
          <section anchor="description-6">
            <name>DESCRIPTION</name>
            <t>This is the usual NULL procedure with a void argument and void result.</t>
          </section>
          <section anchor="implementation-6">
            <name>IMPLEMENTATION</name>
            <t>It is important that this procedure do no work at all so that clients
can use it to measure the overhead of processing a service request.
By convention, the NULL procedure should never require any
authentication.
A server implementation may choose to ignore this convention, if
responding to the NULL procedure call acknowledges the existence
of a resource to an unauthenticated client.</t>
          </section>
          <section anchor="errors-6">
            <name>ERRORS</name>
            <t>Since the NULL procedure takes no argument and returns no
result, it can not return an NFS or NFS_ACL error status code.
However, some server implementations may return RPC errors
based on security or authentication policy settings.</t>
          </section>
        </section>
        <section anchor="getacl3">
          <name>Procedure 1: GETACL - Retrieve an Access Control List</name>
          <section anchor="arguments-7">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL3args {
    nfs_fh3 fh;
    unsigned int mask;
};
]]></sourcecode>
          </section>
          <section anchor="results-7">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETACL3resok {
    post_op_attr attr;
    secattr acl;
};

struct GETACL3resfail {
    post_op_attr attr;
};

union GETACL3res switch (aclstat3 status) {
case ACL3_OK:
    GETACL3resok resok;
default:
    GETACL3resfail resfail;
};
]]></sourcecode>
          </section>
          <section anchor="description-7">
            <name>DESCRIPTION</name>
            <t>The GETACL procedure retrieves Access Control List
information associated with the file system object
specified by the GETACL3args.fh field. The client
obtains this file handle using one of the NFS
version 2 LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD,
or READDIRPLUS procedures, or the MOUNT service,
as described in <xref target="RFC1813"/>.</t>
            <t>The GETACL3args.mask field specifies which information
is to be returned in the response:</t>
            <ul spacing="normal">
              <li>
                <t>If the NA_ACL bit is set, the server fills in the
object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_ACLCNT bit is set, the server fills in
the number of ACEs that are in the object's access ACL.</t>
              </li>
              <li>
                <t>If the NA_DFACL bit is set, the server fills in
the object's default ACL.</t>
              </li>
              <li>
                <t>If the NA_DFACLCNT bit is set, the server fills in
the number of ACEs that are in the object's default ACL.</t>
              </li>
            </ul>
            <t>The server fills in a count whenever either bit for that
array is set, and fills in the array itself only when the
array's own bit is set. An array the server does not fill in
is empty on the wire. The reply's "mask" element carries the
request's value (see <xref target="secattr"/>).</t>
            <t>If the GETACL procedure is successful, the server sets the
GETACL3res.status field to ACL3_OK. It fills in the
GETACL3resok.attr field with the file object's post
operation file attributes, as detailed in <xref target="RFC1813"/>.
Lastly, it fills in the GETACL3resok.acl field with two
counted arrays of Access Control Entries (ACEs).</t>
            <t>Otherwise, GETACL3res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-7">
            <name>IMPLEMENTATION</name>
            <t>When GETACL3args.fh represents a file object that does
not currently have an ACL associated with it or does not
implement support for ACLs, the server responds by
returning a manufactured minimal NFS ACL that reflects
the current owner, group, and mode bits of the object
(see <xref target="no-acl-support"/>).</t>
            <t>A default ACL applies only to a directory object. When
GETACL3args.fh represents an object that is not a directory,
that object has no default ACL. If the request's NA_DFACL or
NA_DFACLCNT bit is set, the server returns an empty dfaclent
array and a dfaclcnt of zero rather than reporting an error.</t>
          </section>
          <section anchor="errors-7">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_ACCES</t>
              </li>
              <li>
                <t>ACL3ERR_INVAL</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_BADHANDLE</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-2-setacl-set-or-replace-an-access-control-list-1">
          <name>Procedure 2: SETACL - Set or replace an Access Control List</name>
          <section anchor="arguments-8">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL3args {
    nfs_fh3 fh;
    secattr acl;
};
]]></sourcecode>
          </section>
          <section anchor="results-8">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct SETACL3resok {
    post_op_attr attr;
};

struct SETACL3resfail {
    post_op_attr attr;
};

union SETACL3res switch (aclstat3 status) {
case ACL3_OK:
    SETACL3resok resok;
default:
    SETACL3resfail resfail;
};
]]></sourcecode>
          </section>
          <section anchor="description-8">
            <name>DESCRIPTION</name>
            <t>The SETACL procedure replaces the Access Control Lists
associated with the file system object specified by the
SETACL3args.fh field with the ACLs specified by the
SETACL3args.acl field.  The client obtains the file
handle using one of the NFS version 3 LOOKUP, CREATE,
MKDIR, MKNOD, SYMLINK, or READDIRPLUS procedures, or
the MOUNT service, as described in <xref target="RFC1813"/>.</t>
            <t>To remove extended access control from a file object, a client
uses SETACL to replace the object's ACL with a minimal NFS ACL
(see <xref target="acls-in-operation"/>). To remove a directory's default
ACL, a client sends a SETACL with both the NA_ACL and NA_DFACL
bits set, an empty "dfaclent" array, and the directory's
current access ACL in "aclent" (see <xref target="setacl-mask"/>).</t>
            <t>If the SETACL procedure is successful, the server sets
the SETACL3res.status field to ACL3_OK and fills in the
SETACL3resok.attr field with the file object's post
operation file attributes, as detailed in <xref target="RFC1813"/>.</t>
            <t>Otherwise, SETACL3res.status contains an error status
on failure and no other results are returned.</t>
          </section>
          <section anchor="implementation-8">
            <name>IMPLEMENTATION</name>
            <t>A successful reply means that the exported file system has
verified the new ACL, but does not mean that the change has
reached stable storage.</t>
            <t>Changing a file object's ACL changes the object's ctime.
The ctime change is reflected in the attributes returned
in the SETACL response.</t>
            <t>A high-quality server implementation ensures that a
GETACL procedure running concurrently with a SETACL
procedure does not return partially updated (torn)
ACL contents. However, a failed SETACL may partially
change a file's ACLs.</t>
            <t>When SETACL3args.fh represents a file object that does
not implement support for ACLs, the server responds
by setting SETACL3res.status to ACL3ERR_NOTSUPP.</t>
            <t>When SETACL3args.acl does not contain at least the
minimal set of ACEs (as described in
<xref target="acls-in-operation"/>), the server responds by setting
SETACL3res.status to ACL3ERR_INVAL.</t>
            <t>Servers differ in how they treat the "mask" element of
SETACL3args.acl. <xref target="setacl-mask"/> describes the divergence
and how a client avoids it.</t>
          </section>
          <section anchor="errors-8">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_PERM</t>
              </li>
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_ACCES</t>
              </li>
              <li>
                <t>ACL3ERR_INVAL</t>
              </li>
              <li>
                <t>ACL3ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL3ERR_ROFS</t>
              </li>
              <li>
                <t>ACL3ERR_DQUOT</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_BADHANDLE</t>
              </li>
              <li>
                <t>ACL3ERR_NOTSUPP</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="procedure-3-getxattrdir-get-named-attribute-directory">
          <name>Procedure 3: GETXATTRDIR - Get named attribute directory</name>
          <section anchor="arguments-9">
            <name>ARGUMENTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR3args {
    nfs_fh3 fh;
    bool create;
};
]]></sourcecode>
          </section>
          <section anchor="results-9">
            <name>RESULTS</name>
            <sourcecode type="xdr"><![CDATA[
struct GETXATTRDIR3resok {
    nfs_fh3 fh;
    post_op_attr attr;
};

union GETXATTRDIR3res switch (aclstat3 status) {
case ACL3_OK:
    GETXATTRDIR3resok resok;
default:
    void;
};
]]></sourcecode>
          </section>
          <section anchor="description-9">
            <name>DESCRIPTION</name>
            <t><xref section="5.3" sectionFormat="of" target="RFC8881"/> defines a set of generic file attributes known
as "named attributes". The GETXATTRDIR procedure extends this facility
into the NFSv3 protocol.</t>
            <t>The GETXATTRDIR procedure obtains the file handle of the named attribute
directory associated with the file handle in the GETXATTRDIR3args.fh
field. This directory contains only objects of type NF3REG.</t>
            <t>If the GETXATTRDIR procedure is successful, the server sets the
GETXATTRDIR3res.status field to ACL3_OK.
It fills in the GETXATTRDIR3resok.fh field with a file handle that
the client may use to look up the target file's named attributes.
It fills in the GETXATTRDIR3resok.attr field with the named attribute
directory's current file attributes, as detailed in <xref target="RFC1813"/>.</t>
            <t>Using the file handle returned in GETXATTRDIR3resok.fh, a client
can utilize the READDIR and LOOKUP procedures to obtain file handles
for the named attributes associated with the target file system object.</t>
            <t>If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR3args.create boolean
field is set to false, the server returns ACL3ERR_NOENT.
If the target file object does not currently have a named attribute
directory associated with it and the GETXATTRDIR3args.create boolean
field is set to true, the server attempts to create the named attribute
directory before returning a result.
If the target file currently has a named attribute directory
associated with it and the GETXATTRDIR3args.create boolean is set
to true, the server returns the file handle of that named attribute
directory.</t>
            <t>If the RPC user does not have read access to the target file, or
if the GETXATTRDIR operation is to create a named attribute directory
and the RPC user does not have permission to do so, the server returns
ACL3ERR_ACCES in the GETXATTRDIR3res.status field.</t>
            <t>If the target file handle designates an object not of type NF3REG or
NF3DIR, the server returns the value ACL3ERR_INVAL in the
GETXATTRDIR3res.status field. Neither named attributes nor named attribute
directories have their own named attributes.</t>
            <t>Note: This operation is equivalent to the NFSv4 OPENATTR operation as
specified in <xref section="16.17" sectionFormat="of" target="RFC7530"/> and <xref section="18.17" sectionFormat="of" target="RFC8881"/>.</t>
          </section>
          <section anchor="implementation-9">
            <name>IMPLEMENTATION</name>
            <t>Server implementers are free to choose not to implement this procedure.
In this case, the server returns the RPC-level error PROC_UNAVAIL.</t>
            <t>If the server implementation does implement the GETXATTRDIR procedure
but the shared file system containing the file object specified by the
file handle in the GETXATTRDIR3args.fh field does not support named
attributes, the server returns ACL3ERR_NOTSUPP in the GETXATTRDIR3res.status
field.</t>
          </section>
          <section anchor="errors-9">
            <name>ERRORS</name>
            <ul spacing="normal">
              <li>
                <t>ACL3ERR_PERM</t>
              </li>
              <li>
                <t>ACL3ERR_NOENT</t>
              </li>
              <li>
                <t>ACL3ERR_IO</t>
              </li>
              <li>
                <t>ACL3ERR_ACCES</t>
              </li>
              <li>
                <t>ACL3ERR_INVAL</t>
              </li>
              <li>
                <t>ACL3ERR_NOSPC</t>
              </li>
              <li>
                <t>ACL3ERR_ROFS</t>
              </li>
              <li>
                <t>ACL3ERR_STALE</t>
              </li>
              <li>
                <t>ACL3ERR_BADHANDLE</t>
              </li>
              <li>
                <t>ACL3ERR_NOTSUPP</t>
              </li>
              <li>
                <t>ACL3ERR_SERVERFAULT</t>
              </li>
              <li>
                <t>ACL3ERR_JUKEBOX</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="implementation-issues">
      <name>Implementation Issues</name>
      <section anchor="permission-issues">
        <name>Permission issues</name>
        <t>The NFS protocol, strictly speaking, does not
define the permission checking used by NFS servers. However, it
is expected that an NFS server will do normal operating system
permission checking using AUTH_SYS style authentication as
the basis of its protection mechanism, or another stronger
form of authentication such as RPCSEC_GSS. With
AUTH_SYS 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.</t>
        <t>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.</t>
        <t>In POSIX-based 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
POSIX-based NFS server by default maps uid 0 to a distinguished
value (for instance, 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.</t>
      </section>
      <section anchor="dup-req-cache">
        <name>Duplicate Request Cache</name>
        <t>The typical NFS protocol failure recovery model
uses client time-out and retry to handle server crashes,
network partitions, and lost server replies. A retried
request is referred to as a duplicate of the original.</t>
        <t>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. A CREATE request, for example,
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.</t>
        <t>The side effects caused by performing a duplicate
non-idempotent request can be destructive. A duplicate
file truncation can result in lost writes. It is the
inherent stateless design of the NFS protocol on top
of an unreliable RPC transport that yields the
possibility of destructive replays of non-idempotent
requests. Even in an implementation of the NFS protocol
over a reliable connection-oriented transport,
a connection break with automatic reestablishment
requires duplicate request processing: the client
retransmits requests that were pending before the
connection loss, and the server needs to recognize
and deal with potential duplicate non-idempotent requests.</t>
        <t>Most NFS server implementations maintain a cache of
recent requests, called the duplicate request cache,
for recognizing duplicate non-idempotent requests. If
the server receives a request and recognizes it as a
duplicate of a recently completed request, the server
returns the original completion status instead of
processing the duplicate request again.</t>
        <t>A description of an early implementation of a
duplicate request cache can be found in <xref target="Juszczak"/>.</t>
        <t>A retransmitted SETACL that a server processes after a later
SETACL on the same object reinstates the older ACL. A duplicate
request cache narrows that window but does not close it: the
cache is finite, and an entry can age out before the
retransmission arrives (see <xref target="unprotected-exchange"/>). A client
therefore cannot depend on whether a server caches SETACL
replies.</t>
      </section>
      <section anchor="caching-policies">
        <name>Caching Policies</name>
        <t>The NFS protocol does not define a policy for
caching on the client or server. In particular, there is no
support for strict cache consistency between a client and
server, nor between different clients.</t>
        <t>The NFS_ACL protocol does not mandate a specific caching
policy for ACLs or information retrieved via the ACCESS
procedure. However, a high-quality client implementation
that seeks good performance might choose to revalidate
cached access control information with the same regularity
that it invalidates normal file attributes.</t>
      </section>
    </section>
    <section anchor="xdr-protocol-definition">
      <name>XDR Protocol Definition</name>
      <t>This section contains a description of the core features of the
NFS_ACL protocol, version 2 and version 3, expressed in the XDR
language <xref target="RFC4506"/>.</t>
      <t>NFS_ACL version 2 and NFS_ACL version 3 are independent versions of
a single RPC program.  Their XDR definitions are given here as two
separate specifications, one in <xref target="nfs-acl-v2-xdr"/> and one in
<xref target="nfs-acl-v3-xdr"/>, and each version is intended to form its own XDR
file.  Presenting the two versions as separate files lets an
implementer extract and compile only the protocol version of
interest.  The code component license and the data types common to both
versions appear once, in <xref target="code-component-license"/>.  Prepending
those common definitions to the definitions of a single version
yields a complete, independently compilable XDR file for that
version: nfs_acl2.x for version 2, and nfs_acl3.x for version 3.</t>
      <t>This description is provided in a way that makes it simple to
extract into ready-to-compile form.  In the sections that follow,
each line of XDR text is preceded by the marker "///".  A line of
the form "/// @@FILE name" marks the start of the version-specific
definitions belonging to the file "name"; the XDR text preceding
the first such marker, in <xref target="code-component-license"/>, is common to
both files.  The reader can apply the following shell script to this
document to extract the two XDR files.</t>
      <sourcecode type="sh" markers="true"><![CDATA[
#!/bin/sh
awk '
  /^ *\/\/\// {
    line = $0
    sub(/^ *\/\/\/ ?/, "", line)
    if (line ~ /^@@FILE /) { split(line, a, " "); f = a[2]; next }
    if (f == "") common = common line "\n"
    else         part[f] = part[f] line "\n"
    next
  }
  END { for (f in part) printf "%s%s", common, part[f] > f }
'
]]></sourcecode>
      <t>That is, if the above script is stored in a file called
"extract.sh" and this document is in a file called "spec.txt", then</t>
      <sourcecode type="sh" markers="true"><![CDATA[
sh extract.sh < spec.txt
]]></sourcecode>
      <t>writes two files into the current directory: nfs_acl2.x, containing
the common definitions followed by the NFS_ACL version 2 definitions
of <xref target="nfs-acl-v2-xdr"/>, and nfs_acl3.x, containing the common
definitions followed by the NFS_ACL version 3 definitions of
<xref target="nfs-acl-v3-xdr"/>.  Each file is a complete and independently
compilable XDR description of one protocol version.</t>
      <section anchor="code-component-license">
        <name>Code Component License</name>
        <t>Code components extracted from this document must include
the following license text.  When the extracted XDR code
is combined with other complementary XDR code which itself
has an identical license, only a single copy of the license
text need be preserved.</t>
        <sourcecode type="xdr" markers="true"><![CDATA[
/// /*
///  * Copyright (c) 2024 IETF Trust and the persons
///  * identified as authors of the code.  All rights reserved.
///  *
///  * The authors of the code are:
///  * Oracle
///  *
///  * Redistribution and use in source and binary forms, with
///  * or without modification, are permitted provided that the
///  * following conditions are met:
///  *
///  * - Redistributions of source code must retain the above
///  *   copyright notice, this list of conditions and the
///  *   following disclaimer.
///  *
///  * - Redistributions in binary form must reproduce the above
///  *   copyright notice, this list of conditions and the
///  *   following disclaimer in the documentation and/or other
///  *   materials provided with the distribution.
///  *
///  * - Neither the name of Internet Society, IETF or IETF
///  *   Trust, nor the names of specific contributors, may be
///  *   used to endorse or promote products derived from this
///  *   software without specific prior written permission.
///  *
///  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
///  *   AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
///  *   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
///  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
///  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
///  *   EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
///  *   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
///  *   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
///  *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
///  *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
///  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
///  *   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
///  *   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
///  *   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
///  *   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
///  */
///
/// const NFS_ACL_MAX_ENTRIES = 1024;
///
/// typedef unsigned int uid;
/// typedef unsigned short o_mode;
///
/// /*
///  * This is the format of an ACL which is passed over the network.
///  */
/// struct aclent {
///     int type;
///     uid id;
///     o_mode perm;
/// };
///
/// /*
///  * The values for the type element of the aclent structure.
///  */
/// const NA_USER_OBJ = 0x1;          /* object owner */
/// const NA_USER = 0x2;              /* additional users */
/// const NA_GROUP_OBJ = 0x4;         /* owning group of the object */
/// const NA_GROUP = 0x8;             /* additional groups */
/// const NA_CLASS_OBJ = 0x10;        /* file group class and */
///                                   /* mask entry */
/// const NA_OTHER_OBJ = 0x20;        /* other entry for the object */
/// const NA_ACL_DEFAULT = 0x1000;    /* default flag */
///
/// /*
///  * The bit field values for the perm element of the aclent
///  * structure.  The three values can be combined to form any
///  * of the 8 combinations.
///  */
/// const NA_READ = 0x4;                /* read permission */
/// const NA_WRITE = 0x2;               /* write permission */
/// const NA_EXEC = 0x1;                /* exec permission */
///
/// /*
///  * This is the structure which contains the ACL entries for a
///  * particular entity.  It contains the ACL entries which apply
///  * to this object plus any default ACL entries which are
///  * inherited by its children.
///  *
///  * The values for the mask field are defined below.
///  */
/// struct secattr {
///     unsigned int mask;
///     int aclcnt;
///     aclent aclent<NFS_ACL_MAX_ENTRIES>;
///     int dfaclcnt;
///     aclent dfaclent<NFS_ACL_MAX_ENTRIES>;
/// };
///
/// /*
///  * The values for the mask element of the secattr struct as well
///  * as for the mask element in the arguments in the GETACL2 and
///  * GETACL3 procedures.
///  */
/// const NA_ACL = 0x1;             /* aclent contains a valid list */
/// const NA_ACLCNT = 0x2;          /* number of entries in the */
///                                 /* aclent list */
/// const NA_DFACL = 0x4;           /* dfaclent contains a valid list */
/// const NA_DFACLCNT = 0x8;        /* number of entries in the */
///                                 /* dfaclent list */
///
/// /*
///  * Share the ports with the NFS service.
///  */
/// const NFS_ACL_PORT = 2049;
/// const NFS_ACL_RDMA_PORT = 20049;
]]></sourcecode>
      </section>
      <section anchor="nfs-acl-v2-xdr">
        <name>NFS_ACL Version 2</name>
        <t>The following definitions, together with the common definitions in
<xref target="code-component-license"/>, form the file nfs_acl2.x.</t>
        <sourcecode type="xdr" markers="true"><![CDATA[
/// @@FILE nfs_acl2.x
///
/// /*
///  * XDR data types inherited from the NFS version 2 protocol
///  */
///
/// enum ftype {
///     NFNON = 0,
///     NFREG = 1,
///     NFDIR = 2,
///     NFBLK = 3,
///     NFCHR = 4,
///     NFLNK = 5
/// };
///
/// const FHSIZE = 32;
/// typedef opaque fhandle[FHSIZE];
///
/// struct timeval {
///     unsigned int seconds;
///     unsigned int useconds;
/// };
///
/// struct fattr {
///     ftype        type;
///     unsigned int mode;
///     unsigned int nlink;
///     unsigned int uid;
///     unsigned int gid;
///     unsigned int size;
///     unsigned int blocksize;
///     unsigned int rdev;
///     unsigned int blocks;
///     unsigned int fsid;
///     unsigned int fileid;
///     timeval      atime;
///     timeval      mtime;
///     timeval      ctime;
/// };
///
/// /*
///  * ACL error codes; the numeric values match codes with the same
///  * name used in NFS version 2.
///  */
/// enum aclstat2 {
///     ACL2_OK = 0,
///     ACL2ERR_PERM = 1,
///     ACL2ERR_NOENT = 2,
///     ACL2ERR_IO = 5,
///     ACL2ERR_ACCES = 13,
///     ACL2ERR_INVAL = 22,
///     ACL2ERR_NOSPC = 28,
///     ACL2ERR_ROFS = 30,
///     ACL2ERR_NOTSUPP = 45,
///     ACL2ERR_DQUOT = 69,
///     ACL2ERR_STALE = 70
/// };
///
/// /*
///  * NFS_ACL version 2 procedure arguments and results
///  */
///
/// struct GETACL2args {
///     fhandle fh;
///     unsigned int mask;
/// };
///
/// struct GETACL2resok {
///     fattr attr;
///     secattr acl;
/// };
///
/// union GETACL2res switch (aclstat2 status) {
/// case ACL2_OK:
///     GETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct SETACL2args {
///     fhandle fh;
///     secattr acl;
/// };
///
/// struct SETACL2resok {
///     fattr attr;
/// };
///
/// union SETACL2res switch (aclstat2 status) {
/// case ACL2_OK:
///     SETACL2resok resok;
/// default:
///     void;
/// };
///
/// struct GETATTR2args {
///     fhandle fh;
/// };
///
/// struct GETATTR2resok {
///     fattr attr;
/// };
///
/// union GETATTR2res switch (aclstat2 status) {
/// case ACL2_OK:
///     GETATTR2resok resok;
/// default:
///     void;
/// };
///
/// struct ACCESS2args {
///     fhandle fh;
///     unsigned int access;
/// };
///
/// const ACCESS2_READ = 0x1;     /* read data or */
///                               /* readdir a directory */
/// const ACCESS2_LOOKUP = 0x2;   /* lookup a name in a directory */
/// const ACCESS2_MODIFY = 0x4;   /* rewrite existing file data or */
///                               /* modify existing directory */
///                               /* entries */
/// const ACCESS2_EXTEND = 0x8;   /* write new data or */
///                               /* add directory entries */
/// const ACCESS2_DELETE = 0x10;  /* delete existing directory entry */
/// const ACCESS2_EXECUTE = 0x20; /* execute file */
///                               /* (no meaning for a directory) */
///
/// struct ACCESS2resok {
///     fattr attr;
///     unsigned int access;
/// };
///
/// union ACCESS2res switch (aclstat2 status) {
/// case ACL2_OK:
///     ACCESS2resok resok;
/// default:
///     void;
/// };
///
/// /*
///  * This is the definition for the GETXATTRDIR procedure which
///  * applies to NFS Version 2 files.
///  */
/// struct GETXATTRDIR2args {
///     fhandle fh;
///     bool create;
/// };
///
/// struct GETXATTRDIR2resok {
///     fhandle fh;
///     fattr attr;
/// };
///
/// union GETXATTRDIR2res switch (aclstat2 status) {
/// case ACL2_OK:
///     GETXATTRDIR2resok resok;
/// default:
///     void;
/// };
///
/// program NFS_ACL_PROGRAM {
///     version NFS_ACL_V2 {
///         void
///             ACLPROC2_NULL(void) = 0;
///         GETACL2res
///             ACLPROC2_GETACL(GETACL2args) = 1;
///         SETACL2res
///             ACLPROC2_SETACL(SETACL2args) = 2;
///         GETATTR2res
///             ACLPROC2_GETATTR(GETATTR2args) = 3;
///         ACCESS2res
///             ACLPROC2_ACCESS(ACCESS2args) = 4;
///         GETXATTRDIR2res
///             ACLPROC2_GETXATTRDIR(GETXATTRDIR2args) = 5;
///     } = 2;
/// } = 100227;
]]></sourcecode>
      </section>
      <section anchor="nfs-acl-v3-xdr">
        <name>NFS_ACL Version 3</name>
        <t>The following definitions, together with the common definitions in
<xref target="code-component-license"/>, form the file nfs_acl3.x.</t>
        <sourcecode type="xdr" markers="true"><![CDATA[
/// @@FILE nfs_acl3.x
///
/// /*
///  * XDR data types inherited from the NFS version 3 protocol
///  */
///
/// typedef unsigned hyper uint64;
/// typedef unsigned long uint32;
/// typedef uint64 fileid3;
/// typedef uint32 uid3;
/// typedef uint32 gid3;
/// typedef uint64 size3;
/// typedef uint32 mode3;
///
/// enum ftype3 {
///     NF3REG    = 1,
///     NF3DIR    = 2,
///     NF3BLK    = 3,
///     NF3CHR    = 4,
///     NF3LNK    = 5,
///     NF3SOCK   = 6,
///     NF3FIFO   = 7
/// };
///
/// struct specdata3 {
///     uint32     specdata1;
///     uint32     specdata2;
/// };
///
/// const NFS3_FHSIZE = 64;
///
/// struct nfs_fh3 {
///     opaque       data<NFS3_FHSIZE>;
/// };
///
/// struct nfstime3 {
///     uint32   seconds;
///     uint32   nseconds;
/// };
///
/// 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;
/// };
///
/// union post_op_attr switch (bool attributes_follow) {
/// case TRUE:
///     fattr3   attributes;
/// case FALSE:
///     void;
/// };
///
/// /*
///  * ACL error codes; the numeric values match codes with the same
///  * name used in NFS version 3.
///  */
/// enum aclstat3 {
///     ACL3_OK = 0,
///     ACL3ERR_PERM = 1,
///     ACL3ERR_NOENT = 2,
///     ACL3ERR_IO = 5,
///     ACL3ERR_ACCES = 13,
///     ACL3ERR_INVAL = 22,
///     ACL3ERR_NOSPC = 28,
///     ACL3ERR_ROFS = 30,
///     ACL3ERR_DQUOT = 69,
///     ACL3ERR_STALE = 70,
///     ACL3ERR_BADHANDLE = 10001,
///     ACL3ERR_NOTSUPP = 10004,
///     ACL3ERR_SERVERFAULT = 10006,
///     ACL3ERR_JUKEBOX = 10008
/// };
///
/// /*
///  * NFS_ACL version 3 procedure arguments and results
///  */
///
/// struct GETACL3args {
///     nfs_fh3 fh;
///     unsigned int mask;
/// };
///
/// struct GETACL3resok {
///     post_op_attr attr;
///     secattr acl;
/// };
///
/// struct GETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union GETACL3res switch (aclstat3 status) {
/// case ACL3_OK:
///     GETACL3resok resok;
/// default:
///     GETACL3resfail resfail;
/// };
///
/// struct SETACL3args {
///     nfs_fh3 fh;
///     secattr acl;
/// };
///
/// struct SETACL3resok {
///     post_op_attr attr;
/// };
///
/// struct SETACL3resfail {
///     post_op_attr attr;
/// };
///
/// union SETACL3res switch (aclstat3 status) {
/// case ACL3_OK:
///     SETACL3resok resok;
/// default:
///     SETACL3resfail resfail;
/// };
///
/// /*
///  * This is the definition for the GETXATTRDIR procedure which
///  * applies to NFS Version 3 files.
///  */
/// struct GETXATTRDIR3args {
///     nfs_fh3 fh;
///     bool create;
/// };
///
/// struct GETXATTRDIR3resok {
///     nfs_fh3 fh;
///     post_op_attr attr;
/// };
///
/// union GETXATTRDIR3res switch (aclstat3 status) {
/// case ACL3_OK:
///     GETXATTRDIR3resok resok;
/// default:
///     void;
/// };
///
/// program NFS_ACL_PROGRAM {
///     version NFS_ACL_V3 {
///         void
///             ACLPROC3_NULL(void) = 0;
///         GETACL3res
///             ACLPROC3_GETACL(GETACL3args) = 1;
///         SETACL3res
///             ACLPROC3_SETACL(SETACL3args) = 2;
///         GETXATTRDIR3res
///             ACLPROC3_GETXATTRDIR(GETXATTRDIR3args) = 3;
///     } = 3;
/// } = 100227;
]]></sourcecode>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <aside>
        <t>This section is to be removed before publishing this document as an RFC.</t>
      </aside>
      <t>This section records the status of known implementations of the
protocol defined by this specification at the time of posting of this
Internet-Draft, and is based on a proposal described in
<xref target="RFC7942"/>. The description of implementations in this section is
intended to assist the IETF in its decision processes in progressing
drafts to RFCs.</t>
      <t>Please note that the listing of any individual implementation here
does not imply endorsement by the IETF. Furthermore, no effort has
been spent to verify the information presented here that was supplied
by IETF contributors. This is not intended as, and must not be
construed to be, a catalog of available implementations or their
features. Readers are advised to note that other implementations may
exist.</t>
      <section anchor="solaris-nfs-server-and-client">
        <name>Solaris NFS server and client</name>
        <t>Organization: Oracle</t>
        <t>URL:       <eref target="https://www.oracle.com">https://www.oracle.com</eref></t>
        <t>Maturity:  Complete.</t>
        <t>Coverage:  All procedures are implemented.</t>
        <t>Licensing: CDDL</t>
        <t>Implementation experience:  The Solaris implementation is the
origin of the nfs_acl.x file from which this document is derived
<xref target="OpenSolaris"/>. Its server does not consult the "mask" element
of a SETACL request, and what it stores and returns depends on
the exported file system: UFS stores exactly the entries a
SETACL carries, while ZFS rejects SETACL with ACL2ERR_NOTSUPP or
ACL3ERR_NOTSUPP and answers GETACL with a manufactured ACL
(see <xref target="setacl-mask"/> and <xref target="no-acl-support"/>).</t>
      </section>
      <section anchor="linux-nfs-server-and-client">
        <name>Linux NFS server and client</name>
        <t>Organization:  The Linux Foundation</t>
        <t>URL:       <eref target="https://www.kernel.org">https://www.kernel.org</eref></t>
        <t>Maturity:  Complete.</t>
        <t>Coverage:  The Linux NFS server implements all procedures except
           GETXATTRDIR in both versions of the protocol. The Linux
           NFS client implements the NFS_ACL protocol only for
           version 3; it does not implement NFS_ACL version 2.</t>
        <t>Licensing: GPLv2</t>
        <t>Implementation experience:  The initial Linux implementation
of the NFS_ACL protocol is described in <xref target="Gruenbacher"/>, and
subsequent modifications can be found in the Linux kernel
source code repository <xref target="Linux"/>.</t>
        <t><xref target="Gruenbacher"/> notes several minor differences between the
Linux and Solaris implementations of ACLs. The one visible on
the wire, the treatment of the mask entry in a four-entry ACL,
is described in <xref target="acls-in-operation"/>.</t>
        <t>The Linux NFS_ACL implementation already builds the version 2 and
version 3 protocols from two separate source files, presently
maintained by hand.  Work is underway to generate those files from
the separate XDR descriptions in <xref target="nfs-acl-v2-xdr"/> and
<xref target="nfs-acl-v3-xdr"/> instead.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>NFS_ACL was designed for a single administrative domain on
a physically protected network. This section considers a
broader environment: deployment across the global Internet,
spanning administrative boundaries, with no firewall assumed
between a client and its server.</t>
      <t>NFS_ACL carries no security mechanism of its own. It
inherits what the RPC layer provides, and it names the users
and groups in an Access Control Entry using the identities
that layer supplies (see <xref target="auth-and-authz"/>). What follows
therefore turns on the choice of RPC authentication flavor
and transport.</t>
      <t>Attacks on the NFS version 2 and version 3 protocols
themselves are out of scope. An attacker who can read or
alter file content directly through NFS gains nothing by
attacking the ACL that governs it, and <xref target="RFC2623"/> covers
those protocols. Attacks on the local file system that
stores an ACL, and on the mechanism by which a site maps
users to uid and gid values, are out of scope as well: both
are shared with the NFS service that NFS_ACL accompanies, and
neither is reachable through the NFS_ACL protocol itself.</t>
      <section anchor="unprotected-exchange">
        <name>Attacks on an Unprotected Exchange</name>
        <t>Running NFS_ACL over AUTH_SYS on an unprotected transport
defends against none of the following.</t>
        <dl>
          <dt>Eavesdropping:</dt>
          <dd>
            <t>A GETACL reply carries an object's full Access Control
List. An observer learns which users and groups hold access
to the object, and the uid and gid values that name them.
The list is worth reading even when the file content is not.</t>
          </dd>
          <dt>Modification and man-in-the-middle:</dt>
          <dd>
            <t>Altering a SETACL argument changes the access control the
server installs. Altering a GETACL reply gives the client a
false view of it. Altering an ACCESS reply misleads a client
that uses the result to decide whether to attempt an
operation.</t>
          </dd>
          <dt>Message insertion:</dt>
          <dd>
            <t>AUTH_SYS supplies no verifier by which a credential can be
validated (<xref section="14" sectionFormat="of" target="RFC5531"/>). An attacker who can
reach the server and holds a file handle for an object can
forge a SETACL request bearing the file owner's uid.</t>
          </dd>
          <dt>Replay:</dt>
          <dd>
            <t>SETACL is not idempotent. A replayed SETACL reinstates an
ACL that the file owner has since replaced. The duplicate
request cache (<xref target="dup-req-cache"/>) recognizes a
retransmission, but it is finite: a replay delayed beyond
its reach is processed as a new request.</t>
          </dd>
          <dt>Message deletion and denial of service:</dt>
          <dd>
            <t>Discarding NFS_ACL messages denies a client the ability to
read or change an ACL. An attacker positioned to do this can
discard the NFS traffic alongside it, so NFS_ACL neither
adds to nor reduces the exposure.</t>
          </dd>
        </dl>
        <t><xref section="14" sectionFormat="of" target="RFC5531"/> states that AUTH_SYS should not be
used for services that permit clients to modify data. SETACL
modifies the data that governs every other access to the
object. <xref target="rpc-authentication"/> reports that implementations
permit any authentication flavor on procedures other than
NULL. That records what implementations accept; it does not
recommend AUTH_SYS for SETACL. <xref target="protecting-an-exchange"/>
states what a deployment should do instead.</t>
      </section>
      <section anchor="protecting-an-exchange">
        <name>Protecting an Exchange</name>
        <t>Two mechanisms available to an NFS version 2 or version 3
deployment apply unchanged to NFS_ACL, which shares the
transport and port of the NFS service it accompanies.</t>
        <t>RPCSEC_GSS <xref target="RFC2203"/> <xref target="RFC7861"/> replaces AUTH_SYS with a
GSS-API mechanism. Its integrity service authenticates the
RPC peer and detects alteration of each call and reply,
addressing insertion, modification, and man-in-the-middle.
Per-request sequence numbers detect replay within a window
the server sizes. Integrity leaves ACL content readable on
the wire; the privacy service encrypts arguments and results
and closes that gap. <xref target="RFC2623"/> describes how the NFS
version 2 and version 3 protocols use RPCSEC_GSS and
Kerberos V5.</t>
        <t>RPC-over-TLS <xref target="RFC9289"/> protects the transport connection
rather than the individual RPC message. It supplies
confidentiality and integrity for everything on the
connection and can authenticate the peer host. It does not
authenticate the RPC user, so a server relying on it alone
still takes on trust the uid and gid each request carries.</t>
        <t>A deployment that exposes NFS_ACL beyond a physically
protected network should protect the exchange with a
mechanism that detects alteration of each call and reply and
that authenticates the source of each request, so that
neither the uid and gid a request carries nor the ACL entries
in its arguments and results can be altered by a
man-in-the-middle, and so that a forged credential is
detected.</t>
      </section>
      <section anchor="residual-risk">
        <name>Residual Risk</name>
        <t>Neither mechanism changes what an authenticated caller may
do. GETACL carries no permission check of its own (see
<xref target="auth-and-authz"/>), so a caller holding a file handle can
often read the object's ACL and the user and group IDs it
names. A deployment that treats ACL membership as sensitive
cannot rely on the protocol to withhold it.</t>
        <t>A server that maps a privileged caller to a less privileged
identity (see <xref target="permission-issues"/>) decides on the strength
of the uid the request carries. Under AUTH_SYS the client
supplies that value, so the mapping deters accident rather
than attack.</t>
        <t>The "id" element of an Access Control Entry is a uid or gid in
the server's numeric space. RPCSEC_GSS maps the caller's
principal to a local identity (see <xref target="auth-and-authz"/>), but no
authentication flavor translates the identities an ACL names.
Across an administrative boundary, a client that writes an ACL
names users and groups by numbers it cannot confirm are the
server's, and a client that reads one cannot resolve the
numbers it receives.</t>
        <t>An ACL a client has read, and the result of an ACCESS
procedure, describe the server's decision at the moment it
was made. The server alone authorizes access (see
<xref target="interpreting-acls"/>) and can revoke it at any time. A
client that caches either and relies on it later may be
relying on information that no longer holds.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>In accordance with <xref section="13" sectionFormat="of" target="RFC5531"/>, the editor
requests that IANA update the entry for the NFS ACL
service in the RPC Program Numbers registry to add
the current document as a Reference.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC4506">
          <front>
            <title>XDR: External Data Representation Standard</title>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <date month="May" year="2006"/>
            <abstract>
              <t>This document describes the External Data Representation Standard (XDR) protocol as it is currently deployed and accepted. This document obsoletes RFC 1832. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="67"/>
          <seriesInfo name="RFC" value="4506"/>
          <seriesInfo name="DOI" value="10.17487/RFC4506"/>
        </reference>
        <reference anchor="RFC5531">
          <front>
            <title>RPC: Remote Procedure Call Protocol Specification Version 2</title>
            <author fullname="R. Thurlow" initials="R." surname="Thurlow"/>
            <date month="May" year="2009"/>
            <abstract>
              <t>This document describes the Open Network Computing (ONC) Remote Procedure Call (RPC) version 2 protocol as it is currently deployed and accepted. This document obsoletes RFC 1831. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5531"/>
          <seriesInfo name="DOI" value="10.17487/RFC5531"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC1094">
          <front>
            <title>NFS: Network File System Protocol specification</title>
            <author fullname="B. Nowicki" initials="B." surname="Nowicki"/>
            <date month="March" year="1989"/>
            <abstract>
              <t>This RFC describes a protocol that Sun Microsystems, Inc., and others are using. A new version of the protocol is under development, but others may benefit from the descriptions of the current protocol, and discussion of some of the design issues.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1094"/>
          <seriesInfo name="DOI" value="10.17487/RFC1094"/>
        </reference>
        <reference anchor="RFC1813">
          <front>
            <title>NFS Version 3 Protocol Specification</title>
            <author fullname="B. Callaghan" initials="B." surname="Callaghan"/>
            <author fullname="B. Pawlowski" initials="B." surname="Pawlowski"/>
            <author fullname="P. Staubach" initials="P." surname="Staubach"/>
            <date month="June" year="1995"/>
            <abstract>
              <t>This paper describes the NFS version 3 protocol. This paper is provided so that people can write compatible implementations. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1813"/>
          <seriesInfo name="DOI" value="10.17487/RFC1813"/>
        </reference>
        <reference anchor="RFC2203">
          <front>
            <title>RPCSEC_GSS Protocol Specification</title>
            <author fullname="M. Eisler" initials="M." surname="Eisler"/>
            <author fullname="A. Chiu" initials="A." surname="Chiu"/>
            <author fullname="L. Ling" initials="L." surname="Ling"/>
            <date month="September" year="1997"/>
            <abstract>
              <t>This memo describes an ONC/RPC security flavor that allows RPC protocols to access the Generic Security Services Application Programming Interface (referred to henceforth as GSS-API). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2203"/>
          <seriesInfo name="DOI" value="10.17487/RFC2203"/>
        </reference>
        <reference anchor="RFC2623">
          <front>
            <title>NFS Version 2 and Version 3 Security Issues and the NFS Protocol's Use of RPCSEC_GSS and Kerberos V5</title>
            <author fullname="M. Eisler" initials="M." surname="Eisler"/>
            <date month="June" year="1999"/>
            <abstract>
              <t>This memorandum clarifies various security issues involving the NFS protocol (Version 2 and Version 3 only) and then describes how the Version 2 and Version 3 of the NFS protocol use the RPCSEC_GSS security flavor protocol and Kerberos V5. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2623"/>
          <seriesInfo name="DOI" value="10.17487/RFC2623"/>
        </reference>
        <reference anchor="RFC7530">
          <front>
            <title>Network File System (NFS) Version 4 Protocol</title>
            <author fullname="T. Haynes" initials="T." role="editor" surname="Haynes"/>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>The Network File System (NFS) version 4 protocol is a distributed file system protocol that builds on the heritage of NFS protocol version 2 (RFC 1094) and version 3 (RFC 1813). Unlike earlier versions, the NFS version 4 protocol supports traditional file access while integrating support for file locking and the MOUNT protocol. In addition, support for strong security (and its negotiation), COMPOUND operations, client caching, and internationalization has been added. Of course, attention has been applied to making NFS version 4 operate well in an Internet environment.</t>
              <t>This document, together with the companion External Data Representation (XDR) description document, RFC 7531, obsoletes RFC 3530 as the definition of the NFS version 4 protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7530"/>
          <seriesInfo name="DOI" value="10.17487/RFC7530"/>
        </reference>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="RFC9289">
          <front>
            <title>Towards Remote Procedure Call Encryption by Default</title>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <date month="September" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that, through the use of opportunistic Transport Layer Security (TLS), enables encryption of Remote Procedure Call (RPC) transactions while they are in transit. The proposed mechanism interoperates with Open Network Computing (ONC) RPC implementations that do not support it. This document updates RFC 5531.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9289"/>
          <seriesInfo name="DOI" value="10.17487/RFC9289"/>
        </reference>
        <reference anchor="Gruenbacher">
          <front>
            <title>POSIX Access Control Lists on Linux</title>
            <author initials="A." surname="Grünbacher" fullname="Andreas Grünbacher">
              <organization>SuSE Labs</organization>
            </author>
            <date year="2003" month="January"/>
          </front>
          <seriesInfo name="Proceedings" value="of the FREENIX Track: 2003 USENIX Annual Technical Conference, pp. 259-272"/>
          <seriesInfo name="ISBN" value="1-931971-11-0"/>
        </reference>
        <reference anchor="Juszczak">
          <front>
            <title>Improving the Performance and Correctness of an NFS Server</title>
            <author initials="C." surname="Juszczak" fullname="Chet Juszczak">
              <organization>Digital Equipment Corporation</organization>
            </author>
            <date year="1989" month="January"/>
          </front>
          <seriesInfo name="USENIX" value="Conference Proceedings, USENIX Association, Berkeley, CA, pp. 53-63"/>
        </reference>
        <reference anchor="IEEE">
          <front>
            <title>IEEE 1003.1e and 1003.2c: Draft Standard for Information Technology-- Portable Operating System Interface (POSIX)-- Part 1: System Application Program Interface (API) and Part 2: Shell and Utilities, draft 17</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="1997" month="January"/>
          </front>
        </reference>
        <reference anchor="POSIX">
          <front>
            <title>IEEE Std 1003.1-2001 (Open Group Technical Standard, Issue 6), Standard for Information Technology-- Portable Operating System Interface (POSIX)</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="2001"/>
          </front>
          <seriesInfo name="ISBN" value="0-7381-3010-9"/>
        </reference>
        <reference anchor="Linux" target="https://www.kernel.org">
          <front>
            <title>Linux kernel source code</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="OpenSolaris" target="https://github.com/kofemann/opensolaris/blob/3dfbd886134b95a44386706352b92788c30f9569/usr/src/head/rpcsvc/nfs_acl.x">
          <front>
            <title>Archived OpenSolaris source code: usr/src/head/rpcsvc/nfs_acl.x</title>
            <author>
              <organization/>
            </author>
            <date year="2005" month="June"/>
          </front>
        </reference>
        <reference anchor="I-D.ietf-nfsv4-posix-acls">
          <front>
            <title>POSIX Draft ACL support for Network File System Version 4, Minor Version 2</title>
            <author fullname="Rick Macklem" initials="R." surname="Macklem">
              <organization>FreeBSD Project</organization>
            </author>
            <date day="7" month="September" year="2026"/>
            <abstract>
              <t>   This document proposes four new optional file attributes for NFSv4.2
   to support POSIX ACLs conforming to the withdrawn POSIX 1003.1e draft
   17.  Although never ratified, POSIX ACLs are implemented in widely
   deployed operating systems.  Existing attempts to map between NFSv4
   and POSIX ACL models have been unsuccessful due to semantic
   incompatibilities.  These new attributes allow servers to expose
   POSIX ACLs directly, avoiding lossy mapping.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-posix-acls-02"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8166">
          <front>
            <title>Remote Direct Memory Access Transport for Remote Procedure Call Version 1</title>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <author fullname="W. Simpson" initials="W." surname="Simpson"/>
            <author fullname="T. Talpey" initials="T." surname="Talpey"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>This document specifies a protocol for conveying Remote Procedure Call (RPC) messages on physical transports capable of Remote Direct Memory Access (RDMA). This protocol is referred to as the RPC-over- RDMA version 1 protocol in this document. It requires no revision to application RPC protocols or the RPC protocol itself. This document obsoletes RFC 5666.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8166"/>
          <seriesInfo name="DOI" value="10.17487/RFC8166"/>
        </reference>
        <reference anchor="RFC8267">
          <front>
            <title>Network File System (NFS) Upper-Layer Binding to RPC-over-RDMA Version 1</title>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This document specifies Upper-Layer Bindings of Network File System (NFS) protocol versions to RPC-over-RDMA version 1, thus enabling the use of Direct Data Placement. This document obsoletes RFC 5667.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8267"/>
          <seriesInfo name="DOI" value="10.17487/RFC8267"/>
        </reference>
        <reference anchor="RFC1833">
          <front>
            <title>Binding Protocols for ONC RPC Version 2</title>
            <author fullname="R. Srinivasan" initials="R." surname="Srinivasan"/>
            <date month="August" year="1995"/>
            <abstract>
              <t>This document describes the binding protocols used in conjunction with the ONC Remote Procedure Call (ONC RPC Version 2) protocols. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1833"/>
          <seriesInfo name="DOI" value="10.17487/RFC1833"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
    </references>
    <?line 2926?>

<section anchor="source-material">
      <name>Source Material</name>
      <t>The on-the-wire protocol described here is intended to
match existing de facto implementations of NFS_ACL.</t>
      <t>The source for the XDR specification provided in this
document is the nfs_acl.x file as found in published
versions of the OpenSolaris source code base <xref target="OpenSolaris"/>,
an open source descendant of Solaris.</t>
      <t>However, there are a few changes to the protocol as it
was originally described in the OpenSolaris source code
base.</t>
      <section anchor="nfs-acl-v4">
        <name>Redaction of NFS_ACL Version 4</name>
        <t>Version 4 of NFS_ACL is described in the original nfs_acl.x source
file this way:</t>
        <ul empty="true">
          <li>
            <t>This is a transitional interface to enable Solaris NFSv4
clients to manipulate ACLs on Solaris servers until the
spec is complete enough to implement this inside the
NFSv4 protocol itself.  NFSv4 does handle extended
attributes in-band.</t>
          </li>
        </ul>
        <t>Because the two non-NULL procedures in this version of the NFS_ACL
protocol were used only as part of a Solaris prototype and there
are no other implementations of NFS_ACL version 4, it is not included
in the protocol description appearing in this document.</t>
      </section>
      <section anchor="extension-of-nfsacl">
        <name>Extension of NFS_ACL</name>
        <t>Extension of this legacy protocol is out of scope for an
Informational document whose purpose is to describe existing
implementations.</t>
      </section>
      <section anchor="code-compilation-requirements">
        <name>Code Compilation Requirements</name>
        <t>The original nfs_acl.x file that appears in the OpenSolaris code
base did not compile using the widely-available rpcgen tool.</t>
        <ul spacing="normal">
          <li>
            <t>The file does not include a definition of the ACL2_OK or
ACL3_OK constants used in definitions of result unions.</t>
          </li>
          <li>
            <t>The file does not include definitions of NFS protocol elements
that are shared with the NFS_ACL protocol, such as fhandle and
post_op_attr.</t>
          </li>
        </ul>
        <t>The XDR specification provided in this document rectifies those
omissions to provide a complete and compilable XDR language
description of the NFS_ACL protocol.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editor is grateful to
Bill Baker,
Frank Batschulat,
Wim Coekaerts,
Andreas Gruenbacher,
Rick Macklem,
Greg Marsden,
Martin Thomson,
Rob Thurlow,
and
Jim Wright
for their input and support.</t>
      <t>Special thanks to
Area Director
Gorry Fairhurst,
NFSV4 Working Group Chair
Brian Pawlowski,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their patience, guidance, and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
DdO/5aX+PloW73hjfvsb0BFC3NzRCFpA+z7AFD7vb0PX6u/UYZksxpa/A5uo
SnjtWRckoJNPq0XctipPt62Kg9nqW5ytPp4m8J8HrtVH2UE/WYCtPiJs0U8W
ZKuPKFv0kwXa6iPSFv30xP40Pj38nn56an96PXp9Sj89C9B4UNqgn6rfrJSj
TxQTiklOce3y6NHLbU/2w6I2zdq4RP0bStudIq1XdMMUi5AuC5lvatWHqMB2
RIBGLCrjRbTLtNpD6/UEhG08QSRqeWp2mWx7osnYwTMetg7YFmlcxv9O6H6E
r5hj8QlKBOZsLxCf4k5O4fDYyHAWCwmEIS6ifdxhg5nBOVrUPTHwaHZXYi1I
Gi0uWd/y3mVi4jmcflO4wCF0IZu5NEyPnCeCqvlauJPvVGRM1nKLd/IpckE2
Kz/MrmTjyB+uKh3DoV7HBTl94NzM5mgVZ7w0BdXXaNhLW597e9x8zfvd4SLA
5PmWq9q74wvPs0fwTH5VYTrgVXdbFxZEmU2x2LezvxoKhRcscXvaqkGgDTrN
3GtfIxDLB4GSe9pSL5GA7FJctipxyUICMufh2zU2ntKft518wf/hkvzZ69iv
HZV73NGpGQhI98N2/FgGhcP38h8Y2ZJS5dEAuYgrSWVH+zCj1xOhVrRZbvLa
t4qXT04cNUGiR0lDoIE5pjndsgySpXu56eL/SpNpifntqDUJ4qWrGmEFCOkl
GrmsMkLv7LAdeSNglrwdX1Qfn/HHhzOh8dGO3UTLdSlIdaoW09ssO3BsKZX0
3Fg0Lfk4yylEe7FmAzQSCjb4tIhvMi+sFy0zgYtFkcqkhKq/aOxgIV+Pzdfy
n6/QMzmV/FGUQQ5fL24RnXJDrAFc1IA4HNqFLQXtd1kHv2BlUoBdBgL0SUpZ
x6QuRN5JGZxMP0RQ7H/LGH/06D4QikYREykGMc7uiaDoABSNA1CMQslZagLv
vSSA26809vo5GeIm6q9ZK2aiYhz274eZ2L8vZmL/LtDE/n1QE2sUiAa+3BTJ
Zgt82fzoHdTObJR6R1w7RbIgqwxaN2JbydK/GzU9RVxWgTzMl4nUJaioGFQ7
fGPfx2/sk+R06I2kM7I49bAbnQrjIzeCjiqS1+I2zt1vFrWRNFX+zeEyej/i
nUJ+tEqVD9XI+i6N2OIxiprt/sk/W2YLsBi9X5etv7bgMK7ysvqQrz4oUmf9
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
cERCdTHmcNXgGpDkSCWpBrPqmf8JjDE1uZiAAQA=

-->

</rfc>
