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

<t>The Network File System version 4.2 (NFSv4.2) allows for the atomic
update of data in a single WRITE operation. It does not allow for
an atomic update of multiple WRITE operations. This document
introduces a new SWAP operation which allows for such atomic updates.
This document extends NFSv4.2 (see RFC7862).</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <?line 52?>

<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 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>With the Network File System version 4.2 (NFSv4.2), a single WRITE
operation can be atomically applied to a file. However, multiple
WRITE operations, even within the same compoud, 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 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>
    <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="xdr-for-uncacheable-attribute">
      <name>XDR for Uncacheable Attribute</name>
      <sourcecode type="xdr"><![CDATA[
///
/// typedef bool            fattr4_uncacheable_file;
///
/// const FATTR4_UNCACHEABLE_FILE       = 87;
///
]]></sourcecode>
    </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</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 269?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Christoph Helwig inadvertantly pointed out the XFS swap implementation
(<xref target="XFS-EXCHANGE-RANGE"/>) which prompted this document.</t>
      <t>Chris Inacio, Brian Pawlowski, and Gorry Fairhurst helped guide
this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
