<?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.30 (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-swap-05" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="atomic EXCHANGE_RANGE">Adding an Atomic EXCHANGE_RANGE Operation to NFSv4.2</title>
    <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-swap-05"/>
    <author initials="T." surname="Haynes" fullname="Thomas Haynes">
      <organization>Hammerspace</organization>
      <address>
        <email>loghyr@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>General</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 42?>

<t>The Network File System version 4.2 (NFSv4.2) does not provide
support for atomic multi-block updates to file data.  This document
introduces a new EXCHANGE_RANGE operation which provides for such
atomic updates.  This document extends NFSv4.2 (see RFC7862).</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 49?>

<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/search/?email_list=nfsv4"/>. Source
code and issues list for this draft can be found at
<eref target="https://github.com/ietf-wg-nfsv4/exchange_range"/>.</t>
      <t>Working Group information can be found at <eref target="https://github.com/ietf-wg-nfsv4"/>.</t>
    </note>
  </front>
  <middle>
    <?line 60?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>With the Network File System version 4.2 (NFSv4.2), atomic updates
to a file are not guaranteed.  A single WRITE operation might span
multiple data blocks; another client doing a READ might then encounter
a partial WRITE.  In addition, multiple WRITE operations, even
within the same compound, may not be atomically applied to a file.
In some implementations, multiple WRITE operations within the same
compound may appear to be applied atomically, but this behavior is
implementation-specific and not guaranteed by the protocol.</t>
      <t>This document introduces the EXCHANGE_RANGE operation, which is
<bcp14>OPTIONAL</bcp14> to implement, to NFSv4.2.  EXCHANGE_RANGE atomically
exchanges a range of content between two files.  A client can easily
determine whether or not a server supports the EXCHANGE_RANGE
operation by examining the return code of the operation.  If the
server does not support the EXCHANGE_RANGE operation, the server
returns NFS4ERR_NOTSUPP.</t>
      <t>Using the process described in <xref target="RFC8178"/>, the revisions in this
document extend 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>One way to use the EXCHANGE_RANGE operation is to CLONE a file and
make modifications to the cloned copy. Once the cloned copy is
ready, the EXCHANGE_RANGE operation can be used to atomically
exchange the modified contents. Upon success, the cloned copy can
be deleted.</t>
      <section anchor="definitions">
        <name>Definitions</name>
        <t>The definitions of the following terms are referenced as follows:</t>
        <ul spacing="normal">
          <li>
            <t>change_info4 (<xref section="3.3.3" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
          <li>
            <t>CLONE (<xref section="15.13" sectionFormat="of" target="RFC7862"/>)</t>
          </li>
          <li>
            <t>clone_blksize (<xref section="12.2.1" sectionFormat="of" target="RFC7862"/>)</t>
          </li>
          <li>
            <t>NFS4ERR_NOTSUPP (<xref section="15.1.1.5" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
          <li>
            <t>READ (<xref section="18.22" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
          <li>
            <t>WRITE (<xref section="18.32" sectionFormat="of" target="RFC8881"/>)</t>
          </li>
        </ul>
      </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>
    <section anchor="operation-81-exchangerange-exchange-a-range-of-a-file-into-another-file">
      <name>Operation 81: EXCHANGE_RANGE - Exchange a range of a file into another file</name>
      <section anchor="arguments">
        <name>ARGUMENTS</name>
        <figure anchor="fig-EXCHANGE_RANGE4args">
          <name>XDR for EXCHANGE_RANGE4args</name>
          <sourcecode type="xdr"><![CDATA[
 /// const OP_EXCHANGE_RANGE = 81;
 ///
 /// struct EXCHANGE_RANGE4args {
 ///         /* SAVED_FH: source file */
 ///         /* CURRENT_FH: destination file */
 ///         stateid4        era_src_stateid;
 ///         stateid4        era_dst_stateid;
 ///         offset4         era_src_offset;
 ///         offset4         era_dst_offset;
 ///         length4         era_count;
 /// };
]]></sourcecode>
        </figure>
      </section>
      <section anchor="results">
        <name>RESULTS</name>
        <figure anchor="fig-EXCHANGE_RANGE4res">
          <name>XDR for EXCHANGE_RANGE4res</name>
          <sourcecode type="xdr"><![CDATA[
 /// struct EXCHANGE_RANGE4resok {
 ///         change_info4    err_src_cinfo;
 ///         change_info4    err_dst_cinfo;
 /// };
 ///
 /// union EXCHANGE_RANGE4res switch (nfsstat4 err_status) {
 ///  case NFS4_OK:
 ///          EXCHANGE_RANGE4resok err_resok4;
 ///  default:
 ///          void;
 /// };
]]></sourcecode>
        </figure>
        <t>The following case arms are added to the nfs_argop4 and nfs_resop4
dispatch unions in the base XDR:</t>
        <figure anchor="fig-dispatch">
          <name>Dispatch union case arms for EXCHANGE_RANGE</name>
          <sourcecode type="xdr"><![CDATA[
 /// /* In nfs_argop4: */
 /// case OP_EXCHANGE_RANGE:
 ///         EXCHANGE_RANGE4args opexchange_range;
 ///
 /// /* In nfs_resop4: */
 /// case OP_EXCHANGE_RANGE:
 ///         EXCHANGE_RANGE4res opexchange_range;
]]></sourcecode>
        </figure>
      </section>
      <section anchor="description">
        <name>DESCRIPTION</name>
        <t>The EXCHANGE_RANGE operation is used to exchange file content from
a source file specified by the SAVED_FH value into a destination
file specified by CURRENT_FH without actually copying the data,
e.g., by using a block exchange mechanism.</t>
        <t>Both SAVED_FH and CURRENT_FH <bcp14>MUST</bcp14> be regular files.  If either
SAVED_FH or CURRENT_FH is not a regular file, the operation <bcp14>MUST</bcp14>
fail and return NFS4ERR_WRONG_TYPE.</t>
        <t>The era_dst_stateid <bcp14>MUST</bcp14> refer to a stateid that is valid for a WRITE
operation and follows the rules for stateids in Section 8.2.5 of
<xref target="RFC8881"/> and Section 18.32.3 of <xref target="RFC8881"/>.  The era_src_stateid <bcp14>MUST</bcp14>
refer to a stateid that is valid for a READ operation and follows
the rules for stateids in Section 8.2.5 of <xref target="RFC8881"/> and Section 18.22.3
of <xref target="RFC8881"/>.  If either stateid is invalid, then the operation
<bcp14>MUST</bcp14> fail.</t>
        <t>The era_src_offset is the starting offset within the source file
from which the data to be exchanged will be obtained, and the
era_dst_offset is the starting offset of the target region into which
the exchanged data will be placed.  An offset of 0 (zero) indicates
the start of the respective file.  The number of bytes to be exchanged
is obtained from era_count, except that an era_count of 0 (zero)
indicates that the number of bytes to be exchanged is the count of
bytes between era_src_offset and the EOF of the source file; in this
case the derived count ends at the source EOF, so the alignment
exception below always applies.  Both era_src_offset and era_dst_offset
<bcp14>MUST</bcp14> be aligned to the clone block size (Section 12.2.1 of <xref target="RFC7862"/>).
The number of bytes to be exchanged <bcp14>MUST</bcp14> be a multiple of the clone
block size, except in the case in which era_src_offset plus the number
of bytes to be exchanged is equal to the source file size.</t>
        <t>If era_src_offset or era_src_offset + era_count is greater than the
size of the source file, the operation <bcp14>MUST</bcp14> fail with NFS4ERR_INVAL.
It is valid for era_dst_offset or era_dst_offset + era_count to be
greater than the current size of the destination file.</t>
        <t>If SAVED_FH and CURRENT_FH refer to the same file and the source
and target ranges overlap, the operation <bcp14>MUST</bcp14> fail with NFS4ERR_INVAL.
This restriction avoids undefined behavior that could arise from
overlapping atomic replacement of data within a single file.</t>
        <t>If the target area of the EXCHANGE_RANGE operation ends beyond the
end of the destination file, the new size of the destination file
<bcp14>MUST</bcp14> be set to era_dst_offset plus the number of bytes exchanged.
The contents of any block not part of the target area <bcp14>MUST</bcp14> be the
same as if the file size were extended by a WRITE.</t>
        <t>If the number of bytes to be exchanged (using the derived count when
era_count is 0) is not a multiple of the clone block size and
era_dst_offset plus the derived count is less than the current size
of the destination file, the operation <bcp14>MUST</bcp14> fail with NFS4ERR_INVAL.</t>
        <t>This restriction avoids modifying a portion of a clone block while
leaving the remainder of that clone block within the destination
file unchanged, which could otherwise lead to implementation-dependent
results and potential data integrity issues.</t>
        <t>If a conflicting byte-range lock exists on either the source or the
destination range at the time of the operation, the server <bcp14>MUST</bcp14> return
NFS4ERR_LOCKED before performing any exchange.  The source range
requires at minimum read access; the destination range requires write
access.</t>
        <t>The EXCHANGE_RANGE operation is atomic in that other operations <bcp14>MUST
NOT</bcp14> see any intermediate states between the state of the two files
before the operation and after the operation.  A READ of the
destination file <bcp14>MUST NOT</bcp14> see some blocks of the target area exchanged
without all of them being exchanged.  A WRITE to the source area <bcp14>MUST</bcp14>
either have no effect on the data of the target file or be fully
reflected in the target area of the destination file.</t>
        <t>Atomicity is defined with respect to NFSv4.2 READ and WRITE operations
issued by other clients; the protocol makes no guarantees regarding
the visibility of intermediate states to server-internal mechanisms.</t>
        <t>Upon successful completion, the server <bcp14>MUST</bcp14> update the change, mtime,
and ctime attributes of both the source and destination files.</t>
        <t>The completion status of the operation is indicated by err_status.</t>
        <t>Upon success, the response includes err_resok4, which contains two
change_info4 values: err_src_cinfo for the source file and
err_dst_cinfo for the destination file.  Each change_info4 carries
the change attribute value before (cinfo_before) and after
(cinfo_after) the exchange, sampled atomically with the operation.
Clients <bcp14>MAY</bcp14> use these values to update their attribute caches for
both files without issuing a subsequent GETATTR.  When
cinfo_atomic is TRUE, the client <bcp14>MAY</bcp14> treat the before/after pair
as a precise record of the transition; when FALSE, the client <bcp14>MUST</bcp14>
treat the cached change attribute as potentially stale and
revalidate on next access.  Because EXCHANGE_RANGE is its own
inverse, a client confirming execution <bcp14>MUST</bcp14> compare cinfo_before
against a previously recorded value -- comparing cinfo_after is
insufficient, as two executions leave cinfo_after equal to the
original cinfo_before.</t>
        <t>Within an NFSv4.1 or NFSv4.2 session, the SEQUENCE operation
(<xref section="18.46" sectionFormat="of" target="RFC8881"/>) provides exactly-once execution
semantics via the slot identifier and sequenceid carried in each
compound: the server's session reply cache detects retransmissions
and returns the cached reply without re-executing the operation.
The discussion below addresses replay protection across server
reboots, where session state is not preserved.</t>
        <t>Stateids supplied with the EXCHANGE_RANGE operation provide protection
against replay across server reboots, lease expiration, or state
revocation.  After a server reboot, all previously issued stateids
are invalidated, and replay of a prior EXCHANGE_RANGE operation
<bcp14>MUST</bcp14> fail with an appropriate error.</t>
        <t>Because EXCHANGE_RANGE is its own inverse -- applying it twice to
the same ranges returns both files to their original state -- clients
<bcp14>MUST NOT</bcp14> assume that a successfully replayed EXCHANGE_RANGE operation
produced a net change.  Clients that require confirmation <bcp14>MUST</bcp14>
validate the resulting file contents or metadata, such as via the
change attribute.</t>
        <t>Per Section 3.3.1 of <xref target="RFC7862"/>, EXCHANGE_RANGE is not
an operation which can be sent to a data server.</t>
      </section>
      <section anchor="errors">
        <name>ERRORS</name>
        <t>The EXCHANGE_RANGE operation returns the full set of errors defined
in <xref target="tbl-ops-and-errors"/>.  The following errors are specific to this
operation:</t>
        <dl>
          <dt>NFS4ERR_WRONG_TYPE:</dt>
          <dd>
            <t>Either SAVED_FH or CURRENT_FH is not a regular file.</t>
          </dd>
          <dt>NFS4ERR_INVAL:</dt>
          <dd>
            <t>era_src_offset or era_dst_offset is not aligned to the clone block
size; or the count is not a valid multiple of the clone block size
and the range does not end at the source EOF; or the source range
extends beyond the source file; or SAVED_FH and CURRENT_FH are the
same file and the source and target ranges overlap.</t>
          </dd>
          <dt>NFS4ERR_BAD_STATEID, NFS4ERR_EXPIRED, NFS4ERR_ADMIN_REVOKED,</dt>
          <dd>
            <t/>
          </dd>
          <dt>NFS4ERR_DELEG_REVOKED, NFS4ERR_OLD_STATEID, NFS4ERR_OPENMODE:</dt>
          <dd>
            <t>The era_src_stateid or era_dst_stateid is not valid for the required
access mode, has expired, or has been revoked.</t>
          </dd>
          <dt>NFS4ERR_LOCKED:</dt>
          <dd>
            <t>A conflicting byte-range lock on the source or destination range
prevents the exchange.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="operations-and-their-valid-errors">
      <name>Operations and Their Valid Errors</name>
      <t>The operations and their valid errors are presented in
<xref target="tbl-ops-and-errors"/>.  All error codes not defined in this document
are defined in Section 15 of <xref target="RFC8881"/> and Section 11 of <xref target="RFC7862"/>.</t>
      <dl anchor="tbl-ops-and-errors">
        <dt>EXCHANGE_RANGE:</dt>
        <dd>
          <t>NFS4ERR_ACCESS,
NFS4ERR_ADMIN_REVOKED,
NFS4ERR_BADXDR,
NFS4ERR_BAD_STATEID,
NFS4ERR_DEADSESSION,
NFS4ERR_DELAY,
NFS4ERR_DELEG_REVOKED,
NFS4ERR_DQUOT,
NFS4ERR_EXPIRED,
NFS4ERR_FBIG,
NFS4ERR_FHEXPIRED,
NFS4ERR_GRACE,
NFS4ERR_INVAL,
NFS4ERR_IO,
NFS4ERR_ISDIR,
NFS4ERR_LOCKED,
NFS4ERR_MOVED,
NFS4ERR_NOFILEHANDLE,
NFS4ERR_NOSPC,
NFS4ERR_NOTSUPP,
NFS4ERR_OLD_STATEID,
NFS4ERR_OPENMODE,
NFS4ERR_OP_NOT_IN_SESSION,
NFS4ERR_PNFS_IO_HOLE,
NFS4ERR_PNFS_NO_LAYOUT,
NFS4ERR_REP_TOO_BIG,
NFS4ERR_REP_TOO_BIG_TO_CACHE,
NFS4ERR_REQ_TOO_BIG,
NFS4ERR_RETRY_UNCACHED_REP,
NFS4ERR_ROFS,
NFS4ERR_SERVERFAULT,
NFS4ERR_STALE,
NFS4ERR_SYMLINK,
NFS4ERR_TOO_MANY_OPS,
NFS4ERR_WRONG_TYPE</t>
        </dd>
      </dl>
      <t>If the destination file has active pNFS layouts that prevent atomic
modification of the target range, the server <bcp14>MAY</bcp14> return an appropriate
pNFS-related error.</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 EXCHANGE_RANGE operation.  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[
#!/bin/sh
grep '^ *///' $* | sed 's?^ */// ??' | sed 's?^ *///$??'
]]></sourcecode>
      <t>For example, if the script is named 'extract.sh' and this document is
named 'exchange_range.txt', execute the following command:</t>
      <sourcecode type="shell"><![CDATA[
sh extract.sh < exchange_range.txt > exchange_range_prot.x
]]></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>While the XDR can be appended to that from <xref target="RFC7863"/>, the code snippets
should be placed in their appropriate sections within the existing XDR.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The EXCHANGE_RANGE operation is subject to the same security
considerations as other NFSv4.2 operations that modify file data.</t>
      <t>The caller <bcp14>MUST</bcp14> have appropriate access to both the source file
(read access) and the destination file (write access).  Servers
<bcp14>MUST</bcp14> enforce authorization checks on both filehandles before
performing the exchange.</t>
      <t>Within a session, the SEQUENCE mechanism (<xref section="18.46" sectionFormat="of" target="RFC8881"/>)
prevents duplicate execution via the slot identifier and sequenceid.
After a server reboot, previously issued stateids are invalidated,
preventing replay of prior operations across reboots.</t>
      <t>Because EXCHANGE_RANGE is its own inverse, a double execution returns
both files to their original state.  A client checking only the final
value of the change attribute cannot distinguish zero executions from
two executions, since both cases leave the files in their original
state while the change attribute may have been incremented an even
number of times.  The change_info4 values returned in err_src_cinfo
and err_dst_cinfo enable precise confirmation: a client <bcp14>MUST</bcp14> record
the change attribute of both files before the first attempt and
compare cinfo_before from the response against that recorded value to
confirm a single net execution.  Comparing only cinfo_after is
insufficient for this purpose.</t>
    </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="XFS-EXCHANGE-RANGE">
          <front>
            <title>ioctl_xfs_exchange_range(2) - Exchange data between files (Accessed January 2026)</title>
            <author>
              <organization>Linux man-pages project</organization>
            </author>
            <date year="2024" month="July"/>
          </front>
          <seriesInfo name="Linux" value="6.10"/>
        </reference>
      </references>
    </references>
    <?line 435?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Christoph Helwig brought the XFS exchange range implementation
(<xref target="XFS-EXCHANGE-RANGE"/>) to the author's attention, which prompted
this document.</t>
      <t>Darrick Wong, David Noveck, Pali Rohar, Rick Macklem, and Christoph
Helwig helped review the document.</t>
      <t>Chris Inacio, Brian Pawlowski, and Gorry Fairhurst helped guide
this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
qihflahJdj2w1lAz3fY1vZ74P8rF3bKAQQAA

-->

</rfc>
