<?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.39 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-nfsv4-nfs-acl-03" 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-03"/>
    <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="July" day="22"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFS</keyword>
    <keyword>ACL</keyword>
    <abstract>
      <?line 89?>

<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://chucklever.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/chucklever/i-d-nfs-acl"/>.</t>
    </note>
  </front>
  <middle>
    <?line 97?>

<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 those operating systems 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>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>As with most publications by standards bodies, this document
has been published so that people may continue to create
compatible implementations. However, note that, as an
Informational document, this RFC does not make any compliance
mandates on implementations of the protocol described herein.</t>
    </section>
    <section anchor="general-concepts">
      <name>General Concepts</name>
      <section anchor="a-glossary-of-useful-terms">
        <name>A Glossary of Useful Terms</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 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="extensions-to-rfc-4506">
          <name>Extensions to RFC 4506</name>
          <t>The original NFS_ACL version 2 RPC language specification includes the use of
the "unsigned short" type. This type is not described in <xref target="RFC4506"/>. However,
most current implementations of the rpcgen program implement support for
this type. This section provides a proper specification for "short" and
"unsigned short" integer types for the RPC language, based on those
implementations. This is so that the NFS_ACL version 2 RPC language
specification appearing in this document accurately reflects the wire behavior
of existing implementations.</t>
          <t>The XDR wire representation of both types is a network-endian 32-bit integer,
sign-extended. This maintains XDR's consistent 4-octet alignment for all basic
integer types while allowing applications to use narrower types internally.</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="signed-short">
            <name>signed short</name>
            <t>The short type is sign-extended, with the high-order two octets replicating
the sign bit. The value range of this type is -32768 to 32767, inclusive.</t>
            <t>When a signed short contains a positive or zero value, its high-order octets
each contain 0x00. For example: 0x7FFF (32767) appears as 0x00007FFF on the
wire.</t>
            <t>When a signed short contains a negative value, its high-order octets each
contain 0xFF. For example: 0xFFFF (-1) appears as 0xFFFFFFFF on the wire,
and 0x8000 (-32768) appears as 0xFFFF8000 on the wire.</t>
          </section>
        </section>
      </section>
      <section anchor="authentication-and-authorization">
        <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 or retrieving
an ACL via the GETACL procedure, the NFS_ACL service verifies
that the calling user has been granted permission to perform
the procedure.</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_UNIX.</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-access-control-lists">
            <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
rising in which there is no valid way to ever modify the ACL.</t>
              </li>
              <li>
                <t>All servers will allow a user the ability to read the
data of the file when only the execute permission is granted
(i.e., if the ACL denies the user the NA_READ access and
allows the user NA_EXEC, the server will allow the user to
read the data of the file).</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 it 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>Each NFS ACL 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.</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 four
Access Control Entries rather than three. Along with the
NA_USER_OBJ, NA_GROUP_OBJ, and NA_OTHER_OBJ entries, the
sender synthesizes an NA_CLASS_OBJ entry whose "perm"
element is derived from the permission bits of the object's
owning group.</t>
            <t>The Access Control Entries in each of the "aclent" and
"dfaclent" arrays appear in ascending order of their "type"
element value. Some receivers depend on this ordering.</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 is a default ACL but the target object
is not a directory</t>
              </li>
              <li>
                <t>The presented ACL contains too many ACEs</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>
            </ul>
            <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 client uses one of the NFS CREATE, MKDIR, or MKNOD procedures
to request instantiation of a new file object. When the parent
directory carries a default ACL (that is, a non-empty "dfaclent"
array), the server forms the new object's access ACL from that
default ACL, copying each default entry into the new object's
access ACL with the NA_ACL_DEFAULT flag cleared so that the
entry governs access to the new object.</t>
            <t>The default ACL also constrains the new object's mode bits. The
server derives the owner permission bits from the default
NA_USER_OBJ entry, the other permission bits from the default
NA_OTHER_OBJ entry, and the group permission bits from the
default NA_CLASS_OBJ (mask) entry when one is present or else
from the default NA_GROUP_OBJ entry. The server first reduces
each of these three permission sets to its intersection with the
corresponding permission the client requested in the creation
operation. The reduced permissions become both the new object's
mode bits and the permissions of the corresponding entries in
its access ACL. Through this intersection a default ACL takes
the place of a umask in limiting the permissions of a newly
created object; see <xref target="Gruenbacher"/> for the relationship between
default ACLs and the umask.</t>
            <t>When the newly created object is itself a directory, the server
also copies the parent's default ACL into the new directory's
own default ACL, so that the default ACL propagates to
subsequent descendants.</t>
            <t>When the parent directory has no default ACL, the server assigns
no ACL to the new object, and the object's mode bits are those
the client requested in the creation operation.</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.</t>
      </section>
      <section anchor="constants">
        <name>Constants</name>
        <t>These are the RPC constants needed to call the NFS Version 3
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>Only versions 2 and 3 of this RPC program are valid.</t>
      </section>
      <section anchor="transport-address">
        <name>Transport address</name>
        <t>The NFS_ACL protocol can operate over the TCP, UDP, and RDMA
transport protocols.
For TCP and UDP, it uses port 2049, and for RDMA, it uses 20049.
In both cases, this is the same as the base NFS protocol.</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 "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>
        </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>Typically an NFS server that implements the NFS_ACL program will
advertise the presence of NFS_ACL via an rpcbind registration.
An NFS client that implements NFS_ACL should perform an rpcbind
query before attempting any NFS_ACL procedure <xref target="RFC1833"/>.</t>
            <t>If the client sends any NFS_ACL procedure without sending an
rpcbind query first, and the server does not implement the
NFS_ACL program, the server responds with an RPC access_stat
of PROG_UNAVAIL.</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
NFS2ERR_ACCESS or NFS3ERR_ACCESS 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="client-implements-exported-file-system-does-not">
            <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>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 (i.e., only three ACEs) that
reflects the current mode bits of the object.</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>
            <t>The Linux NFS server deviates from the protocol specified in the
current document by returning the value 10004 (the NFS version 3
NFS3ERR_NOTSUPP value) rather than the value 45 that this document
assigns to ACL2ERR_NOTSUPP, in response to a SETACL version 2
procedure on a file system that does not support ACLs.</t>
          </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 Solaris
NFS_ACL version 2 server 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. This value matches the one
that the sole existing NFS_ACL version 2 client (the Solaris
implementation) decodes to the POSIX EOPNOTSUPP error; 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>
        <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="procedure-1-getacl-retrieve-an-access-control-list">
          <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>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 GETACL2res.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="acls-in-operation"/>).</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_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 2 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"/>).</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>On success, the server does not send the reply until
the ACL change is durable locally.</t>
            <t>Changing a file object's ACL changes the object's mtime.
The mtime 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>
          </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>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 name 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 GETXATTRDIR2.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 GETXATTRDIR2.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_IO in the GETXATTRDIR2.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>
            </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, SYMLINK, MKNOD, LINK,
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 NFS3ERR_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>
        <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="procedure-1-getacl-retrieve-an-access-control-list-1">
          <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>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="acls-in-operation"/>).</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_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"/>).</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>On success, the server does not send the reply until
the ACL change is durable locally.</t>
            <t>Changing a file object's ACL changes the object's mtime.
The mtime 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>
          </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 name 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
ACL3_ACCES in the GETXATTRDIR3.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
GETXATTRDIR3.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 GETXATTRDIR3.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_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_UNIX style authentication as
the basis of its protection mechanism, or another stronger
form of authentication such as RPCSEC_GSS. With
AUTH_UNIX authentication, the server gets the client's
effective uid, effective gid, and groups on each call and
uses them to check permission. These are the so-called UNIX
credentials.</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="duplicate-request-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>For all versions of the NFS_ACL protocol, the SETACL
procedure is considered to be non-idempotent.</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"><![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"><![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"><![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 port with the NFS service.
///  */
/// const NFS_ACL_PORT = 2049;
]]></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"><![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"><![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:</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, and remarks that:
&gt; Solaris ACLs are based on an earlier draft of POSIX 1003.1e,
&gt; so its handling of the mask ACL entry is slightly different
&gt; than in draft 17 for ACLs with only four ACL entries. This
&gt; is a corner case that occurs only rarely, so the semantic
&gt; differences may not be noticeable.</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>An attacker can alter the content of an ACL as it transits
an open network, giving the attacker access to file content
that the ACL is supposed to protect.</t>
      <t>Therefore, implementations of NFS_ACL should protect the
integrity of ACL content when it transits a network. The
use of an integrity-preserving transport layer security
service, such as the GSS Kerberos integrity service, is
strongly recommended.</t>
    </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>
        <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="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 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="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="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="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="Juszcak" fullname="Chet Juszcak">
              <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">
          <front>
            <title>Archived OpenSolaris source code</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </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="8" month="January" 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-01"/>
        </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>
      </references>
    </references>
    <?line 2648?>

<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="redaction-of-nfsacl-version-4">
        <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 a 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 Chairs
Brian Pawlowski
and
Christopher Inacio,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their patience, guidance, and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Hg9OX7YiaCk6PbuITgavBxfQi4uzFnbDvScNee9HZy+i1/3zo1fws/d8cDK4
+IV68GJwcYruvH31BfSjF73pnV8Mji5PeuAKX56/ORv2Ixz68WB4dNIbvO4f
ox19Cp1wL/Z/RMSy4aveyUmFJmc/nfbPcXwBHZ57/T0Z9J6DYUbfBpIcD877
Rxc4ZPfXEdAbun7SioZv+kcD+MP79M99GHDv/JeWfGXY/5dLeBqeio57r3sv
Yfy7If3cy1VCYubM5Tkl8iDRhpfPhxeDCzyU+eXZ2THOk3sX8zEGR/3hs+jk
bEg0vhz2W/DNix51BdoCAsNt+Pv55XAQknpwetE/P7+kROg94JyfgITQ/R60
cUyTc3ZK5ABqnp3/Aq2HBKNJbEU/verDA+c4HUTfHtJrCHQ+uvAec69CV4D+
Fx5BotP+y5PBy/7pUR/vnmFzPw2G/T2Y8wF0+qXfZerRTz3oziXRB6caOsx/
esukRQwRDbxO945/HODQ5C3gquFAWJEIffRKZktX4AP8L/3Np2SLgfX2de/n
t31kJZhXxHI7ePTMPlkD2kdQBoITbbxbXmNcLn/L2KTayANP5zq8FIc+KSW6
YoSUig2c36iI5B3FYByC/BpxTSh4M3QP/Qv0jwgvVa/g/q72GP9x90hE8cWP
zV21gOaa40uZfoIIqyaDfN/i0IadFEL33sKcnr89e/7n8Nx4+vfgG03t4v2r
plf9U+LDV90pprTfX9Zef3l+dvnGfvrRs8qXb8kk52SQoOS4uSH/fPdN/ZDc
mur7IOqGQ0eDh8+C98lklyMp8UxaroZG9IVEz3YPWqNlZVs7qLTGxi6/qbO3
YVi4Ao77CnWIHXuojdGR85woMJnFU38FhXxi4YOrHIM81swx+rpjHI4LLK8x
n1GakVC/NeQ1SofAOmpNcqNP5SE9k7ORCXEzuM4FOlTK7fXSN6pv/3QOQr2Z
EeHt6j5r7XU8C7uB++X15H0yqr+9RXo44GcWGzaAzEH1Ez3qm48m1ha87Bj0
IZZrVLzLzS9z2xSg0SYkGKPstJitSkI+8yvwK68X1v5yR6rg4ce4E3ydzsbg
rjc5JxVe8qBI/ONVMKJ12ygatQDcycYGaB1fbHIpvbsmso3/84cGdfF9+L4W
49da0NL9LW3cVwazSAhXlA5UVQIn5Wgj8YaXazCAAYwGhf21CQFKCM50aFxh
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
jQk3jMQdjLZj/n8vuPaeBk4BAA==

-->

</rfc>
