<?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-06" 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-06"/>
    <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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
VZSvStQkux5Ya6iZbvuaXk/8H00WkYCAQQAA

-->

</rfc>
