<?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.35 (Ruby 2.6.10) -->
<?rfc docmapping="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-haynes-nfsv4-recalldevice-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="RECALL_DEVICE">Deviceid-Scoped Layout Recall for NFSv4.2</title>
    <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-recalldevice-02"/>
    <author initials="T." surname="Haynes" fullname="Thomas Haynes">
      <organization>Hammerspace</organization>
      <address>
        <email>loghyr@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 36?>

<t>The Parallel Network File System (pNFS) allows the metadata
server to recall a layout from a client by file id, by file
system id, or across all of a client's layouts.  It also lets
the server delete a deviceid via CB_NOTIFY_DEVICEID.  It does
not provide a mechanism for the metadata server to recall, in a
single operation, all layouts that reference a specific
deviceid.  This document presents an extension to RFC7862 that
adds a deviceid-scoped layout recall: a single CB_LAYOUTRECALL
operation recalls every layout a client holds that references a
given deviceid, leaving unrelated layouts in place.  Without
this capability, device unavailability can trigger large
volumes of failed WRITE and LAYOUTERROR traffic, and
administrators lack a surgical way to retire a deviceid
without disturbing layouts that reference healthy devices.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 53?>

<t>Discussion of this draft takes place
on the NFSv4 working group mailing list (nfsv4@ietf.org),
which is archived at
<eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
Working Group information can be found at
<eref target="https://datatracker.ietf.org/wg/nfsv4/about/"/>.</t>
    </note>
  </front>
  <middle>
    <?line 62?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In the Network File System version 4 (NFSv4) with a Parallel NFS
(pNFS) metadata server (<xref target="RFC8881"/>), there is no mechanism for
the metadata server to recall layouts from a client based on the
deviceid (see Section 3.3.14 of <xref target="RFC8881"/>) those layouts
reference.  The Flex Files layout type (<xref target="RFC8435"/>) is the
primary motivating use case: a Flex Files layout describes data
spread across multiple data servers, each identified by a
distinct deviceid, often deliberately deployed across separate
power or fault domains so that a single domain failure does not
lose data.</t>
      <t>The absence of a deviceid-scoped recall has two distinct
operational consequences.  This section describes each, shows
why the existing recall and notification mechanisms are the
wrong shape to address it, and motivates the extension specified
in the rest of the document.</t>
      <section anchor="problem-1-traffic-amplification-during-device-unavailability">
        <name>Problem 1: Traffic amplification during device unavailability</name>
        <t>When a deviceid becomes unavailable -- because a power fault
domain has been isolated, because a device has been taken down
for maintenance, or because of a transient I/O failure --
clients holding layouts that reference the deviceid continue to
issue I/O against it.  Each such attempt produces a WRITE (see
Section 18.32 of <xref target="RFC8881"/>) that fails with NFS4ERR_NXIO (see
Section 15.1.16.3 of <xref target="RFC8881"/>), followed by a LAYOUTERROR
(see Section 15.6 of <xref target="RFC7862"/>) returned to the metadata
server.  The metadata server learns about the failure once per
(client, layout) pair; the network and the metadata server pay
for the retries.</t>
        <t>Structurally, the wasted RPC count is approximately
<strong>2 x C x L x W</strong>, where:</t>
        <ul spacing="normal">
          <li>
            <t><strong>C</strong> is the number of clients holding layouts that reference
the affected deviceid,</t>
          </li>
          <li>
            <t><strong>L</strong> is the average number of such layouts per client, and</t>
          </li>
          <li>
            <t><strong>W</strong> is the number of write attempts per layout during the
unavailability window.</t>
          </li>
        </ul>
        <t>The factor of two captures the WRITE-then-LAYOUTERROR pair
generated per attempt.  For a representative deployment with
<strong>C = 100</strong>, <strong>L = 50</strong>, and a several-minute unavailability
window in which each layout sees <strong>W = 1000</strong> write attempts,
the wasted RPC count is on the order of <strong>10 million</strong>.  These
numbers are illustrative order-of-magnitude estimates derived
from the structural relationship; deployment-specific
measurements are out of scope for this specification, but the
structural multiplier is what the extension eliminates.</t>
        <t>A single deviceid-scoped recall delivered to each affected
client replaces the (C x L x W) retry traffic with a single
CB_LAYOUTRECALL per client plus the client-side processing to
return the affected layouts.</t>
        <t>The existing recall mechanisms are the wrong shape for this
problem.  LAYOUTRECALL4_ALL recalls every layout a client
holds, including layouts pointing at healthy deviceids; this
fixes the traffic amplification at the cost of evicting
unrelated layouts and forcing them to be re-issued.
LAYOUTRECALL4_FILE recalls layouts one file at a time, which
adds an RPC per affected file to the recovery cost; for a
deployment where the number of affected files is large, the
per-file recall traffic is itself a scaling concern.</t>
      </section>
      <section anchor="problem-2-cleanly-retiring-a-deviceid">
        <name>Problem 2: Cleanly retiring a deviceid</name>
        <t>The metadata server can signal to clients that a deviceid no
longer exists by setting NOTIFY4_DEVICEID_DELETE in the
CB_NOTIFY_DEVICEID callback (see Section 20.12 of <xref target="RFC8881"/>).
This flag cannot be set while any layout still references the
deviceid: once a delete is announced, a client cannot have
in-flight I/O against a deviceid that no longer exists.</t>
        <t>The result is that an administrator who wants to retire a
deviceid -- for hardware refresh, decommission, capacity
rebalancing, or removal of a failed device from the
namespace -- has no surgical option.  The available choices
are:</t>
        <ul spacing="normal">
          <li>
            <t>Wait for the affected layouts to expire naturally.  The wait
is bounded by a lease period and by the slowest client.</t>
          </li>
          <li>
            <t>Use LAYOUTRECALL4_ALL to recall every layout from every
client.  This evicts layouts pointing at healthy deviceids
in the same operation, and may produce a thundering herd of
re-LAYOUTGET requests once the recall completes.</t>
          </li>
          <li>
            <t>Use LAYOUTRECALL4_FILE for every affected file.  This
generates one recall RPC per file and is expensive at scale.</t>
          </li>
          <li>
            <t>Fence the deviceid (see Section 12.5.5 of <xref target="RFC8881"/>).
This is disruptive: clients with active I/O see I/O failures
rather than orderly recall, and the operation may invalidate
concurrent legitimate I/O.</t>
          </li>
        </ul>
        <t>A deviceid-scoped recall provides the missing surgical option:
the metadata server recalls exactly the layouts referencing the
to-be-retired deviceid, waits for client acknowledgement, and
then sends CB_NOTIFY_DEVICEID with NOTIFY4_DEVICEID_DELETE.
The deviceid is retired without disturbing layouts that
reference other deviceids.</t>
      </section>
      <section anchor="what-this-document-specifies">
        <name>What this document specifies</name>
        <t>Using the process detailed in <xref target="RFC8178"/>, the revisions in
this document become an extension of NFSv4.2 <xref target="RFC7862"/>.
They are built on top of the external data representation
(XDR) <xref target="RFC4506"/> generated from <xref target="RFC7863"/>.</t>
        <t>The extension adds a deviceid-scoped recall to CB_LAYOUTRECALL:
a single callback identifies a deviceid and the client returns
every layout it holds that references that deviceid.  The
extension closes both operational gaps described above with a
single new layout-recall scope.</t>
      </section>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</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?>

</section>
    <section anchor="capability">
      <name>Client Capability Advertisement</name>
      <t>Before the server may send a CB_LAYOUTRECALL with
LAYOUTRECALL4_DEVICEID, it <bcp14>MUST</bcp14> know that the client supports
the new union arm.  Per <xref target="RFC8178"/> Section 6, a server <bcp14>MUST NOT</bcp14>
send a new callback operation or new union arm to a client that
has not indicated support for it.</t>
      <t>A client that supports LAYOUTRECALL4_DEVICEID signals this by
setting a new flag in the eia_flags field of the EXCHANGE_ID
operation (see Section 18.35 of <xref target="RFC8881"/>):</t>
      <sourcecode type="xdr"><![CDATA[
///    const EXCHGID4_FLAG_SUPP_RECALL_DEVICEID = 0x02000000;
///
]]></sourcecode>
      <t>A client that sets EXCHGID4_FLAG_SUPP_RECALL_DEVICEID in its
EXCHANGE_ID request advertises that it supports handling
CB_LAYOUTRECALL with a LAYOUTRECALL4_DEVICEID recall type.</t>
      <t>A server <bcp14>MUST NOT</bcp14> send a CB_LAYOUTRECALL with
LAYOUTRECALL4_DEVICEID to a client that did not set
EXCHGID4_FLAG_SUPP_RECALL_DEVICEID in its EXCHANGE_ID request.
A server that does not wish to support this capability <bcp14>MAY</bcp14>
ignore the flag.</t>
      <t>If the client does not set EXCHGID4_FLAG_SUPP_RECALL_DEVICEID,
the server <bcp14>MAY</bcp14> fall back to recalling individual layouts via
LAYOUTRECALL4_FILE (one CB_LAYOUTRECALL per layout file that
references the unavailable deviceid), as described in Section 20.3
of <xref target="RFC8881"/>.  This is less efficient but correct, and preserves
interoperability with clients that predate this extension.</t>
    </section>
    <section anchor="extension-to-cblayoutrecall-recall-layout-from-client">
      <name>Extension to CB_LAYOUTRECALL - Recall Layout from Client</name>
      <t>The original union layoutrecall4 (see Section 20.3.1 of <xref target="RFC8881"/>) is:</t>
      <sourcecode type="xdr"><![CDATA[
enum layoutrecall_type4 {
        LAYOUTRECALL4_FILE = LAYOUT4_RET_REC_FILE,
        LAYOUTRECALL4_FSID = LAYOUT4_RET_REC_FSID,
        LAYOUTRECALL4_ALL  = LAYOUT4_RET_REC_ALL
};

union layoutrecall4 switch(layoutrecall_type4 lor_recalltype) {
   case LAYOUTRECALL4_FILE:
           layoutrecall_file4 lor_layout;
   case LAYOUTRECALL4_FSID:
           fsid4              lor_fsid;
   case LAYOUTRECALL4_ALL:
           void;
   };
]]></sourcecode>
      <t>The proposed extension is:</t>
      <sourcecode type="xdr"><![CDATA[
///    const LAYOUT4_RET_REC_DEVICEID  = 4;
///
///    enum layoutrecall_type4 {
///           LAYOUTRECALL4_FILE     = LAYOUT4_RET_REC_FILE,
///           LAYOUTRECALL4_FSID     = LAYOUT4_RET_REC_FSID,
///           LAYOUTRECALL4_ALL      = LAYOUT4_RET_REC_ALL,
///           LAYOUTRECALL4_DEVICEID = LAYOUT4_RET_REC_DEVICEID
///   };
///
/// union layoutrecall4 switch(layoutrecall_type4 lor_recalltype) {
///   case LAYOUTRECALL4_FILE:
///           layoutrecall_file4 lor_layout;
///   case LAYOUTRECALL4_FSID:
///           fsid4              lor_fsid;
///   case LAYOUTRECALL4_DEVICEID:
///           deviceid4          lor_deviceid;
///   case LAYOUTRECALL4_ALL:
///           void;
///   };
]]></sourcecode>
      <t>Note that LAYOUT4<em>RET_REC</em>* constants are shared between
layoutrecall_type4 (used in CB_LAYOUTRECALL) and layoutreturn_type4
(used in LAYOUTRETURN, see Section 18.44.1 of <xref target="RFC8881"/>).  Adding
LAYOUT4_RET_REC_DEVICEID = 4 therefore also extends layoutreturn_type4
with a LAYOUTRETURN4_DEVICEID value.  A client that receives a
LAYOUTRETURN with lor_recalltype set to LAYOUTRETURN4_DEVICEID and
does not recognise it <bcp14>MUST</bcp14> return NFS4ERR_UNION_NOTSUPP per <xref target="RFC8178"/>.</t>
      <t>The server <bcp14>MUST NOT</bcp14> send CB_LAYOUTRECALL with LAYOUTRECALL4_DEVICEID
to a client that has not set EXCHGID4_FLAG_SUPP_RECALL_DEVICEID
(see <xref target="capability"/>).  This satisfies the requirement in Section 6
of <xref target="RFC8178"/> that a server establish client awareness before
sending new callback extensions.</t>
      <t>The existing clora_iomode field in CB_LAYOUTRECALL4args
(see Section 20.3.1 of <xref target="RFC8881"/>) applies normally: the client
<bcp14>MUST</bcp14> return all layouts matching both the given deviceid and the
given iomode.  The server can determine that the client no longer
has any layouts with the given deviceid and iomode once the client
replies with NFS4ERR_NOMATCHING_LAYOUT.</t>
    </section>
    <section anchor="extraction-of-xdr">
      <name>Extraction of XDR</name>
      <t>This document contains the external data representation (XDR)
<xref target="RFC4506"/> description of the extension to CB_LAYOUTRECALL.
The XDR description is presented in a manner that facilitates easy
extraction into a ready-to-compile format. To extract the
machine-readable XDR description, use the following shell script:</t>
      <sourcecode type="shell"><![CDATA[
<CODE BEGINS>
#!/bin/sh
grep '^ *///' $* | sed 's?^ */// ??' | sed 's?^ *///$??'
<CODE ENDS>
]]></sourcecode>
      <t>For example, if the script is named 'extract.sh' and this document is
named 'spec.txt', execute the following command:</t>
      <sourcecode type="shell"><![CDATA[
<CODE BEGINS>
sh extract.sh < spec.txt > recalldevice.x
<CODE ENDS>
]]></sourcecode>
      <t>This script removes leading blank spaces and the sentinel sequence '///'
from each line. XDR descriptions with the sentinel sequence are embedded
throughout the document.</t>
      <t>Note that the XDR code contained in this document depends on types from
the NFSv4.2 nfs4_prot.x file (generated from <xref target="RFC7863"/>).  This includes
both nfs types that end with a 4, such as offset4, length4, etc., as
well as more generic types such as uint32_t and uint64_t.</t>
      <t>The extracted XDR extends types that are already defined in
<xref target="RFC7863"/> rather than introducing new types.  An implementer <bcp14>MUST</bcp14>
integrate the extracted block into the base XDR by <strong>replacing</strong>
the existing layoutrecall_type4 enum declaration and layoutrecall4
union declaration with the extended versions in this document, and
by adding the LAYOUT4<em>RET_REC_DEVICEID constant in the same file
area as the existing LAYOUT4_RET_REC</em>* constants.  Appending the
extracted block verbatim to the RFC 7863 XDR produces duplicate-
type errors at compile time.</t>
      <t>The EXCHGID4_FLAG_SUPP_RECALL_DEVICEID constant is purely additive
and is added to the EXCHGID4 flag constant block without replacing
anything.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The extension introduced by this document inherits the Security
Considerations of CB_LAYOUTRECALL in Section 20.3 of <xref target="RFC8881"/>
and of NFSv4.2 in <xref target="RFC7862"/>.  Three aspects of the deviceid-scoped
recall warrant explicit mention.</t>
      <dl>
        <dt>Blast radius:</dt>
        <dd>
          <t>A single CB_LAYOUTRECALL with LAYOUTRECALL4_DEVICEID can cause
a client to return many layouts in one callback exchange.  This
is not a new risk category -- LAYOUTRECALL4_FSID and
LAYOUTRECALL4_ALL already allow wider-scoped recalls -- but
administrators sizing callback-channel timeouts and client-side
recall-handler resources <bcp14>SHOULD</bcp14> account for the possibility that
a deviceid-scoped recall triggers per-layout cleanup work
proportional to the number of layouts that reference the
deviceid.</t>
        </dd>
        <dt>Cross-client scope:</dt>
        <dd>
          <t>In deployments where a single deviceid is shared across clients
serving different tenants or applications, a deviceid-scoped
recall is cross-client by construction: every client that holds
a layout referencing the deviceid is recalled.  This is the same
property as LAYOUTRECALL4_FSID and does not introduce a new
information-exposure surface.  Deployments that prefer
per-tenant failure-domain isolation <bcp14>MAY</bcp14> treat this extension as
an operational benefit: by assigning distinct deviceids per
tenant, deviceid-scoped recall becomes a per-tenant operation
with no cross-tenant effect.</t>
        </dd>
        <dt>Capability negotiation as defence in depth:</dt>
        <dd>
          <t>The capability flag defined in <xref target="capability"/> ensures that a
server cannot silently change the callback wire format for a
client that did not opt in.  A client that does not advertise
EXCHGID4_FLAG_SUPP_RECALL_DEVICEID continues to receive only
the layoutrecall_type4 values defined in <xref target="RFC8881"/>.  A server
that sends LAYOUTRECALL4_DEVICEID to a client that did not
advertise support is in violation of Section 6 of <xref target="RFC8178"/>;
clients that encounter such a violation <bcp14>MUST</bcp14> return
NFS4ERR_UNION_NOTSUPP and <bcp14>SHOULD</bcp14> log the server for operator
attention.</t>
        </dd>
      </dl>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="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="RFC7862">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 Protocol</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document describes NFS version 4 minor version 2; it describes the protocol extensions made from NFS version 4 minor version 1. Major extensions introduced in NFS version 4 minor version 2 include the following: Server-Side Copy, Application Input/Output (I/O) Advise, Space Reservations, Sparse Files, Application Data Blocks, and Labeled NFS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7862"/>
          <seriesInfo name="DOI" value="10.17487/RFC7862"/>
        </reference>
        <reference anchor="RFC7863">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 External Data Representation Standard (XDR) Description</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides the External Data Representation (XDR) description for NFS version 4 minor version 2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7863"/>
          <seriesInfo name="DOI" value="10.17487/RFC7863"/>
        </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="RFC8178">
          <front>
            <title>Rules for NFSv4 Extensions and Minor Versions</title>
            <author fullname="D. Noveck" initials="D." surname="Noveck"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document describes the rules relating to the extension of the NFSv4 family of protocols. It covers the creation of minor versions, the addition of optional features to existing minor versions, and the correction of flaws in features already published as Proposed Standards. The rules relating to the construction of minor versions and the interaction of minor version implementations that appear in this document supersede the minor versioning rules in RFC 5661 and other RFCs defining minor versions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8178"/>
          <seriesInfo name="DOI" value="10.17487/RFC8178"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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="RFC8435">
          <front>
            <title>Parallel NFS (pNFS) Flexible File Layout</title>
            <author fullname="B. Halevy" initials="B." surname="Halevy"/>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>Parallel NFS (pNFS) allows a separation between the metadata (onto a metadata server) and data (onto a storage device) for a file. The flexible file layout type is defined in this document as an extension to pNFS that allows the use of storage devices that require only a limited degree of interaction with the metadata server and use already-existing protocols. Client-side mirroring is also added to provide replication of files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8435"/>
          <seriesInfo name="DOI" value="10.17487/RFC8435"/>
        </reference>
      </references>
    </references>
    <?line 394?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Trond Myklebust and Paul Saab were involved in the initial
requirements for this functionality.</t>
      <t>Brian Pawlowski and Gorry Fairhurst helped guide
this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAGaw8mkAA6Vb63LbOJb+j6fAJFMVxyXJNyWdUfoybttJu8qxs7Yz6a6u
WRdEQhIqFKkFSMuarPtZ9ln2yfY7BwBF6uLO7qaqZySaOADO5TvfOYC63a4o
TZnpgTzV9ybRJu3eJMVMp/JCLYqqlNc6UVkmR4WVl+9u7vu9Q6GGQ6vvB/L6
7OT44uLu9Owf5ydnIi2SXE0hKLVqVHYnapFr181H7r7ftSwk5Rm6+4ciUaUe
F3YxkK5MRYpvA/n19Pj27FEkRe507io3kKWttDAzy59cebi//zeMVVargby1
KnezwpZiXtgvY1tUs4G81CV9k+9MpuXNwpV6Kv+hrTNFLvvii17gr+lAnuel
trkuu6e0UiFcqfL0TmVFjmUstBMzM5C/l0XSkQ4zWD1y+LSY+g/Y51TNZiYf
d2RSTKc6L90/hVBVOSnsQMiukPhncmzgtid/YTXwI6+d20kxVa75vLBjlZt/
qRLLHOAPEGndTCWa/6qnymQDmRXjycL+fUzfephWiLywU4y515hTXr87OTw4
+Fv42H+1/zp8/O7N68Plx6Pw8c3Bd/3lxzfx45s3BwMhTD5aEX3w5qAe2T96
hXe63a5UQ1dalUCBtxMtPyoLE+tsoxF2ZvCdlxIvFHMnS7w+1aWC3ZVw2t5r
K8tCeieRSmbe80a2mOJbkhmoWA4XckQSTdqJn4Xz0ukR3FMltnCOJpHFqB74
wgV5rifleYk/u0JmunSClhFmTzWeaIxJQxDIe6Pkyc93l1e35+9+Cy5+fupF
pAUslxelnNni3qQ0bqqTCYzophwozQ3K1Q124BsS+4YDYTsINcuW7/DCw1Ih
QZV4f6StzhOawM10YkYmEXGFWMrtxDhyx4p8EIvRjnxRqlzqhxIxRG6PaYMX
sEyh0tQ19tl1PtiDyv0KBzSfXx5UcHH829WnWx/rol5ueNVJjc0t4vjaWpMi
S1d3gXnFGE6V17N3YAh1j5lklVudAQbSWgNQ0ixDEGCfnw1CqyphMOw3UTM1
NJkpF50gB4PVPcIiPMYb2LY14zG0nik71uK+yKAjR24xwouY5fP1+e0ZNAWY
4+2dXV9fXWOUGkHHHfoDNDU1sCielYUlJ0q+kF4qOzbYuZyrhbdpaWzTc8Tc
r1amGFvZIe1ui1UnWmXlZBGGup4PKziWvruk/ymLu2utUqCBEKfGJZVjk2IX
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

-->

</rfc>
