<?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.29 (Ruby 3.4.4) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-cel-nfsv4-copy-implementation-experience-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="NFSv4.2 COPY Implementation Experience">Network File System version 4.2 COPY Operation Implementation Experience</title>
    <seriesInfo name="Internet-Draft" value="draft-cel-nfsv4-copy-implementation-experience-01"/>
    <author fullname="Olga Kornievskaia">
      <organization abbrev="RedHat">Red Hat</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>okorniev@redhat.com</email>
      </address>
    </author>
    <author fullname="Chuck Lever" role="editor">
      <organization abbrev="Oracle">Oracle Corporation</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>chuck.lever@oracle.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFSv4.2</keyword>
    <keyword>COPY</keyword>
    <keyword>CLONE</keyword>
    <keyword>WRITE_SAME</keyword>
    <keyword>offload</keyword>
    <abstract>
      <?line 73?>

<t>This document describes the authors' experience implementing the
NFSv4.2 COPY operation, as described in <xref target="RFC7862"/>. It then
recommends and motivates updates to that document. This is not
a normative document.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://chucklever.github.io/i-d-update-copy-spec/#go.draft-cel-nfsv4-update-copy-spec.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-cel-nfsv4-copy-implementation-experience/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        nfsv4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/chucklever/i-d-update-copy-spec"/>.</t>
    </note>
  </front>
  <middle>
    <?line 80?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="RFC7862"/> introduces a facility to the NFSv4 protocol for NFS clients
to request that an NFS server copy data from one file to another.
Because the data copy happens on the NFS server, it avoids the transit
of file data between client and server during the copy operation.
This reduces latency, network bandwidth requirements, and the exposure
of file data to third parties when handling the copy request.</t>
      <t>Based on implementation experience, this document reports on areas where
specification wording can be improved to better guarantee interoperation.
These are mostly errors of omission that allow interoperability gaps to
arise due to subtleties and ambiguities in the original specification of
the COPY operation in <xref target="RFC7862"/>.</t>
      <section anchor="executive-summary">
        <name>Executive Summary</name>
        <t>This document addresses several areas where the copy offload specification
in <xref target="RFC7862"/> has shown to be insufficient to ensure good interoperability:</t>
        <ul spacing="normal">
          <li>
            <t>The specification does not clearly state which copy offload operations
are mandatory-to-implement for servers supporting synchronous versus
asynchronous copy (<xref target="sec-sync-v-async"/>).</t>
          </li>
          <li>
            <t>Multiple issues affect copy stateids, including
inconsistent terminology (<xref target="sec-stateid-terms"/>),
race conditions between operations (<xref target="sec-reply-race"/>),
and
unclear lifetime requirements (<xref target="sec-lifetime"/>).</t>
          </li>
          <li>
            <t>Insufficient guidance exists for when callback services should return
specific status codes (<xref target="sec-cb-offload-status"/>),
which status codes are valid for reporting
completion (<xref target="sec-completion-status"/>),
and
whether callbacks are required after cancellation
(<xref target="sec-cancel-implementation"/>).</t>
          </li>
          <li>
            <t>Several operations lack clarity, including the meaning of "optional"
fields in OFFLOAD_STATUS (<xref target="sec-status-implementation"/>),
permission for short COPY results (<xref target="sec-short-copy-results"/>),
and
requirements for polling when callbacks are lost
(<xref target="sec-completion-reliability"/>).</t>
          </li>
          <li>
            <t>The description of the FATTR4_CLONE_BLKSIZE attribute lacks essential
details about units, semantics, and scope (<xref target="sec-fattr4-clone-blksize"/>).</t>
          </li>
          <li>
            <t>No guidance exists for handling asynchronous copies during server
shutdown or client state recovery after server restart
(<xref target="sec-server-shutdown"/>).</t>
          </li>
          <li>
            <t>Missing recommendations for denial-of-service mitigations specific
to copy offload operations (<xref target="sec-security-considerations"/>).</t>
          </li>
        </ul>
      </section>
    </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?>

<t>This document is Informative. However, it utilizes BCP14 compliance
keywords in two ways:</t>
      <ul spacing="normal">
        <li>
          <t>As part of quotations of Normative RFCs, or</t>
        </li>
        <li>
          <t>As part of suggested improvements to Normative language found in
Normative RFCs.</t>
        </li>
      </ul>
      <t>These BCP14 keyword usages are Informative only.</t>
    </section>
    <section anchor="sec-sync-v-async">
      <name>Synchronous versus Asynchronous COPY</name>
      <t>The NFSv4.2 protocol is designed so that an NFSv4.2 server
is considered protocol compliant whether it implements the COPY
operation or not. This means that NFSv4.2 server implementers
are free to not implement COPY.</t>
      <t>If implementers choose to provide it, the COPY operation comes
in two distinct flavors:</t>
      <ul spacing="normal">
        <li>
          <t>synchronous, where the server reports the final status of the
operation directly in the response to the client's COPY request</t>
        </li>
        <li>
          <t>asynchronous, where the server agrees to report the final status
of the operation at a later time via a callback operation</t>
        </li>
      </ul>
      <t><xref target="RFC7862"/> does not take a position on whether a client or server
is mandated to implement either or both forms of COPY, though it
does clearly state that to support inter-server copy, asynchronous
copy is mandatory-to-implement.</t>
      <t>The implementation requirements for these two forms of copy offload
are quite distinct from each other. Some implementers have chosen
to avoid the more complex asynchronous form of COPY.</t>
      <t>However, NFS clients must be able to detect what an NFS server
provides in order to fall back quickly and gracefully when the copy
offload facility of their choice is not available.</t>
      <section anchor="detecting-support-for-copy">
        <name>Detecting Support For COPY</name>
        <t><xref section="4.1.2" sectionFormat="of" target="RFC7862"/> states:</t>
        <ul empty="true">
          <li>
            <t>Inter-server copy, intra-server copy, and intra-server clone are each
<bcp14>OPTIONAL</bcp14> features in the context of server-side copy.  A server may
choose independently to implement any of them.  A server implementing
any of these features may be <bcp14>REQUIRED</bcp14> to implement certain
operations.  Other operations are <bcp14>OPTIONAL</bcp14> in the context of a
particular feature (see Table 5 in Section 13) but may become
<bcp14>REQUIRED</bcp14>, depending on server behavior.  Clients need to use these
operations to successfully copy a file.</t>
          </li>
        </ul>
        <t><xref target="RFC7862"/> distinguishes between implementations that support
inter-server or intra-server copy, but does not differentiate
between implementations that support synchronous versus asynchronous
copy.</t>
        <t>To interoperate successfully, a client and server must be able
to determine which forms of COPY are implemented and fall back to
a normal READ/WRITE-based copy when necessary. The following
additional text can make this more clear:</t>
        <ul empty="true">
          <li>
            <t>Given the operation of the signaling in the ca_synchronous field
as described in <xref section="15.2.3" sectionFormat="of" target="RFC7862"/>, an implementation
that supports the NFSv4.2 COPY operation <bcp14>MUST</bcp14> support synchronous
copy and <bcp14>MAY</bcp14> support asynchronous copy.</t>
          </li>
        </ul>
      </section>
      <section anchor="mandatory-to-implement-operations">
        <name>Mandatory-To-Implement Operations</name>
        <t>The synchronous form of copy offload does not need the client or
server to implement the NFSv4.2 OFFLOAD_CANCEL, OFFLOAD_STATUS, or
CB_OFFLOAD operations.</t>
        <t>Moreover, the COPY_NOTIFY operation is required only when an
implementation provides inter-server copy offload. Thus a minimum
viable synchronous-only copy implementation can get away with
implementing only the COPY operation and can leave the other
three operations mentioned here unimplemented.</t>
        <t>The asynchronous form of copy offload is not possible without
the implementation of CB_OFFLOAD, and not reliable without the
implementation of OFFLOAD_STATUS. The original specification of
copy offload does not make these two operations mandatory-to-implement
when an implementation claims to support asynchronous COPY. The
addition of the following text can make this requirement clear:</t>
        <ul empty="true">
          <li>
            <t>When an NFS server implementation provides an asynchronous copy
capability, it <bcp14>MUST</bcp14> implement the OFFLOAD_CANCEL and OFFLOAD_STATUS
operations, and <bcp14>MUST</bcp14> implement the CB_OFFLOAD callback operation.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="copy-stateids">
      <name>Copy stateIDs</name>
      <t>There are a number of areas where <xref target="RFC7862"/> is mute or unclear on
the details of copy stateids. We start by defining some terms.</t>
      <section anchor="sec-stateid-terms">
        <name>Terminology</name>
        <t>An NFSv4 stateid is a fixed-length blob of data (a hash, if you will)
that represents operational state known to both an NFSv4 client and
server. A stateid can represent open file state, file lock state, or
a delegation.</t>
        <t><xref target="RFC7862"/> introduces a new category of stateid that it calls a
"copy stateid". That document lacks a specific definition of this
term. The term is applied to at least two different usages of a
stateid, neither of which can be used for the other use, and
neither of which can be used for existing categories of stateid
(open, lock, and delegation).</t>
        <t><xref target="RFC7862"/> refers to what is returned in cnr_stateid result of a
COPY_NOTIFY response (<xref section="15.3.2" sectionFormat="of" target="RFC7862"/>)
and what is to be used as the ca_src_stateid argument in a COPY
request (<xref section="15.2.2" sectionFormat="of" target="RFC7862"/>) as "a copy stateid":</t>
        <ul empty="true">
          <li>
            <t>The cnr_stateid is a copy stateid that uniquely describes the state
needed on the source server to track the proposed COPY.</t>
          </li>
        </ul>
        <t><xref section="15.2.3" sectionFormat="of" target="RFC7862"/> refers to what is returned in the
wr_callback_id field of a COPY response as a "copy stateid":</t>
        <ul empty="true">
          <li>
            <t>The wr_callback_id stateid is termed a "copy stateid" in this context.</t>
          </li>
        </ul>
        <t>A field named wr_callback_id appears in the WRITE_SAME response
for the same purpose, but <xref section="15.12.3" sectionFormat="of" target="RFC7862"/> avoids
referring to this as a "copy stateid". It also appears as part of
the argument of a CB_OFFLOAD request just like COPY's wr_callback_id.
It is not referred to as a "copy stateid" in that section.</t>
        <t><xref section="4.8" sectionFormat="of" target="RFC7862"/> is entitled "Copy Offload Stateids",
and states:</t>
        <ul empty="true">
          <li>
            <t>A server may perform a copy offload operation asynchronously.  An
asynchronous copy is tracked using a copy offload stateid.  Copy
offload stateids are included in the COPY, OFFLOAD_CANCEL,
OFFLOAD_STATUS, and CB_OFFLOAD operations.</t>
          </li>
        </ul>
        <t>The term "copy offload stateid" is not used anywhere else in <xref target="RFC7862"/>,
therefore it is unclear whether this section refers only to the values
that can appear in a wr_stateid field, or if it refers to all copy
stateids.</t>
        <t>Note also that <xref section="15.8.3" sectionFormat="of" target="RFC7862"/> does not refer to
the oca_stateid argument of an OFFLOAD_CANCEL request by any
special name, nor does it restrict the category of stateid
that may appear in this argument.
Likewise for the osa_stateid argument of an OFFLOAD_STATUS request
(<xref section="15.9.3" sectionFormat="of" target="RFC7862"/>)
and the coa_stateid argument of a CB_OFFLOAD request
(<xref section="16.1.3" sectionFormat="of" target="RFC7862"/>).</t>
        <t>To alleviate this confusion, it is appropriate to construct
definitions for the specific usages of stateids that represent
the state of ongoing offloaded operations. Perhaps the following
might be helpful:</t>
        <dl>
          <dt>copy stateid:</dt>
          <dd>
            <t>A stateid that uniquely and globally describes the state
needed on the source server to track a COPY operation.
A copy stateid begins its lifetime when an NFS server forms
the response to a COPY_NOTIFY operation.</t>
          </dd>
          <dt>offload stateid:</dt>
          <dd>
            <t>A stateid that uniquely describes the completion state of an
offloaded operation (either WRITE_SAME or COPY).</t>
          </dd>
        </dl>
      </section>
      <section anchor="use-of-delegation-stateids">
        <name>Use of Delegation Stateids</name>
        <t>According to <xref section="15.2.1" sectionFormat="of" target="RFC7862"/>:</t>
        <ul empty="true">
          <li>
            <t>The ca_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 and
18.32.3 of <xref target="RFC5661"/>.  For an inter-server copy, the ca_src_stateid
<bcp14>MUST</bcp14> be the cnr_stateid returned from the earlier COPY_NOTIFY
operation, while for an intra-server copy ca_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 and 18.22.3 of <xref target="RFC5661"/>.</t>
          </li>
        </ul>
        <t>The first sentence appears to allow the use of delegation stateids,
while the second seems to clearly exclude the use of delegation stateids.
Since the specification does not describe how a server needs to respond
to operations that conflict with delegation stateids, one must assume
that the first sentence is incorrect.</t>
        <t>In terms of implementation guidance, in light of types of open permitted
by <xref target="RFC9754"/>, in particular, OPEN4_SHARE_ACCESS_WANT_OPEN_XOR_DELEGATION,
OPEN operations performed to acquire stateids for a COPY operation might
receive only a delegation stateid. When preparing for a COPY operation,
NFSv4 clients need to indicate that a delegation is not wanted.</t>
      </section>
      <section anchor="cnrleasetime">
        <name>cnr_lease_time</name>
        <aside>
          <t>olga:
COPY_NOTIFY produces a copy stateid. How long should it be valid?
Perhaps it's indirectly discussed by the 15.3.3 in cnr_lease_time.
So copy stateid is valid for
cnr_lease_time or while copy is ungoing? That's what Linux server
implements laundry thread revokes if lease period has gone by without
it being marked valid.</t>
          <t>I was going to complain about the uselessness (in my point of
view) of the spec's cnr_lease_time. Source server sends that value to
the client. Client doesn't propagate that value to the destination
server. How can the client control the destination starting the read
by the cnr_lease_time (the destination server doesnt know by when it
needs to start the copy)? But I can see that the source server wants
to protect itself from "unauthorized" (really late) reading. I just
find that telling the client isn't useful.</t>
          <t>I believe the Linux server implements the safeguards and requires the
start of the COPY operation to happen within a lease period. My grep
thru the code for "NFS4ERR_PARTNER_NO_AUTH" comes up empty. So we
don't exercise letting the destination server know the copy isn't
meeting "copy progress" constraints.</t>
        </aside>
      </section>
      <section anchor="use-of-offload-stateids-as-a-completion-cookie">
        <name>Use of Offload Stateids As A Completion Cookie</name>
        <t>As implementation of copy offload proceeds, developers face
a number of questions regarding the use of copy stateids to
report operational completion. For completion, these issues
need to be addressed by the specification:</t>
        <ul spacing="normal">
          <li>
            <t>How is sequence number in a copy stateid handled?  Under
what circumstances is its sequence number bumped? Do peers
match copy stateids via only their "other" fields, or must
they match everything including the sequence number?</t>
          </li>
          <li>
            <t>Under what circumstances may a server re-use the same copy
stateid during one NFSv4.1 session?</t>
          </li>
          <li>
            <t>How long does the client's callback service have to remember
copy stateids? Is the callback service responsible for
remembering and reporting previously-used copy stateids?</t>
          </li>
          <li>
            <t>When does the client's callback service return
NFS4ERR_BAD_STATEID to a CB_OFFLOAD operation, and what
action should the server take, since there's no open state
recovery to be done on the NFSv4 server?</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-reply-race">
        <name>COPY Reply Races With CB_OFFLOAD Request</name>
        <t>Due to the design of the NFSv4.2 COPY and COPY_OFFLOAD
operations, an NFS clietn's callback service cannot recognize
a copy stateid presented by a CB_OFFLOAD request until after
the client has received and processed the COPY response. This
COPY response both confirms that an asynchronous copy
operation has started and provides the copy stateid. Under
some conditions, the client may process the CB_OFFLOAD request
before processing the matching COPY reply.</t>
        <t>There are a few alternatives to consider when designing the
client callback service implementation of the CB_OFFLOAD
operation. Among other designs, client implementers might
choose to:</t>
        <ul spacing="normal">
          <li>
            <t>Maintain a cache of unmatched CB_OFFLOAD requests in the
expectation of a matching COPY response arriving imminently.
(Danger of accruing unmatched copy stateids over time).</t>
          </li>
          <li>
            <t>Have CB_OFFLOAD return NFS4ERR_DELAY if the copy stateid
is not recognized. (Danger of infinite looping).</t>
          </li>
          <li>
            <t>Utilize a referring call list contained in the CB_SEQUENCE
in the same COMPOUND (as described in
<xref section="20.9.3" sectionFormat="of" target="RFC8881"/>) to determine whether an
ingress CB_OFFLOAD is likely to match a COPY operation the
client sent previously.</t>
          </li>
        </ul>
        <t>While the third alternative might appear to be the most
bullet-proof, there are still issues with it:</t>
        <ul spacing="normal">
          <li>
            <t>There is no normative requirement in <xref target="RFC8881"/> or <xref target="RFC7862"/>
that a server implement referring call lists, and it is known
that some popular server implementations in fact do not
implement them. Thus a client callback service cannot depend
on a referring call list being available.</t>
          </li>
          <li>
            <t>Client implementations must take care to place no more than
one non-synchronous COPY operation per COMPOUND. If there are
any more than one, then the referring call list becomes useless
for disambiguating CB_OFFLOAD requests.</t>
          </li>
        </ul>
        <t>The authors recommend that the implementation notes for the
CB_OFFLOAD operation contain appropriate and explicit guidance
for tackling this race, rather than a simple reference to
<xref target="RFC8881"/>.</t>
      </section>
      <section anchor="sec-lifetime">
        <name>Lifetime Requirements</name>
        <t>An NFS server that implements only synchronous copy does not
require the stricter COPY stateid lifetime requirements described
in <xref section="4.8" sectionFormat="of" target="RFC7862"/>. A stateid used with a synchronous
copy lives only until the COPY operation has completed.</t>
        <t>Regarding asynchronous copy offload,
the second paragraph of <xref section="4.8" sectionFormat="of" target="RFC7862"/> states:</t>
        <ul empty="true">
          <li>
            <t>A copy offload stateid will be valid until either (A) the client or
server restarts or (B) the client returns the resource by issuing an
OFFLOAD_CANCEL operation or the client replies to a CB_OFFLOAD
operation.</t>
          </li>
        </ul>
        <t>This paragraph is unclear about what "client restart" means, at least
in terms of what specific actions a server should take and when, how
long a COPY stateid is required to remain valid, and how a client
needs to act during state recovery. A stronger statement about
COPY stateid lifetime can improve the guarantee of interoperability:</t>
        <ul empty="true">
          <li>
            <t>When a COPY stateid is used for an asynchronous copy, an NFS
server <bcp14>MUST</bcp14> retain the COPY stateid, except as follows below.
An NFS server <bcp14>MAY</bcp14> invalidate and purge a COPY stateid in the
following circumstances:</t>
            <t>o The server instance restarts.</t>
            <t>o The server expires the owning client's lease.</t>
            <t>o The server receives an EXCHANGE_ID or DESTROY_CLIENTID request
  from the owning client that results in the destruction of that
  client's lease.</t>
            <t>o The server receives an OFFLOAD_CANCEL request from the owning
  client that matches the COPY stateid.</t>
            <t>o The server receives a reply to a CB_OFFLOAD request from the
  owning client that matches the COPY stateid.</t>
          </li>
        </ul>
        <t>Implementers have found the following behavior to work well for
clients when recovering state after a server restart:</t>
        <ul empty="true">
          <li>
            <t>When an NFSv4 client discovers that a server instance has restarted,
it must recover state associated with files on that server, including
state that manages offloaded copy operations. When an NFS server
restart is detected, the client purges existing COPY state and
redrives its incompleted COPY requests from their beginning. No
other recovery is needed for pending asynchronous copy operations.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="status-codes-their-meanings-and-their-usage">
      <name>Status Codes, Their Meanings, and Their Usage</name>
      <t><xref target="RFC7862"/> specifies the use of certain status codes for use with copy
offload operations but provides insufficient guidance on when and how
these codes should be used, particularly for the CB_OFFLOAD callback
operation. The lack of clarity around error handling creates
interoperability risks, as client and server implementers may make
different assumptions about compliant behavior.</t>
      <section anchor="sec-cb-offload-status">
        <name>Status Codes for the CB_OFFLOAD Operation</name>
        <t><xref section="16.1.3" sectionFormat="of" target="RFC7862"/> describes the CB_OFFLOAD command, but
provides no information, normative or otherwise, about the NFS client's
callback service is to use CB_OFFLOAD's response status codes. The set
of permitted status codes is listed in <xref section="11.3" sectionFormat="of" target="RFC7862"/>.
The usual collection of status codes related to compound structure
and session parameters are available.</t>
        <t>However, Section 11.3 also lists NFS4ERR_BADHANDLE, NFS4ERR_BAD_STATEID,
and NFS4ERR_DELAY, but <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> does not give any
direction about when an NFS client's callback service should return them.
In a protocol specification, it is usual practice to describe server
responses to a malformed request, but that is entirely missing in that
section of <xref target="RFC7862"/>.</t>
        <section anchor="nfs4errbadhandle">
          <name>NFS4ERR_BADHANDLE</name>
          <t><xref section="15.1.2.1" sectionFormat="of" target="RFC8881"/> defines NFS4ERR_BADHANDLE this way:</t>
          <ul empty="true">
            <li>
              <t>Illegal NFS filehandle for the current server. The current filehandle
failed internal consistency checks.</t>
            </li>
          </ul>
          <t>There is no filesystem on an NFS client to determine whether a
filehandle is valid, thus this definition of NFS4ERR_BADHANDLE is not
sensible for the CB_OFFLOAD operation.</t>
          <t>The CB_RECALL operation might have been the model for the CB_OFFLOAD
operation. <xref section="20.2.3" sectionFormat="of" target="RFC8881"/> states:</t>
          <ul empty="true">
            <li>
              <t>If the handle specified is not one for which the client holds a
delegation, an NFS4ERR_BADHANDLE error is returned.</t>
            </li>
          </ul>
          <t>Thus, if the coa_fh argument specifies a filehandle for which the
NFS client currently has no pending copy operation, the NFS client's
callback service returns the status code NFS4ERR_BADHANDLE. The
protocol specification does not mandate that the NFS client's
callback service remember filehandles after a copy operation has
completed.</t>
          <aside>
            <t>cel: Is the NFS server permitted to purge the copy offload stateid
if the CB_OFFLOAD status code is NFS4ERR_BADHANDLE ?</t>
          </aside>
          <t>The authors recommend that <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> should be
updated to describe this use of NFS4ERR_BADHANDLE.</t>
        </section>
        <section anchor="nfs4errbadstateid">
          <name>NFS4ERR_BAD_STATEID</name>
          <t><xref section="15.1.5.2" sectionFormat="of" target="RFC8881"/> states that NFS4ERR_BAD_STATEID means
that:</t>
          <ul empty="true">
            <li>
              <t>A stateid does not properly designate any valid state.</t>
            </li>
          </ul>
          <t>In the context of a CB_OFFLOAD operation, "valid state" refers to
either the coa_stateid argument, which is a copy stateid, or the
wr_callback_id argument, which is a copy offload stateid.</t>
          <t>If the NFS client's callback service does not recognize the stateid
contained in the coa_stateid argument, the NFS client's callback
service responds with a status code of NFS4ERR_BAD_STATEID.</t>
          <t>The NFS client is made aware of the copy offload stateid by a response
to a COPY operation. If the CB_OFFLOAD request arrives before the
COPY response, the NFS client's callback service will not recognize that
copy offload stateid.</t>
          <ul spacing="normal">
            <li>
              <t>The NFS server might have provided a referring call in the CB_SEQUENCE
operation included in the COMPOUND with the CB_OFFLOAD (see
<xref section="2.10.6.3" sectionFormat="of" target="RFC8881"/>. In that case the NFS client's
callback service waits for the matching COPY response before taking
further action.</t>
            </li>
            <li>
              <t>If the NFS server provided referring call information but the NFS
client can not find a matching pending COPY request, or if the NFS
server did not provide referring call information, the NFS client's
callback service may proceed immediately.</t>
            </li>
          </ul>
          <t>Once the NFS client's callback service is ready to proceed, it can
resolve whether the copy offload stateid contained in the wr_state_id
argument matches a currently pending copy operation. If it does not,
the NFS client's callback service responds with a status code of
NFS4ERR_BAD_STATEID.</t>
          <aside>
            <t>cel: Is the NFS server permitted to purge the copy offload stateid
if the CB_OFFLOAD status code is NFS4ERR_BAD_STATEID ?</t>
          </aside>
          <t>The authors recommend that <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> should be
updated to describe this use of NFS4ERR_BAD_STATEID.</t>
        </section>
        <section anchor="nfs4errdelay">
          <name>NFS4ERR_DELAY</name>
          <t><xref section="15.1.1.3" sectionFormat="of" target="RFC8881"/> has this to say about NFS4ERR_DELAY:</t>
          <ul empty="true">
            <li>
              <t>For any of a number of reasons, the replier could not process this
operation in what was deemed a reasonable time. The client should wait
and then try the request with a new slot and sequence value.</t>
            </li>
          </ul>
          <t>When an NFS client's callback service does not recognize the copy
offload stateid in the wr_callback_id argument but the NFS server has
not provided a referring call information, an appropriate response
to that situation is for the NFS client's callback service
to respond with a status code of NFS4ERR_DELAY.</t>
          <t>The NFS server should retry the CB_OFFLOAD operation only a limited
number of times:</t>
          <ul spacing="normal">
            <li>
              <t>The NFS client can subsequently poll for the completion status
of the copy operation using the OFFLOAD_STATUS operation.</t>
            </li>
            <li>
              <t>A buggy or malicious NFS client callback service might always return
an NFS4ERR_DELAY status code, resulting in an infinite loop if the
NFS server never stops retrying.</t>
            </li>
          </ul>
          <t>The NFS server is not permitted to purge the copy offload stateid if
the CB_OFFLOAD status code is NFS4ERR_DELAY.</t>
          <t>The authors recommend that <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> should be
updated to describe this use of NFS4ERR_DELAY.</t>
        </section>
      </section>
      <section anchor="sec-completion-status">
        <name>Status Codes for the OFFLOAD_CANCEL and OFFLOAD_STATUS Operations</name>
        <t>The NFSv4.2 OFFLOAD_STATUS and OFFLOAD_CANCEL operations both list
NFS4ERR_COMPLETE_ALREADY as a permitted status code. However, it
is not otherwise mentioned or defined in <xref target="RFC7862"/>. <xref target="RFC7863"/>
defines a value of 10054 for that status code, but is not otherwise
forthcoming about what its purpose is.</t>
        <t>We find a definition of NFS4ERR_COMPLETE_ALREADY in <xref target="RFC5661"/>.
The definition is directly related to the new-to-NFSv4.1
RECLAIM_COMPLETE operation, but is otherwise not used by other
operations.</t>
        <t>The authors recommend removing NFS4ERR_COMPLETE_ALREADY from the
list of permissible status codes for the OFFLOAD_CANCEL and
OFFLOAD_STATUS operations.</t>
      </section>
      <section anchor="status-codes-returned-for-completed-asynchronous-copy-operations">
        <name>Status Codes Returned for Completed Asynchronous Copy Operations</name>
        <t>Once an asynchronous copy operation is complete,
the NFSv4.2 OFFLOAD_STATUS response and the NFSv4.2 CB_OFFLOAD request
can both report a status code that reflects the success or failure of
the copy. This status code is reported in osr_complete field of the
OFFLOAD_STATUS response, and the coa_status field of the CB_OFFLOAD
request.</t>
        <t>Both fields have a type of nfsstat4. Typically an NFSv4 protocol
specification will constrain the values that are permitted in a
field that contains an operation status code, but <xref target="RFC7862"/> does
not appear to do so. Implementers might assume that the list of
permitted values in these two fields is the same as the COPY
operation itself; that is:</t>
        <artwork><![CDATA[
 +----------------+--------------------------------------------------+
 | COPY           | 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_OFFLOAD_DENIED,           |
 |                | NFS4ERR_OLD_STATEID, NFS4ERR_OPENMODE,           |
 |                | NFS4ERR_OP_NOT_IN_SESSION,                       |
 |                | NFS4ERR_PARTNER_NO_AUTH,                         |
 |                | NFS4ERR_PARTNER_NOTSUPP, 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         |
 +----------------+--------------------------------------------------+
]]></artwork>
        <t>However, a number of these do not make sense outside the context of
a forward channel NFSv4 COMPOUND operation, including:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_BADXDR,
NFS4ERR_DEADSESSION,
NFS4ERR_OP_NOT_IN_SESSION,
NFS4ERR_REP_TOO_BIG,
NFS4ERR_REP_TOO_BIG_TO_CACHE,
NFS4ERR_REQ_TOO_BIG,
NFS4ERR_RETRY_UNCACHED_REP,
NFS4ERR_TOO_MANY_OPS</t>
          </li>
        </ul>
        <t>Some are temporary conditions that can be retried by the NFS server
and therefore do not make sense to report as a copy completion status:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_DELAY,
NFS4ERR_GRACE,
NFS4ERR_EXPIRED</t>
          </li>
        </ul>
        <t>Some report an invalid argument or file object type, or some other
operational set up issue that should be reported only via the status
code of the COPY operation:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_BAD_STATEID,
NFS4ERR_DELEG_REVOKED,
NFS4ERR_INVAL,
NFS4ERR_ISDIR,
NFS4ERR_FBIG,
NFS4ERR_LOCKED,
NFS4ERR_MOVED,
NFS4ERR_NOFILEHANDLE,
NFS4ERR_OFFLOAD_DENIED,
NFS4ERR_OLD_STATEID,
NFS4ERR_OPENMODE,
NFS4ERR_PARTNER_NO_AUTH,
NFS4ERR_PARTNER_NOTSUPP,
NFS4ERR_ROFS,
NFS4ERR_SYMLINK,
NFS4ERR_WRONG_TYPE</t>
          </li>
        </ul>
        <t>This leaves only a few sensible status codes remaining to report
issues that could have arisen during the offloaded copy:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_DQUOT,
NFS4ERR_FHEXPIRED,
NFS4ERR_IO,
NFS4ERR_NOSPC,
NFS4ERR_PNFS_IO_HOLE,
NFS4ERR_PNFS_NO_LAYOUT,
NFS4ERR_SERVERFAULT,
NFS4ERR_STALE</t>
          </li>
        </ul>
        <t>The authors recommend including a section and table that gives
the valid status codes that the osr_complete and coa_status
fields may contain. The status code NFS4_OK (indicating no error
occurred during the copy operation) is not listed but should be
understood to be a valid value for these fields. The meaning for
each of these values is defined in <xref section="15.3" sectionFormat="of" target="RFC5661"/>.</t>
        <t>It would also be helpful to implementers to provide guidance about
when these values are appropriate to use, or when they <bcp14>MUST NOT</bcp14> be
used.</t>
      </section>
    </section>
    <section anchor="sec-cancel-implementation">
      <name>OFFLOAD_CANCEL Implementation Notes</name>
      <t>The NFSv4.2 OFFLOAD_CANCEL operation, described in
<xref section="15.8.3" sectionFormat="of" target="RFC7862"/>, is used to terminate an offloaded
copy operation before it completes normally. A CB_OFFLOAD is
not necessary when an offloaded operation completes because of
a cancelation due to CB_OFFLOAD.</t>
      <t>However, the server <bcp14>MUST</bcp14> send a CB_OFFLOAD operation if the
offloaded copy operation completes because of an administrator
action that terminates the copy early.</t>
      <t>In both cases, a subsequent OFFLOAD_STATUS returns the number
of bytes actually copied and a status code of NFS4_OK to
signify that the copy operation is no longer running. The
server should obey the usual lifetime rules for the copy
stateid associated with a canceled asynchronous copy
operation so that an NFS client can determine the status of
the operation as usual.</t>
      <t>The following is a recommended addendum to <xref target="RFC7862"/>:</t>
      <ul empty="true">
        <li>
          <t>When an offloaded copy operation completes, the NFS server sends
a CB_OFFLOAD callback to the requesting client. When an NFS
client cancels an asynchronous copy operation, however, the
server need not send a CB_OFFLOAD notification for the canceled
copy. A client should not depend on receiving completion notification
after it cancels an offloaded copy operation using the OFFLOAD_CANCEL
operation.</t>
          <t>An NFS server is still <bcp14>REQUIRED</bcp14> to send a CB_OFFLOAD notification
if an asynchronous copy operation is terminated by administrator
action.</t>
          <t>For a canceled asynchronous copy operation, CB_OFFLOAD and
OFFLOAD_STATUS report the number of bytes copied and a
completion status of NFS4_OK.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-status-implementation">
      <name>OFFLOAD_STATUS Implementation Notes</name>
      <t>Paragraph 2 of <xref section="15.9.3" sectionFormat="of" target="RFC7862"/> states:</t>
      <ul empty="true">
        <li>
          <t>If the optional osr_complete field is present, the asynchronous
operation has completed.  In this case, the status value indicates
the result of the asynchronous operation.</t>
        </li>
      </ul>
      <t>The use of the term "optional" can be (and has been) construed to mean
that a server is not required to set that field to one, ever. This
confusion arises from conflating the the term "optional" with the
BCP14 keyword <bcp14>OPTIONAL</bcp14>.</t>
      <t>Moreover, this XDR data item is always present. The protocol's XDR
definition does not permit an NFS server not to include the field
in its response.</t>
      <t>The following text makes it more clear what was originally intended:</t>
      <ul empty="true">
        <li>
          <t>To process an OFFLOAD_STATUS request, an NFS server must first
find an outstanding COPY operation that matches the request's
COPY stateid argument.</t>
          <t>If that COPY operation is still ongoing, the server forms a response
with an osr_complete array containing zero elements, fills in the
osr_count field with the number of bytes processed by the COPY
operation so far, and sets the osr_status field to NFS4_OK.</t>
          <t>If the matching copy has completed but the server has not yet seen
or processed the client's CB_OFFLOAD reply, the server forms a
response with an osr_complete array containing one element which is
set to the final status code of the copy operation. It fills in the
osr_count field with the number of bytes that were processed by the
COPY operation, and sets the osr_status to NFS4_OK.</t>
          <t>If the server can find no copy operation that matches the presented
COPY stateid, the server sets the osr_status field to
NFS4ERR_BAD_STATEID.</t>
        </li>
      </ul>
      <t>Since a single-element osr_complete array contains the status code of
a COPY operation, the specification needs to state explicitly that:</t>
      <ul empty="true">
        <li>
          <t>When a single element is present in the osr_complete array, that
element <bcp14>MUST</bcp14> contain only one of status codes permitted for the
COPY operation (see <xref section="11.2" sectionFormat="of" target="RFC7862"/>) or NFS4_OK.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-short-copy-results">
      <name>Short COPY results</name>
      <t>When a COPY request takes a long time, an NFS server must
ensure it can continue to remain responsive to other requests.
To prevent other requests from blocking, an NFS server
implementation might, for example, notice that a COPY operation
is taking longer than a few seconds and terminate it early.</t>
      <t><xref section="15.2.3" sectionFormat="of" target="RFC7862"/> states:</t>
      <ul empty="true">
        <li>
          <t>If a failure does occur for a synchronous copy, wr_count will be set
to the number of bytes copied to the destination file before the
error occurred.</t>
        </li>
      </ul>
      <t>This text considers only a failure status and not a short COPY, where
the COPY response contains a byte count shorter than the client's
request, but still returns a final status of NFS4_OK. Both the Linux
and FreeBSD implementations of the COPY operation truncate large COPY
requests in this way. The reason for returning a short COPY result is
that the NFS server has need to break up a long byte range to schedule
its resources more fairly amongst its clients. Usually the purpose of
this truncation is to avoid denial-of-service.</t>
      <t>Including the following text can make a short COPY result explicitly
permissible:</t>
      <ul empty="true">
        <li>
          <t>If a server chooses to terminate a COPY before it has completed
copying the full requested range of bytes, either because of a
pending shutdown request, an administrative cancel, or because
the server wants to avoid a possible denial of service, it <bcp14>MAY</bcp14>
return a short COPY result, where the response contains the
actual number of bytes copied and a final status of NFS4_OK.
In this way, a client can send a subsequent COPY for the
remaining byte range, ensure that forward progress is made.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-completion-reliability">
      <name>Asynchronous Copy Completion Reliability</name>
      <t>Often, NFSv4 server implementations do not retransmit backchannel
requests. There are common scenarios where lack of a retransmit can
result in a backchannel request getting dropped entirely. Common
scenarios include:</t>
      <ul spacing="normal">
        <li>
          <t>The server dropped the connection because it lost a forechannel
NFSv4 request and wishes to force the client to retransmit all
of its pending forechannel requests</t>
        </li>
        <li>
          <t>The GSS sequence number window under-flowed</t>
        </li>
        <li>
          <t>A network partition occurred</t>
        </li>
      </ul>
      <t>In these cases, pending NFSv4 callback requests are lost.</t>
      <t>NFSv4 clients and servers can recover when operations such as
CB_RECALL and CB_GETATTR go missing: After a delay, the server
revokes the delegation and operation continues.</t>
      <t>A lost CB_OFFLOAD causes the client's workload to wait
indefinitely for a completion event that will never arrive,
unless that client has a mechanism for probing the pending COPY.</t>
      <t>Typically, polling for completion means the client sends
an OFFLOAD_STATUS request. Note however that Table 5 in
<xref section="13" sectionFormat="of" target="RFC7862"/> labels OFFLOAD_STATUS <bcp14>OPTIONAL</bcp14>.</t>
      <t>Implementers of the SCSI protocol have reported that it is
in fact not possible to make SCSI XCOPY <xref target="XCOPY"/> reliable
without the use of polling. The NFSv4.2 COPY use case seems
no different in this regard.</t>
      <t>The authors recommend the following addendum to <xref target="RFC7862"/>:</t>
      <ul empty="true">
        <li>
          <t>NFSv4 servers are not required to retransmit lost backchannel
requests. If an NFS client implements an asynchronous copy
capability, it <bcp14>MUST</bcp14> implement a mechanism for recovering from
a lost CB_OFFLOAD request. The NFSv4.2 protocol provides
one such mechanism in the form of the OFFLOAD_STATUS operation.</t>
        </li>
      </ul>
      <t>In addition, Table 5 should be updated to make OFFLOAD_STATUS
<bcp14>REQUIRED</bcp14> (i.e., column 3 of the OFFLOAD_STATUS row should
read the same as column 3 of the CB_OFFLOAD row in Table 6).</t>
    </section>
    <section anchor="inter-server-copy-interoperation">
      <name>Inter-server Copy Interoperation</name>
      <aside>
        <t>olga:
If Linux server were to ever interoperate with other server
implementations of being either the source server or the destination
server: I don't know how important are the IPs being listed in the
copy_notify reply. I don't believe either the Linux client or
server does anything with them.</t>
      </aside>
    </section>
    <section anchor="nfsv42-clone-operation">
      <name>NFSv4.2 CLONE Operation</name>
      <section anchor="sec-fattr4-clone-blksize">
        <name>The FATTR4_CLONE_BLKSIZE Attribute</name>
        <t><xref section="4.1.2" sectionFormat="of" target="RFC7862"/> states that an NFS server that implements
the CLONE operation is required to implement the FATTR4_CLONE_BLKSIZE
attribute:</t>
        <ul empty="true">
          <li>
            <t>If a server supports the CLONE feature, then it <bcp14>MUST</bcp14> support the
CLONE operation and the clone_blksize attribute on any file system on
which CLONE is supported (as either source or destination file).</t>
          </li>
        </ul>
        <t>Although the Linux NFS server implements the NFSv4.2 CLONE operation,
it does not implement FATTR4_CLONE_BLKSIZE.</t>
        <t>The specification has very little to say about what this attribute
conveys. <xref section="12.2.1" sectionFormat="of" target="RFC7862"/> states only:</t>
        <ul empty="true">
          <li>
            <t>The clone_blksize attribute indicates the granularity of a CLONE
operation.</t>
          </li>
        </ul>
        <t>There are no units mentioned in this section. There are several
plausible alternatives: bytes, kilobytes, or even sectors.
<xref target="RFC7862"/> needs to make clear the underlying semantics of this
attribute value.</t>
        <t>There is no mention of what value should be used when the shared
file system does not provide or require a restrictive clone block
size. The Linux NFS client assumes that "0" means no alignment
restrictions; it skips clone alignment checking if clone_blksize
value happens to be zero. That implementation also appears to
tolerate a server that does not return the FATTR4_CLONE_BLKSIZE
attribute at all.</t>
        <t>The change history of draft-ietf-nfsv4-minorversion2 suggests that
at one point, the NFSv4.2 specification contained much more detail
about how FATTR4_CLONE_BLKSIZE was to be used. For example, older
revisions of that draft stated:</t>
        <ul empty="true">
          <li>
            <t>Both cl_src_offset and cl_dst_offset must be aligned to the clone
block size Section 12.2.1. The number of bytes to be cloned must
be a multiple of the clone block size, except in the case in which
cl_src_offset plus the number of bytes to be cloned is equal to
the source file size.</t>
          </li>
        </ul>
        <t><xref section="12" sectionFormat="of" target="RFC7862"/> does not specify whether FATTR4_CLONE_BLKSIZE
is a per-file, per-file system, or per-server attribute. Per-file is
perhaps the most appropriate because some modern file systems can use
different block sizes for different files.</t>
        <t>Note that <xref section="4.1.2" sectionFormat="of" target="RFC7862"/> states that the attribute <bcp14>MUST</bcp14>
be implemented, but <xref section="12.2" sectionFormat="of" target="RFC7862"/> defines this attribute
as <bcp14>RECOMMENDED</bcp14>. This contradiction needs to be rectified.</t>
        <t>An alternative to correcting the missing details is to instead
deprecate the FATTR4_CLONE_BLKSIZE attribute. Server and filesystem
combinations that cannot provide a fast, unrestricted byte-range clone
mechanism would simply not make an NFSv4.2 CLONE operation available to
NFSv4 clients.</t>
        <t>It might be that was the intention of the redaction of the alignment
text from draft-ietf-nfsv4-minorversion2, and the FATTR4_CLONE_BLKSIZE
attribute was simply missed during that edit of the document.</t>
      </section>
    </section>
    <section anchor="sec-server-shutdown">
      <name>Handling NFS Server Shutdown</name>
      <t>Asynchronous copy operations present unique challenges during server
shutdown and restart events. Unlike other NFSv4 operations that typically
complete quickly, asynchronous copies can be long-running operations
that are still in progress when an NFS server needs to shut down.</t>
      <t>Additionally, clients must be able to recover the state of pending
copy operations after a server restart. <xref target="RFC7862"/> does not provide
guidance for either scenario, leaving implementors to guess at
appropriate and safe behavior. This section addresses how servers
should handle ongoing asynchronous copy operations during server
shutdown, and how clients should handle state recovery after detecting
a server restart.</t>
      <section anchor="graceful-shutdown">
        <name>Graceful Shutdown</name>
        <t>This section discusses what happens to ongoing asynchronous copy
operations when an NFS server shuts down due to an administrator
action.</t>
        <t>When an NFS server shuts down, it typically stops accepting work
from the network. However, asynchronous copy is work the NFS server
has already accepted. Normal network corking will not terminate
ongoing work; corking stops only new work from being accepted.</t>
        <t>Thus, as an early part of NFS server shut down processing, the NFS
server <bcp14>SHOULD</bcp14> explicitly terminate ongoing asynchronous copy operations.
This triggers sending CB_OFFLOAD notifications for each terminated
copy operation prior to the backchannel closing down. Each completion
notification shows how many bytes the NFS server successfully copied
before the copy operation was terminated by the shutdown.</t>
        <t>To prevent the destruction of the backchannel while asynchronous
copy operations are ongoing, the DESTROY_SESSION and DESTROY_CLIENTID
operations <bcp14>MUST</bcp14> return a status of NFS4ERR_CLIENTID_BUSY until pending
asynchronous copy operations have terminated
(see <xref section="18.50.3" sectionFormat="of" target="RFC8881"/>).</t>
        <t>Once copy activity has completed, shut down processing can also
proceed to remove all copy completion state (copy stateids, copy
offload stateids, and copy completion status codes).</t>
        <t>An alternative implementation is that ongoing COPY operations are
simply terminated without a CB_OFFLOAD notification. In that case,
NFS clients recognize that the NFS server has restarted, and as part
of their state recovery, they can reissue any COPY operations that
were pending during the previous server epoch, as described in the
next subsection.</t>
        <aside>
          <t>olga: This graceful shutdown seems like putting too much
requirement on the server. Say the server was in the middle of doing
lots of WRITEs, does graceful shutdown terminate the writes and send
short write response back? Or read....</t>
        </aside>
      </section>
      <section anchor="client-recovery-actions">
        <name>Client Recovery Actions</name>
        <t>In order to ensure the proper completion of asynchronous COPY
operations that were active during an NFS server restart, clients
need to track these operations and restart them as part of NFSv4
state recovery.</t>
      </section>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>One critical responsibility of an NFS server implementation is
to manage its finite set of resources in a way that minimizes the
opportunity for network actors (such as NFS clients) to maliciously
or unintentionally trigger a denial-of-service scenario.  The authors
recommend the following addendum to <xref section="4.9" sectionFormat="of" target="RFC7862"/>.</t>
      <ul empty="true">
        <li>
          <t>Restricting Copies of Special Files</t>
          <t>Certain files on Unix-based systems act as an infinite source of
data. One example is /dev/null. Another example is the system's
random data generator. Server implementators should recognize
these data sources and prevent unlimited copy operations from
them (or to their sink counterparts).</t>
          <t>Limiting Size of Individual COPY Operations</t>
          <t>NFS server implementations have so far chosen to limit the byte
range of COPY operations, either by setting a fixed limit on the
number of bytes a single COPY can process, where the server
truncates the copied byte range, or by setting a timeout). In
either case, the NFS server returns a short COPY result.</t>
          <t>Client implementations accommodate a short COPY result by sending
a fresh COPY for the remainder of the byte range, until the
full byte range has been processed.</t>
          <t>Limiting the Number of Outstanding Asynchronous COPY Operations</t>
          <t>It is easily possible for NFS clients to send more asynchronous
COPY requests than NFS server resources can handle. For example, a
client could create a large file, and then request multiple copies
of that file's contents.</t>
          <t>A good quality server implementation <bcp14>SHOULD</bcp14> block clients from
starting many COPY operations. The implementation might apply a
fixed per-client limit, a per-server limit, or a dynamic limit
based on available resources. When that limit has been reached,
subsequent COPY requests will receive NFS4ERR_OFFLOAD_NO_REQS
in response until more server resources become available.</t>
          <t>Managing Abandoned COPY State on the Server</t>
          <t>A related issue is how much COPY state can accrue on a server
due to lost CB_OFFLOAD requests. The mandates in <xref target="sec-lifetime"/>
require a server to retain abandoned COPY state indefinitely.
A server can reject new asynchronous COPY requests using
NFS4ERR_OFFLOAD_NO_REQS when there are many abandoned COPY
stateids.</t>
          <t>Considerations For The NFSv4 Callback Service</t>
          <t>There is a network service running on each NFSv4.2 client to
handle CB_OFFLOAD operations. This service might handle only
reverse-direction operations on an existing forward channel
RPC transport, or it could also be available via separate
transport connections from the NFS server.</t>
          <t>The CB_OFFLOAD operation manages stateids that can have a
lifetime longer than a single NFSv4 callback operation. The
client's callback service must take care to prune any cached
state in order to avoid a potential denial of service.</t>
        </li>
      </ul>
      <section anchor="securing-inter-server-copy">
        <name>Securing Inter-server COPY</name>
        <t>To date, there have been no implementations of RPCSEC GSSv3
<xref target="RFC7861"/>, which is mandatory-to-implement for secure
server-to-server copy (see <xref section="4.9" sectionFormat="of" target="RFC7862"/>.</t>
        <t>There are several implementations of RPC-with-TLS <xref target="RFC9289"/>,
including on systems that also implement the NFSv4.2 COPY
operation. There has been some discussion of using TLS to
secure the server-to-server copy mechanism.</t>
        <t>Although TLS is able to provide integrity and confidentiality
of in-flight copy data, the user authentication capability
provided by RPCSEC GSSv3 is still missing. What is still missing
is the ability to pass a capability token. GSSv3 generates a
capability on the source server that is passed through the
client to the destination server to be used against the
source server.</t>
        <aside>
          <t>olga: If we're ever going to "require" GSSv3, I think the
overhead of establishing the krb5 context would greatly
impact copy performance.... Even if we are going to require
TLS. That might be even more? Not sure how krb5 handshake
cost compares to TLS handshake cost.</t>
        </aside>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests 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="RFC5661">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="S. Shepler" initials="S." role="editor" surname="Shepler"/>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <date month="January" year="2010"/>
            <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 3530) and protocol extensions made subsequently. Major extensions introduced in NFS version 4 minor version 1 include Sessions, Directory Delegations, and parallel NFS (pNFS). NFS version 4 minor version 1 has no dependencies on NFS version 4 minor version 0, and it is considered a separate protocol. Thus, this document neither updates nor obsoletes RFC 3530. NFS minor version 1 is deemed superior to NFS minor version 0 with no loss of functionality, and its use is preferred over version 0. Both NFS minor versions 0 and 1 can be used simultaneously on the same network, between the same client and server. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5661"/>
          <seriesInfo name="DOI" value="10.17487/RFC5661"/>
        </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="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>
        <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="RFC9289">
          <front>
            <title>Towards Remote Procedure Call Encryption by Default</title>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <date month="September" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that, through the use of opportunistic Transport Layer Security (TLS), enables encryption of Remote Procedure Call (RPC) transactions while they are in transit. The proposed mechanism interoperates with Open Network Computing (ONC) RPC implementations that do not support it. This document updates RFC 5531.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9289"/>
          <seriesInfo name="DOI" value="10.17487/RFC9289"/>
        </reference>
        <reference anchor="RFC9754">
          <front>
            <title>Extensions for Opening and Delegating Files in NFSv4.2</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <date month="March" year="2025"/>
            <abstract>
              <t>The Network File System v4 (NFSv4) allows a client to both open a file and be granted a delegation of that file. This delegation provides the client the right to authoritatively cache metadata on the file locally. This document presents several extensions for both opening the file and delegating it to the client. This document extends NFSv4.2 (see RFC 7863).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9754"/>
          <seriesInfo name="DOI" value="10.17487/RFC9754"/>
        </reference>
        <reference anchor="XCOPY" target="https://www.t10.org/ftp/t10/document.99/99-143r1.pdf">
          <front>
            <title>T10/99-143r1: 7.1 EXTENDED COPY command</title>
            <author initials="" surname="Unknown" fullname="Author Unknown">
              <organization>T10 Organization</organization>
            </author>
            <date year="1999" month="April" day="02"/>
          </front>
          <seriesInfo name="ISBN" value=""/>
          <seriesInfo name="DOI" value=""/>
        </reference>
      </references>
    </references>
    <?line 1132?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Special thanks to Rick Macklem and Dai Ngo for their insights
and work on implementations of NFSv4.2 COPY.</t>
      <t>The authors are grateful to Bill Baker, Jeff Layton, Greg Marsden,
and Martin Thomson for their input and support.</t>
      <t>Special thanks to
Area Director
Gorry Fairhurst,
NFSV4 Working Group Chairs
Brian Pawlowski
and
Christopher Inacio,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their guidance and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
3BL4EDbZ+o4dGndpvl21ObEMnz8dRUee8haKQPZPkh6Z5Hvk4VdJw6RjEU5I
hgRyd56S1QQkq10uxGPfzGDHS9T18yfDRjNtWocvPLXQcG1e6oKFPFnbA0CP
n6mq5kk69bY+F13+c82vn1kNzPJxEqWLheZB0To6+sFhgINOgUlul3VjUZuN
HkP5UGkDhbj2UjMSmaJvOImvivFE1l21eSo4apHReSXr+Aea1vesoB7Hh8SI
VEL/q2bq/htJAriaYZ72/cd9HY9G4enPNbcp0DVV92FfP+ezJRVp35W/1/5S
EMSBXbGy3w/djV310sENHqsvQQ6euy+Bjcb5MuAAtpc9sIlAW2VVDR2haDij
0+gtIiPKR/5SK8jk1HmXzhQJACSKhawk+k8qPgET5kl/YVH8hZEm0SzDBHw2
1UkAM9QS39G8EkOe4AUaNAN1LuE79f3NLCOJa+YQIvCtDK6DszLZBZvUNbFt
EStNH0DINy2IfhABRLyyEAsaq+r4I0wmCYIYxGDADWHm7bbCeNlC5RydpkmX
EQlCVhGQLA4fJ73jXPekuXyaXr66nX04uZ7enpyeTmez2x9PLm9ucf32p6vr
27PpxfT9CUIBowgXfRiobqaq4oLdKw5lBNk63jPm3sjITU3IOk4GADcRvwwJ
DZosOMrQYKPIN99dhCArlthjDQEGw6sq9ZioE444GggV5m96C0ZNyuxRguDN
b6DHfJ0c0X99jrx15rvP9DnVgExUuD8kNy1jIcV094bGMMIsQ/wWM9RQ7zKr
F20N1W4u7kY2Nr8z5qqb2YQGmZWhpPEJG56o4IWY0+dARUb/bUXcvmEHAmwA
wOciK9pfTKDv2I/N50lbLCvMqkoTcLGH8h7K04rdBSm2PyuXnJu5BprPd9Y9
eSzLx85tkgo6N8+T1oBwHMEfr6ikYPGUQMecq3sS5Ew8qC7o/+NndGdDdgA9
zubOcfyQpY/PbSiAaJqW0oEVQcqX3TUnfzM6sIoLvfLYc4pPNMrEPKH4pmFr
N1lbHDIvSRp1CmeFiQ8YhxG2Hyqz52mHkVmVefcl8ZiZDD2AlobRze/s4LPe
q5pnjWk27M5iqINWskbNeXGcslfOBF+fv4nfEmjPeYaI0lkuFOo4oItaRAgy
OBANJi0mzVciuQ7aQrL1s7+mZJc8o7lDk0KWwHNeCC2KTFU2NiFAskIFUJPm
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
gWsog4xwDrwSnCfR/wWW7vuLy7oAAA==

-->

</rfc>
