<?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.3.6) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-cel-nfsv4-copy-implementation-experience-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <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-00"/>
    <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="May" 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 72?>

<t>This document describes the authors' experience implementing the
NFSv4.2 COPY operation, as described in <xref target="RFC7862"/>.</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 77?>

<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, the authors report 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>
    <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="synchronous-versus-asynchronous-copy">
      <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. However, COPY 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>
      <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-state-ids">
      <name>Copy state IDs</name>
      <t>There are a number of areas where <xref target="RFC7862"/> is mute or unclear on
the details of copy state IDs. We start by defining some terms.</t>
      <section anchor="terminology">
        <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". A specific definition of the term is missing in
that document. 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"/>,
thus it is not clear 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 state ID
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.</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>
        <aside>
          <t>olga:
Stateid used in the copy operation. When the client does the opens
for the source and destination files, it most likely will receive a
delegation stateid. This complicates things. The spec says the client
should use either open or locking stateids. To be honest, I think the
client will use a delegation stateid instead. I should/need to verify
this. I say it because I think nfs4_set_rw_stateid() used by the
client will return delegation stateid if the client has one. I do seem
to recall trying to force the code to do open stateid and not use
delegation (But it's just vague memory).... But let's set that aside.</t>
          <t>With this new DELEGATION_XOR_OPEN stuff, I see a problem that the
client will only get a delegation stateid from the Linux server and
then we are out of luck and need to do extra operations of returning
the delegation and then requesting another open with deleg_not_wanted.
Which btw we can't do in the first place because useland does the
opens. So I'm not sure if the spec should be changed to allow the
delegation stateid usage by the copy instead (Well, it sort of already
I would think because in section 15.2.3 it says -- "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
RFC5661." -- and a write delegation stateid is a valid stateid for
WRITE (similar verbiage for the src stated when it's intra copy but of
read flavor) . But if we allow a delegation stateid then there is the
complexity of what should happen when a conflicting operation arrives.
I don't think it's covered? Is the server required to stop the copy
before replying? Does it send a CB_RECALL, and should the client need
to worry about "do i have any started copies that I need to stop now"?</t>
        </aside>
      </section>
      <section anchor="use-of-locking-stateids">
        <name>Use of Locking Stateids</name>
        <t><xref section="4.3.1" sectionFormat="of" target="RFC7862"/> is possibly incorrect:</t>
        <ul empty="true">
          <li>
            <t>Note that when the client establishes a lock stateid on the source,
the context of that stateid is for the client and not the
destination.  As such, there might already be an outstanding stateid,
issued to the destination as the client of the source, with the same
value as that provided for the lock stateid.  The source <bcp14>MUST</bcp14>
interpret the lock stateid as that of the client, i.e., when the
destination presents it in the context of an inter-server copy, it is
on behalf of the client."</t>
          </li>
        </ul>
        <t>The destination server will never present a "locking stateid". It
presents a "copy stateid" generated by the source server.</t>
        <t>The Linux NFS client implementation locks the source and destination
files before doing the copy, and therefore acquires the locking
stateids (but only if there were no delegation given). Those can be
used for the COPY operation. For intra-copy (if I'm wrong about using
the delegation stateid then), I believe Linux does use locking stateid
but for inter-copy Linux uses "locking" for destination and "copy
stateid" for the source. That "copy stateid", the destination server
uses to do the read against the source server.</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 state ID handled?  Under
what circumstances is its sequence number bumped? Do peers
match copy state IDs 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
state ID during one NFSv4.1 session?</t>
          </li>
          <li>
            <t>How long does the client's callback service have to remember
copy state IDs? Is the callback service responsible for
remembering and reporting previously-used copy state IDs?</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="copy-reply-races-with-cboffload-request">
        <name>COPY Reply Races With CB_OFFLOAD Request</name>
        <t>Due to the design of the NFSv4.2 COPY and CB_OFFLOAD protocol
elements, an NFS client's callback service cannot recognize
a copy state ID presented by a CB_OFFLOAD request until it has
received and processed the COPY response that reports that an
asynchronous copy operation has been started and that provides
the copy state ID to wait for. Under some conditions, it is
possible for the client to process the CB_OFFLOAD request
before it has processed the COPY reply containing the matching
copy state ID.</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 state IDs over time).</t>
          </li>
          <li>
            <t>Have CB_OFFLOAD return NFS4ERR_DELAY if the copy state ID
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="lifetime">
        <name>Lifetime Requirements</name>
        <t>An NFS server that implements only synchronous copy does not
require the stricter COPY state ID lifetime requirements described
in <xref section="4.8" sectionFormat="of" target="RFC7862"/>. A state ID 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 state ID is required to remain valid, and how a client
needs to act during state recovery. A stronger statement about
COPY state ID lifetime can improve the guarantee of interoperability:</t>
        <ul empty="true">
          <li>
            <t>When a COPY state ID is used for an asynchronous copy, an NFS
server <bcp14>MUST</bcp14> retain the COPY state ID, except as follows below.
An NFS server <bcp14>MAY</bcp14> invalidate and purge a COPY state ID 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 state ID.</t>
            <t>o The server receives a reply to a CB_OFFLOAD request from the
  owning client that matches the COPY state ID.</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>
      <section anchor="status-codes-for-the-cboffload-operation">
        <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. There is
no requirement 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 state ID
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 state ID, or the
wr_callback_id argument, which is a copy offload state ID.</t>
          <t>If the NFS client's callback service does not recognize the state ID
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 state ID 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 state ID.</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 state ID 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 state ID
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 state ID 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 state ID 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_BAD_STATEID.</t>
        </section>
      </section>
      <section anchor="status-codes-for-the-offloadcancel-and-offloadstatus-operations">
        <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="offloadcancel-implementation-notes">
      <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
state ID 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>
      <aside>
        <t>olga: The section clarifies various things about OFFLOAD_CANCEL
but it reads to me geared towards an intra-copy offload. There isn't
any mention of how the source server in inter-copy should react when
it receives an OFFLOAD_CANCEL. Receiving an OFFLOAD_CANCEL can allow
the source server to invalidate the copy stateid it's keeping active
to allow reads with that copy stateid.</t>
      </aside>
    </section>
    <section anchor="offloadstatus-implementation-notes">
      <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 is
due to the conflation of the term "optional" with the common use of
the compliance keyword <bcp14>OPTIONAL</bcp14> in other NFS-related documents.</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 state ID 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 state ID, 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="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="asynchronous-copy-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 means that the client workload waits for a
completion event that never arrives, 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="the-fattr4cloneblksize-attribute">
        <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>
        <section anchor="possible-deprecation-of-the-fattr4cloneblksize-attribute">
          <name>Possible Deprecation of the FATTR4_CLONE_BLKSIZE Attribute</name>
          <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 can 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>
    <section anchor="handling-nfs-server-shutdown">
      <name>Handling NFS Server Shutdown</name>
      <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 state IDs, copy
offload state IDs, 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="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>An alternative approach is to convert all large synchronous copy
requests into asynchronous copy requests, if the server supports
asynchronous copy.</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="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
state IDs.</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 state IDs 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 missing
is the ability to pass a capability. 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="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 1112?>

<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:
H4sIAAAAAAAAA8V963bbVpbmfzwFRvkRu5ukL3HSsbrHLlmiHXXJkkuSK8n0
6qUFkocUWiDAAkAprHT6WeZZ5slmf3vvcwNAOVVr1nTW6i4ZBM5ln32/nfF4
nCRt3hbmMD04N+1DVd+l7/PCpFe7pjXr9N7UTV6V6avJy/T44tPP6cXG1FmL
R6frTWHWpmzln9Nf6JfclHNzkGSzWW3uMeT7q3v36SMfzLPWrKp6d5jm5bJK
kkU1L7M1LWpRZ8t2PDfFuFw296/G82qzG+fRQGPjBho/f55s8sP039pqPkqb
qm5rs2zor91a/qBx19lmk5erf0+aNisXN1lRlTTPzjQJLfibJGm2s3XeYNPt
bkO/nE6v3yf5pj5M23rbtC+fP3/9/GWS1Saj/f1oZimNkp6WralL06bXdVY2
G5r4IAEsV3W13ewB7Z8taA+SatZUhWlNc5jcmR29uThM0nGq0MOfACD/79nF
+RR//Hh5ej29uTr6yP+qlsuiyhZJkm3b26rG10lK/y23RSGAvChWWfrHqi5z
c9/cZXnGv1f1KivzvzIcD9NLs0h/yFr+xR4hPbOP5tW2bHFGn8u8pVevCP6m
obnTozUdwFyGNOssLw7T6k7m+kNtFrdZO5lX6/6ijm+387v0zBCW8S91BUQ0
i7yt6oH1XdTZnOB3XNUEYX4WLVV+/tuXOscqJgVW8YeKx+DVJmVVr2mWe0Pg
TC/fH3/73Xcv9M9/+v67l/7Pb/TP77//nl5IgMLxl/SO/fL1y+9f48+fcKKH
vIzxofyL/9Fm9cq0h+lt226aw2fPHh4eJu2L5xOCxLNlu3lGfz8jLN4C/Sev
Xz97/Xr84tU39YvJZrGUAZSar+lF++Nh+k+TF+n0p+vp+cn0RKiRtrgm1D0Q
EFq04f/G+r8pUWMDGN6V1UPpHsrZHfEnvR9pnYcpzU2n4Y+Of21ApA2AY+c5
vXp3bv8+uTiVPxd0Uofpi9e09uevxkRqjDIMUPvup5P3fyeAkntTbvlUlDKZ
q9A/hdZ/JBol3pB+wI/0VPCD3/lDbtolJqHHWT2/9QvAS3hCxz2xLz3Dg2ez
unpozDP+/hl9V5tN5b9b5e3tdgZUe8YYyAj4LB8vxtsNgCC8rtmYOX1aAH8D
tPBfTHScvBr89tlXq2rS5aLdlya37bpIkvF4TMTUtEQDbZJc3+ZNaiGZLkwz
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

-->

</rfc>
