<?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-01" 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-01"/>
    <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 the atomic update of 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.
I.e., multiple WRITE operations within the same compound could be
atomically applied, but that is implementation specific. There is
nothing in the protocol that ensures such coordination.</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.</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.</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>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>
    </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 257?>

<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 and Pali Rohar 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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
ntGfyzAhIIuuKFvif7myFWLaJgAA

-->

</rfc>
