<?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-03" 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-03"/>
    <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>
        <t>The SWAP operation does not require the server to provide exactly-once
execution semantics.  A server that does not maintain a persistent
reply cache <bcp14>MAY</bcp14> execute a replayed SWAP operation more than once,
provided the associated stateids remain valid.</t>
        <t>Stateids supplied with the SWAP 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 SWAP operation <bcp14>MUST</bcp14> fail with an appropriate
error.</t>
        <t>Clients <bcp14>MUST NOT</bcp14> assume that a successfully replayed SWAP operation
was executed only once. Clients that require confirmation of the
effects of a SWAP operation <bcp14>MUST</bcp14> validate the resulting file contents
or metadata, such as via the change attribute, as required for other
non-idempotent operations in NFSv4.2.</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 285?>

<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, 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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

-->

</rfc>
