<?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-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="atomic SWAP">Adding an Atomic SWAP Operation to NFSv4.2</title>
    <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-swap-02"/>
    <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 43?>

<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 SWAP operation which provides for such atomic
updates.  This document extends NFSv4.2 (see RFC7862).</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 50?>

<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/swap"/>.</t>
      <t>Working Group information can be found at <eref target="https://github.com/ietf-wg-nfsv4"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<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 and another client doing a READ might 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 <bcp14>OPTIONAL</bcp14> to implement SWAP operation
to NFSv4.2 to atomically apply multiple WRITE operations to a file.
A client can easily determine whether or not a server supports the
SWAP operation by examining the return code of the operation.  If
the server does not support the SWAP operation, it will return an
error of NFS4ERR_NOTSUPP.</t>
      <t>One way to use the SWAP operation is to CLONE a file and make
modifications to the cloned copy. Once the cloned copy is ready,
the SWAP 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>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-swap-swap-a-range-of-a-file-into-another-file">
      <name>Operation 81: SWAP - Swap a range of a file into another file</name>
      <section anchor="arguments">
        <name>ARGUMENTS</name>
        <figure anchor="fig-SWAP4args">
          <name>XDR for SWAP4args</name>
          <sourcecode type="xdr"><![CDATA[
 /// struct SWAP4args {
 ///         /* SAVED_FH: source file */
 ///         /* CURRENT_FH: destination file */
 ///         stateid4        sa_src_stateid;
 ///         stateid4        sa_dst_stateid;
 ///         offset4         sa_src_offset;
 ///         offset4         sa_dst_offset;
 ///         length4         sa_count;
 /// };
]]></sourcecode>
        </figure>
      </section>
      <section anchor="results">
        <name>RESULTS</name>
        <figure anchor="fig-SWAP4res">
          <name>XDR for SWAP4res</name>
          <sourcecode type="xdr"><![CDATA[
 /// struct SWAP4res {
 ///         nfsstat4        sr_status;
 /// };
]]></sourcecode>
        </figure>
      </section>
      <section anchor="description">
        <name>DESCRIPTION</name>
        <t>The SWAP operation is used to swap 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 must 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 sa_dst_stateid <bcp14>MUST</bcp14> refer to a stateid that is valid for a WRITE
operation and follows the rules for stateids in Sections 8.2.5 of
<xref target="RFC7862"/> and 18.32.3 of <xref target="RFC8881"/>.  The sa_src_stateid <bcp14>MUST</bcp14>
refer to a stateid that is valid for a READ operation and follows
the rules for stateids in Sections 8.2.5 of <xref target="RFC7862"/> and 18.22.3
of <xref target="RFC8881"/>.  If either stateid is invalid, then the operation
<bcp14>MUST</bcp14> fail.</t>
        <t>The sa_src_offset is the starting offset within the source file
from which the data to be swapped will be obtained, and the
sa_dst_offset is the starting offset of the target region into which
the swapped data will be placed.  An offset of 0 (zero) indicates
the start of the respective file.  The number of bytes to be swapped
is obtained from sa_count, except that a sa_count of 0 (zero)
indicates that the number of bytes to be swapped is the count of
bytes between sa_src_offset and the EOF of the source file.  Both
sa_src_offset and sa_dst_offset must be aligned to the clone block
size (Section 12.2.1 of <xref target="RFC7862"/>).  The number of bytes to be
swapped must be a multiple of the clone block size, except in the
case in which sa_src_offset plus the number of bytes to be swapped
is equal to the source file size.</t>
        <t>If the source offset or the source offset plus count is greater
than the size of the source file, the operation <bcp14>MUST</bcp14> fail with
NFS4ERR_INVAL.  The destination offset or destination offset plus
count may be greater than the 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 SWAP operation ends beyond the end of the
destination file, the offset at the end of the target area will
determine the new size of the destination file.  The contents of
any block not part of the target area will be the same as if the
file size were extended by a WRITE.</t>
        <t>If the area to be swapped is not a multiple of the clone block size
and the size of the destination file is past the end of the target
area, the area between the end of the target area and the next
multiple of the clone block size will be zeroed to ensure deterministic
file contents.</t>
        <t>The SWAP operation is atomic in that other operations may not see
any intermediate states between the state of the two files before
the operation and after the operation.  READs of the destination
file will never see some blocks of the target area cloned without
all of them being swapped.  WRITEs of the source area will 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>The completion status of the operation is indicated by sr_status.</t>
      </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>
      <table anchor="tbl-ops-and-errors">
        <name>Operations and Their Valid Errors</name>
        <thead>
          <tr>
            <th align="left">Operation</th>
            <th align="left">Errors</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">SWAP</td>
            <td align="left">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</td>
          </tr>
        </tbody>
      </table>
      <t>If the destination file has active pNFS layouts that prevent atomic
modification of the target range, the server may 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 SWAP 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 'spec.txt', execute the following command:</t>
      <sourcecode type="shell"><![CDATA[
sh extract.sh < spec.txt > swap_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>This document imposes no new security considerations to NFSv4.2.</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="RFC4949">
          <front>
            <title>Internet Security Glossary, Version 2</title>
            <author fullname="R. Shirey" initials="R." surname="Shirey"/>
            <date month="August" year="2007"/>
            <abstract>
              <t>This Glossary provides definitions, abbreviations, and explanations of terminology for information system security. The 334 pages of entries offer recommendations to improve the comprehensibility of written material that is generated in the Internet Standards Process (RFC 2026). The recommendations follow the principles that such writing should (a) use the same term or definition whenever the same concept is mentioned; (b) use terms in their plainest, dictionary sense; (c) use terms that are already well-established in open publications; and (d) avoid terms that either favor a particular vendor or favor a particular technology or mechanism over other, competing techniques that already exist or could be developed. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="FYI" value="36"/>
          <seriesInfo name="RFC" value="4949"/>
          <seriesInfo name="DOI" value="10.17487/RFC4949"/>
        </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 268?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Christoph Helwig inadvertently pointed out the XFS swap implementation
(<xref target="XFS-EXCHANGE-RANGE"/>) which prompted this document.</t>
      <t>David Noveck, Pali Rohar, and Rick Macklem 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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
XWO3xP8Agqi1hBIpAAA=

-->

</rfc>
