nfs42: do not fail with EIO if ssc returns NFS4ERR_OFFLOAD_DENIED
authorTigran Mkrtchyan <tigran.mkrtchyan@desy.de>
Tue, 7 Feb 2023 17:46:35 +0000 (18:46 +0100)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 15 Feb 2023 15:42:51 +0000 (10:42 -0500)
The NFSv4.2 server even if supports intra-SSC might prefer that for
a particular file a classic copy is performed. As returning ENOTSUPP
will clear the SSC capability of the server by the client, server
might return NFS4ERR_OFFLOAD_DENIED (well, spec talks about remote
servers there).

Update nfs42_proc_copy to handle NFS4ERR_OFFLOAD_DENIED as ENOTSUPP,
but without clearing NFS_CAP_COPY bit.

Signed-off-by: Tigran Mkrtchyan <tigran.mkrtchyan@desy.de>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs42proc.c

index ecb4285..93e306b 100644 (file)
@@ -460,7 +460,8 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
 
                if (err >= 0)
                        break;
-               if (err == -ENOTSUPP &&
+               if ((err == -ENOTSUPP ||
+                               err == -NFS4ERR_OFFLOAD_DENIED) &&
                                nfs42_files_from_same_server(src, dst)) {
                        err = -EOPNOTSUPP;
                        break;