Subject: [nfsv4] [RFC PATCH] Consolidate offload abort and revoke into cancel

From: Thomas Haynes <[email-masked]>
Date: Tue, 13 May 2014 08:32:24 -0700

From: Tom Haynes <[email-masked]>

Note, this applies off of the copy branch in my GitHub repo.
I.e., it MAY be built on top of some earlier clean-up changes
that I have not yet merged into the master.

This patch refactors OFFLOAD_ABORT and OFFLOAD_REVOKE into
OFFLOAD_CANCEL.

I think it also clears up the concerns Chrisoph had about
OFFLOAD_REVOKE being COPY specific.

Signed-off-by: Tom Haynes <[email-masked]>
---
 Makefile                            |  9 +++----
 dotx.d/Makefile                     |  6 ++---
 dotx.d/offload_abort_args.x         |  5 ----
 dotx.d/offload_abort_res.x          |  3 ---
 dotx.d/offload_cancel_args.x        |  5 ++++
 dotx.d/offload_cancel_res.x         |  4 +++
 dotx.d/offload_revoke_args.x        |  5 ----
 dotx.d/offload_revoke_res.x         |  4 ---
 dotx.d/spit_types.sh                | 12 ++++-----
 nfsv42_middle_copy.xml              | 47 ++++++++++++++-------------------
 nfsv42_middle_errors.xml            | 17 +-----------
 nfsv42_middle_new_errors.xml        | 17 +-----------
 nfsv42_middle_op_copy.xml           |  2 +-
 nfsv42_middle_op_mandlist.xml       |  5 ++--
 nfsv42_middle_op_offload_abort.xml  | 40 ----------------------------
 nfsv42_middle_op_offload_cancel.xml | 44 +++++++++++++++++++++++++++++++
 nfsv42_middle_op_offload_revoke.xml | 52 -------------------------------------
 nfsv42_middle_op_write_same.xml     |  2 +-
 18 files changed, 90 insertions(+), 189 deletions(-)
 delete mode 100644 dotx.d/offload_abort_args.x
 delete mode 100644 dotx.d/offload_abort_res.x
 create mode 100644 dotx.d/offload_cancel_args.x
 create mode 100644 dotx.d/offload_cancel_res.x
 delete mode 100644 dotx.d/offload_revoke_args.x
 delete mode 100644 dotx.d/offload_revoke_res.x
 delete mode 100644 nfsv42_middle_op_offload_abort.xml
 create mode 100644 nfsv42_middle_op_offload_cancel.xml
 delete mode 100644 nfsv42_middle_op_offload_revoke.xml

diff --git a/Makefile b/Makefile
index f4dae79..6b65a00 100755
--- a/Makefile
+++ b/Makefile
@@ -309,12 +309,10 @@ AUTOGEN =	\
 		autogen/commit_res.xml \
 		autogen/copy_notify_args.xml \
 		autogen/copy_notify_res.xml \
-		autogen/offload_revoke_args.xml \
-		autogen/offload_revoke_res.xml \
+		autogen/offload_cancel_args.xml \
+		autogen/offload_cancel_res.xml \
 		autogen/copy_args.xml \
 		autogen/copy_res.xml \
-		autogen/offload_abort_args.xml \
-		autogen/offload_abort_res.xml \
 		autogen/offload_status_args.xml \
 		autogen/offload_status_res.xml \
 		autogen/create_args.xml \
@@ -450,8 +448,7 @@ IDXMLSRC_BASE = \
 	${DOC_PREFIX}_middle_op_deallocate.xml \
 	${DOC_PREFIX}_middle_op_io_advise.xml \
 	${DOC_PREFIX}_middle_op_layoutreturn.xml \
-	${DOC_PREFIX}_middle_op_offload_abort.xml \
-	${DOC_PREFIX}_middle_op_offload_revoke.xml \
+	${DOC_PREFIX}_middle_op_offload_cancel.xml \
 	${DOC_PREFIX}_middle_op_offload_status.xml \
 	${DOC_PREFIX}_middle_op_read_plus.xml \
 	${DOC_PREFIX}_middle_op_seek.xml \
diff --git a/dotx.d/Makefile b/dotx.d/Makefile
index 7d15fb1..928bd5b 100755
--- a/dotx.d/Makefile
+++ b/dotx.d/Makefile
@@ -110,12 +110,10 @@ FORE_OPS_AS_IS2 = \
                 reclaim_complete_res.x \
                 copy_args.x \
                 copy_res.x \
-                offload_abort_args.x \
-                offload_abort_res.x \
                 copy_notify_args.x \
                 copy_notify_res.x \
-                offload_revoke_args.x \
-                offload_revoke_res.x \
+                offload_cancel_args.x \
+                offload_cancel_res.x \
                 offload_status_args.x \
                 offload_status_res.x \
 		allocate_args.x \
diff --git a/dotx.d/offload_abort_args.x b/dotx.d/offload_abort_args.x
deleted file mode 100644
index 083987d..0000000
--- a/dotx.d/offload_abort_args.x
+++ /dev/null
@@ -1,5 +0,0 @@
-struct OFFLOAD_ABORT4args {
-        /* CURRENT_FH: destination file */
-	stateid4    	oaa_stateid;
-};
-
diff --git a/dotx.d/offload_abort_res.x b/dotx.d/offload_abort_res.x
deleted file mode 100644
index 6d769bd..0000000
--- a/dotx.d/offload_abort_res.x
+++ /dev/null
@@ -1,3 +0,0 @@
-struct OFFLOAD_ABORT4res {
-	nfsstat4	oar_status;
-};
diff --git a/dotx.d/offload_cancel_args.x b/dotx.d/offload_cancel_args.x
new file mode 100644
index 0000000..9a44760
--- /dev/null
+++ b/dotx.d/offload_cancel_args.x
@@ -0,0 +1,5 @@
+struct OFFLOAD_CANCEL4args {
+        /* CURRENT_FH: source file */
+	stateid4    	oca_stateid;
+};
+
diff --git a/dotx.d/offload_cancel_res.x b/dotx.d/offload_cancel_res.x
new file mode 100644
index 0000000..738030e
--- /dev/null
+++ b/dotx.d/offload_cancel_res.x
@@ -0,0 +1,4 @@
+struct OFFLOAD_CANCEL4res {
+	nfsstat4	ocr_status;
+};
+
diff --git a/dotx.d/offload_revoke_args.x b/dotx.d/offload_revoke_args.x
deleted file mode 100644
index 045b189..0000000
--- a/dotx.d/offload_revoke_args.x
+++ /dev/null
@@ -1,5 +0,0 @@
-struct OFFLOAD_REVOKE4args {
-        /* CURRENT_FH: source file */
-	netloc4    	ora_destination_server;
-};
-
diff --git a/dotx.d/offload_revoke_res.x b/dotx.d/offload_revoke_res.x
deleted file mode 100644
index 88609ab..0000000
--- a/dotx.d/offload_revoke_res.x
+++ /dev/null
@@ -1,4 +0,0 @@
-struct OFFLOAD_REVOKE4res {
-	nfsstat4	orr_status;
-};
-
diff --git a/dotx.d/spit_types.sh b/dotx.d/spit_types.sh
index 76ac094..4a6d254 100755
--- a/dotx.d/spit_types.sh
+++ b/dotx.d/spit_types.sh
@@ -998,8 +998,8 @@ enum nfs_opnum4 {
  OP_COPY_NOTIFY		= 61,
  OP_DEALLOCATE		= 62,
  OP_IO_ADVISE		= 63,
- OP_OFFLOAD_ABORT	= 64,
- OP_OFFLOAD_REVOKE	= 65,
+ OP_XXX_FOR_NOW		= 64,
+ OP_OFFLOAD_CANCEL	= 65,
  OP_OFFLOAD_STATUS	= 66,
  OP_READ_PLUS		= 67,
  OP_SEEK		= 68,
@@ -1120,8 +1120,8 @@ union nfs_argop4 switch (nfs_opnum4 argop) {
  case OP_COPY_NOTIFY:	COPY_NOTIFY4args opoffload_notify;
  case OP_DEALLOCATE:	DEALLOCATE4args opdeallocate;
  case OP_IO_ADVISE:	IO_ADVISE4args opio_advise;
- case OP_OFFLOAD_ABORT:	OFFLOAD_ABORT4args opoffload_abort;
- case OP_OFFLOAD_REVOKE: OFFLOAD_REVOKE4args opcopy_revoke;
+ case OP_XXX_FOR_NOW:	void;
+ case OP_OFFLOAD_CANCEL: OFFLOAD_CANCEL4args opoffload_cancel;
  case OP_OFFLOAD_STATUS: OFFLOAD_STATUS4args opoffload_status;
  case OP_READ_PLUS:	READ_PLUS4args opread_plus;
  case OP_SEEK:		SEEK4args opseek;
@@ -1252,8 +1252,8 @@ union nfs_resop4 switch (nfs_opnum4 resop) {
  case OP_COPY_NOTIFY:	COPY_NOTIFY4res opcopy_notify;
  case OP_DEALLOCATE:	DEALLOCATE4res opdeallocate;
  case OP_IO_ADVISE:	IO_ADVISE4res opio_advise;
- case OP_OFFLOAD_ABORT:	OFFLOAD_ABORT4res opoffload_abort;
- case OP_OFFLOAD_REVOKE: OFFLOAD_REVOKE4res opoffload_revoke;
+ case OP_XXX_FOR_NOW:	void;
+ case OP_OFFLOAD_CANCEL: OFFLOAD_CANCEL4res opoffload_cancel;
  case OP_OFFLOAD_STATUS: OFFLOAD_STATUS4res opoffload_status;
  case OP_READ_PLUS:	READ_PLUS4res opread_plus;
  case OP_SEEK:		SEEK4res opseek;
diff --git a/nfsv42_middle_copy.xml b/nfsv42_middle_copy.xml
index 8c7456d..dd2ff49 100644
--- a/nfsv42_middle_copy.xml
+++ b/nfsv42_middle_copy.xml
@@ -66,21 +66,14 @@
             the given user.  (<xref target="op:copy_notify" />)
           </t>
 
-          <t hangText="OFFLOAD_REVOKE:">
-            Used by the client to revoke on the source server to
-            revoke permission to copy a file from a given
-            destination server for the given user.
-            (<xref target="op:offload_revoke" />)
-          </t>
-
           <t hangText="COPY:">
             Used by the client to request a file copy.
             (<xref target="op:copy" />)
           </t>
 
-          <t hangText="OFFLOAD_ABORT:">
-            Used by the client to abort an asynchronous file copy.
-            (<xref target="op:offload_abort" />)
+          <t hangText="OFFLOAD_CANCEL:">
+            Used by the client to terminate an asynchronous file copy.
+            (<xref target="op:offload_close" />)
           </t>
 
           <t hangText="OFFLOAD_STATUS:">
@@ -109,15 +102,15 @@
       <t>
         If a client desires an intra-server file copy, then it MUST
         support the COPY and CB_OFFLOAD operations. If COPY returns
-        a stateid, then the client MAY use the OFFLOAD_ABORT and
+        a stateid, then the client MAY use the OFFLOAD_CANCEL and
         OFFLOAD_STATUS operations.
       </t>
 
       <t>
         If a client desires an inter-server file copy, then it MUST
         support the COPY, COPY_NOTICE, and CB_OFFLOAD operations, and
-        MAY use the OFFLOAD_REVOKE operation. If COPY returns a stateid,
-        then the client MAY use the OFFLOAD_ABORT and OFFLOAD_STATUS
+        MAY use the OFFLOAD_CANCEL operation. If COPY returns a stateid,
+        then the client MAY use the OFFLOAD_CANCEL and OFFLOAD_STATUS
         operations.
       </t>
 
@@ -125,26 +118,26 @@
         If a server supports intra-server copy, then the server MUST
         support the COPY operation. If a server’s COPY operation
         returns a stateid, then the server MUST also support these
-        operations: CB_OFFLOAD, OFFLOAD_ABORT, and OFFLOAD_STATUS.
+        operations: CB_OFFLOAD, OFFLOAD_CANCEL, and OFFLOAD_STATUS.
       </t>
 
       <t>
         If a source server supports inter-server copy, then the source
         server MUST support all these operations: COPY_NOTIFY and
-        OFFLOAD_REVOKE. If a destination server supports inter-server
+        OFFLOAD_CANCEL. If a destination server supports inter-server
         copy, then the destination server MUST support the COPY
         operation. If a destination server’s COPY operation returns
         a stateid, then the destination server MUST also support these
-        operations: CB_OFFLOAD, OFFLOAD_ABORT, COPY_NOTIFY, OFFLOAD_REVOKE,
+        operations: CB_OFFLOAD, OFFLOAD_CANCEL, COPY_NOTIFY,
         and OFFLOAD_STATUS.
       </t>
 
       <t>
         Each operation is performed in the context of the user
         identified by the ONC RPC credential of its containing COMPOUND
-        or CB_COMPOUND request. For example, a OFFLOAD_ABORT operation
+        or CB_COMPOUND request. For example, an OFFLOAD_CANCEL operation
         issued by a given user indicates that a specified COPY operation
-        initiated by the same user be canceled. Therefore a OFFLOAD_ABORT
+        initiated by the same user be canceled. Therefore an OFFLOAD_CANCEL
         MUST NOT interfere with a copy of the same file initiated by
         another user.
       </t>
@@ -212,7 +205,7 @@
       the copy or it may perform the copy asynchronously and deliver the
       results using a CB_OFFLOAD operation callback. If the copy is performed
       asynchronously, the client may poll the status of the copy using
-      OFFLOAD_STATUS or cancel the copy using OFFLOAD_ABORT.
+      OFFLOAD_STATUS or cancel the copy using OFFLOAD_CANCEL.
     </t>
 
     <t>
@@ -256,7 +249,7 @@
       and the final result will be delivered at a later time. The server's
       reply also contains a copy stateid. The client may use this copy
       stateid to poll for status information (as shown) or to cancel the copy
-      using a OFFLOAD_ABORT. When the server completes the copy, the server
+      using an OFFLOAD_CANCEL. When the server completes the copy, the server
       performs a callback to the client and reports the results.
     </t>
 
@@ -585,14 +578,14 @@
     <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_ABORT,
+      offload stateids are included in the COPY, OFFLOAD_CANCEL,
       OFFLOAD_STATUS, and CB_OFFLOAD operations.
     </t>
 
     <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 a
-      OFFLOAD_ABORT operation or the client replies to a CB_OFFLOAD
+      OFFLOAD_CANCEL operation or the client replies to a CB_OFFLOAD
       operation.
     </t>
 
@@ -1027,10 +1020,10 @@
           </t>
 
           <t>
-            If the client sends a OFFLOAD_REVOKE to the source server to
+            If the client sends an OFFLOAD_CANCEL to the source server to
             rescind the destination server's synchronous copy privilege, it
             uses the privileged "copy_from_auth" RPCSEC_GSSv3 handle and the
-            cra_destination_server in OFFLOAD_REVOKE MUST be the same as the
+            cra_destination_server in OFFLOAD_CANCEL MUST be the same as the
             name of the destination server specified in copy_from_auth_priv.
             The source server will then delete the &lt;"copy_from_auth",
             user id, destination&gt; privilege and fail any subsequent
@@ -1040,7 +1033,7 @@
           </t>
 
           <t>
-            If the client sends a OFFLOAD_STATUS to the destination
+            If the client sends an OFFLOAD_STATUS to the destination
             server to check on the status of an asynchronous copy, it
             uses the privileged "copy_to_auth" RPCSEC_GSSv3 handle and
             the osa_stateid in OFFLOAD_STATUS MUST be the same as the
@@ -1049,10 +1042,10 @@
           </t>
 
           <t>
-            If the client sends a OFFLOAD_ABORT to the destination server
+            If the client sends an OFFLOAD_CANCEL to the destination server
             to cancel an asynchronous copy, it uses the privileged
             "copy_to_auth" RPCSEC_GSSv3 handle and the oaa_stateid
-            in OFFLOAD_ABORT MUST be the same as the wr_callback_id
+            in OFFLOAD_CANCEL MUST be the same as the wr_callback_id
             specified in the "copy_to_auth" privilege stored on the
             destination server. The destination server will then delete the
             &lt;"copy_to_auth", user id, source list, nounce, nounce MIC,
diff --git a/nfsv42_middle_errors.xml b/nfsv42_middle_errors.xml
index 0bb25e3..c8ecd2d 100644
--- a/nfsv42_middle_errors.xml
+++ b/nfsv42_middle_errors.xml
@@ -2166,7 +2166,7 @@
         NFS4ERR_WRONG_TYPE
       </c>
 
-      <c>OFFLOAD_ABORT</c>
+      <c>OFFLOAD_CANCEL</c>
       <c>
         NFS4ERR_ADMIN_REVOKED,
         NFS4ERR_BADXDR,
@@ -2183,21 +2183,6 @@
         NFS4ERR_TOO_MANY_OPS
       </c>
 
-      <c>OFFLOAD_REVOKE</c>
-      <c>
-        NFS4ERR_ADMIN_REVOKED,
-        NFS4ERR_BADXDR,
-        NFS4ERR_COMPLETE_ALREADY,
-        NFS4ERR_DELAY,
-        NFS4ERR_GRACE,
-        NFS4ERR_INVALID,
-        NFS4ERR_MOVED,
-        NFS4ERR_NOTSUPP,
-        NFS4ERR_OP_NOT_IN_SESSION,
-        NFS4ERR_SERVERFAULT,
-        NFS4ERR_TOO_MANY_OPS
-      </c>
-
       <c>OFFLOAD_STATUS</c>
       <c>
         NFS4ERR_ADMIN_REVOKED,
diff --git a/nfsv42_middle_new_errors.xml b/nfsv42_middle_new_errors.xml
index 325fc68..053a629 100644
--- a/nfsv42_middle_new_errors.xml
+++ b/nfsv42_middle_new_errors.xml
@@ -269,7 +269,7 @@
         NFS4ERR_WRONG_TYPE
       </c>
 
-      <c>OFFLOAD_ABORT</c>
+      <c>OFFLOAD_CANCEL</c>
       <c>
         NFS4ERR_ADMIN_REVOKED,
         NFS4ERR_BADXDR,
@@ -286,21 +286,6 @@
         NFS4ERR_TOO_MANY_OPS
       </c>
 
-      <c>OFFLOAD_REVOKE</c>
-      <c>
-        NFS4ERR_ADMIN_REVOKED,
-        NFS4ERR_BADXDR,
-        NFS4ERR_COMPLETE_ALREADY,
-        NFS4ERR_DELAY,
-        NFS4ERR_GRACE,
-        NFS4ERR_INVALID,
-        NFS4ERR_MOVED,
-        NFS4ERR_NOTSUPP,
-        NFS4ERR_OP_NOT_IN_SESSION,
-        NFS4ERR_SERVERFAULT,
-        NFS4ERR_TOO_MANY_OPS
-      </c>
-
       <c>OFFLOAD_STATUS</c>
       <c>
         NFS4ERR_ADMIN_REVOKED,
diff --git a/nfsv42_middle_op_copy.xml b/nfsv42_middle_op_copy.xml
index a00b5b7..b962bb8 100644
--- a/nfsv42_middle_op_copy.xml
+++ b/nfsv42_middle_op_copy.xml
@@ -166,7 +166,7 @@
       copy the data and this is a remote copy, then the
       client is responsible for informing the source that the
       earlier COPY_NOTIFY is no longer valid by sending it
-      an OFFLOAD_REVOKE.
+      an OFFLOAD_CANCEL.
     </t>
 
     <t>
diff --git a/nfsv42_middle_op_mandlist.xml b/nfsv42_middle_op_mandlist.xml
index e78a671..4ebd0bb 100644
--- a/nfsv42_middle_op_mandlist.xml
+++ b/nfsv42_middle_op_mandlist.xml
@@ -123,11 +123,8 @@
       <c>CLOSE                </c> <c> REQ </c> <c>              </c>
       <c>COMMIT               </c> <c> REQ </c> <c>              </c>
       <c>COPY                 </c> <c> OPT </c> <c> COPY (REQ)   </c>
-      <c>OFFLOAD_ABORT        </c> <c> OPT </c> <c> COPY (REQ)   </c>
       <c>COPY_NOTIFY          </c> <c> OPT </c> <c> COPY (REQ)   </c>
       <c>DEALLOCATE           </c> <c> OPT </c> <c>              </c>
-      <c>OFFLOAD_REVOKE       </c> <c> OPT </c> <c> COPY (REQ)   </c>
-      <c>OFFLOAD_STATUS       </c> <c> OPT </c> <c> COPY (REQ)   </c>
       <c>CREATE               </c> <c> REQ </c> <c>              </c>
       <c>CREATE_SESSION       </c> <c> REQ </c> <c>              </c>
       <c>DELEGPURGE           </c> <c> OPT </c> <c> FDELG (REQ)  </c>
@@ -151,6 +148,8 @@
       <c>LOOKUP               </c> <c> REQ </c> <c>              </c>
       <c>LOOKUPP              </c> <c> REQ </c> <c>              </c>
       <c>NVERIFY              </c> <c> REQ </c> <c>              </c>
+      <c>OFFLOAD_CANCEL       </c> <c> OPT </c> <c> COPY (REQ)   </c>
+      <c>OFFLOAD_STATUS       </c> <c> OPT </c> <c> COPY (REQ)   </c>
       <c>OPEN                 </c> <c> REQ </c> <c>              </c>
       <c>OPENATTR             </c> <c> OPT </c> <c>              </c>
       <c>OPEN_CONFIRM         </c> <c> MNI </c> <c>              </c>
diff --git a/nfsv42_middle_op_offload_abort.xml b/nfsv42_middle_op_offload_abort.xml
deleted file mode 100644
index 183dee1..0000000
--- a/nfsv42_middle_op_offload_abort.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Copyright (C) The IETF Trust (2011-2012) -->
-<!-- Copyright (C) The Internet Society (2011-2012) -->
-
-<section anchor="op:offload_abort" title="Operation 64: OFFLOAD_ABORT - Cancel a server-side copy">
-  <section toc='exclude' title="ARGUMENT">
-    <?rfc include='autogen/offload_abort_args.xml'?>
-  </section>
-
-  <section toc='exclude' title="RESULT">
-    <?rfc include='autogen/offload_abort_res.xml'?>
-  </section>
-
-  <section toc='exclude' title="DESCRIPTION">
-    <t>
-      The OFFLOAD_ABORT operation allows the client to cancel a
-      server-side copy operation that it initiated. This operation
-      is sent in a COMPOUND request from the client to the destination
-      server.
-    </t>
-
-    <t>
-      The request contains the filehandle and copy stateid cookies
-      that act as the context for the previously initiated copy
-      operation.
-    </t>
-
-    <t>
-      The result's oar_status field indicates whether the cancel
-      was successful or not. A value of NFS4_OK indicates that the
-      copy operation was canceled and no callback will be issued
-      by the server. A copy operation that is successfully canceled
-      may result in none, some, or all of the data and/or metadata copied.
-    </t>
-
-    <t>
-      If the server supports asynchronous copies, the server is
-      REQUIRED to support the OFFLOAD_ABORT operation.
-    </t>
-  </section>
-</section>
diff --git a/nfsv42_middle_op_offload_cancel.xml b/nfsv42_middle_op_offload_cancel.xml
new file mode 100644
index 0000000..10f8db5
--- /dev/null
+++ b/nfsv42_middle_op_offload_cancel.xml
@@ -0,0 +1,44 @@
+<!-- Copyright (C) The IETF Trust (2011-2014) -->
+<!-- Copyright (C) The Internet Society (2011-2014) -->
+
+<section anchor="op:offload_close" title="Operation 65: OFFLOAD_CANCEL - Stop an Offloaded Operation">
+  <section toc='exclude' title="ARGUMENT">
+    <?rfc include='autogen/offload_cancel_args.xml'?>
+  </section>
+
+  <section toc='exclude' title="RESULT">
+    <?rfc include='autogen/offload_cancel_res.xml'?>
+  </section>
+
+  <section toc='exclude' title="DESCRIPTION">
+    <t>
+      OFFLOAD_CANCEL is used by the client to terminate an asynchronous
+      operation, which is identifed both by CURRENT_FH and the
+      oca_stateid. I.e., there can be multiple offloaded operations acting
+      on the file, the stateid will identify to the server exactly which
+      one is to be stopped.
+    </t>
+
+    <t>
+      In the context of server-to-server copy, the client can send
+      OFFLOAD_CANCEL to either the source or destination server, albeit
+      with a different stateid.  The client uses OFFLOAD_CANCEL to inform
+      the destination to stop the active transfer and uses the stateid it
+      got back from the COPY operation. The client uses OFFLOAD_CANCEL
+      and the stateid it used in the COPY_NOTIFY to inform the source
+      to not allow any more copying from the destination.
+    </t>
+
+    <t>
+      OFFLOAD_CANCEL is also useful in situations in which the source
+      server granted a very long or infinite lease on the destination
+      server's ability to read the source file and all copy operations
+      on the source file have been completed.
+    </t>
+
+    <t>
+      If the server supports COPY_NOTIFY, the server is REQUIRED to
+      support the OFFLOAD_CANCEL operation.
+    </t>
+  </section>
+</section>
diff --git a/nfsv42_middle_op_offload_revoke.xml b/nfsv42_middle_op_offload_revoke.xml
deleted file mode 100644
index 9135c78..0000000
--- a/nfsv42_middle_op_offload_revoke.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<!-- Copyright (C) The IETF Trust (2011-2012) -->
-<!-- Copyright (C) The Internet Society (2011-2012) -->
-
-<section anchor="op:offload_revoke" title="Operation 65: OFFLOAD_REVOKE - Revoke a destination server's copy privileges">
-  <section toc='exclude' title="ARGUMENT">
-    <?rfc include='autogen/offload_revoke_args.xml'?>
-  </section>
-
-  <section toc='exclude' title="RESULT">
-    <?rfc include='autogen/offload_revoke_res.xml'?>
-  </section>
-
-  <section toc='exclude' title="DESCRIPTION">
-    <t>
-      This operation is used for an inter-server copy. A client
-      sends this operation in a COMPOUND request to the source
-      server to revoke the authorization of a destination server
-      identified by ora_destination_server from reading the file
-      specified by CURRENT_FH on behalf of given user. If the
-      ora_destination_server has already begun copying the file, a
-      successful return from this operation indicates that further
-      access will be prevented.
-    </t>
-
-    <t>
-      The ora_destination_server MUST be specified using the netloc4
-      network location format. The server is not required to resolve
-      the ora_destination_server address before completing this
-      operation.
-    </t>
-
-    <t>
-      The client uses OFFLOAD_ABORT to inform the destination to
-      stop the active transfer and OFFLOAD_REVOKE to inform the
-      source to not allow any more copy requests from the destination.
-      The OFFLOAD_REVOKE operation is also useful in situations in
-      which the source server granted a very long or infinite lease
-      on the destination server's ability to read the source file
-      and all copy operations on the source file have been completed.
-    </t>
-
-    <t>
-      For a copy only involving one server (the source and destination
-      are on the same server), this operation is unnecessary.
-    </t>
-
-    <t>
-      If the server supports COPY_NOTIFY, the server is
-      REQUIRED to support the OFFLOAD_REVOKE operation.
-    </t>
-  </section>
-</section>
diff --git a/nfsv42_middle_op_write_same.xml b/nfsv42_middle_op_write_same.xml
index eb653e3..5845c33 100644
--- a/nfsv42_middle_op_write_same.xml
+++ b/nfsv42_middle_op_write_same.xml
@@ -93,7 +93,7 @@
         contents of what it wrote until it is informed by the server
         that the operation is complete. It can use OFFLOAD_STATUS
         (<xref target="op:offload_status" />) to monitor the operation
-        and OFFLOAD_ABORT (<xref target="op:offload_abort" />) to
+        and OFFLOAD_CANCEL (<xref target="op:offload_close" />) to
         cancel the operation. An example of a asynchronous WRITE_SAME
         is shown in <xref target='fig:async-write_same' />. Note
         that as with the COPY operation, WRITE_SAME must provide a
-- 
1.9.0

---

From: Christoph Hellwig <[email-masked]>
Date: Tue, 13 May 2014 18:43:17 +0200

> OFFLOAD_REVOKE being COPY specific.

I like this a lot!  The only little concern I have is if the language
about inter-server copies should in the OFFLOAD_CANCEL description or
in the copy section, but that could be sorted out later.