]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
NFS: also send OFFLOAD_CANCEL to source server
authorOlga Kornievskaia <kolga@netapp.com>
Tue, 2 Jul 2019 18:57:25 +0000 (14:57 -0400)
committerOlga Kornievskaia <olga.kornievskaia@gmail.com>
Wed, 9 Oct 2019 16:06:10 +0000 (12:06 -0400)
In case of copy is cancelled, also send OFFLOAD_CANCEL to the source
server.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
fs/nfs/nfs42proc.c

index 50538b975aba3285415c40d5879437a112fbb783..5d833f5748e9c7a4996b6101dd598176720622f7 100644 (file)
@@ -206,12 +206,14 @@ static int handle_async_copy(struct nfs42_copy_res *res,
        memcpy(&res->write_res.verifier, &copy->verf, sizeof(copy->verf));
        status = -copy->error;
 
+out_free:
        kfree(copy);
        return status;
 out_cancel:
        nfs42_do_offload_cancel_async(dst, &copy->stateid);
-       kfree(copy);
-       return status;
+       if (!nfs42_files_from_same_server(src, dst))
+               nfs42_do_offload_cancel_async(src, src_stateid);
+       goto out_free;
 }
 
 static int process_copy_commit(struct file *dst, loff_t pos_dst,
@@ -381,7 +383,8 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
 
                if (err >= 0)
                        break;
-               if (err == -ENOTSUPP) {
+               if (err == -ENOTSUPP &&
+                               nfs42_files_from_same_server(src, dst)) {
                        err = -EOPNOTSUPP;
                        break;
                } else if (err == -EAGAIN) {
@@ -392,7 +395,8 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
                        dst_exception.retry = 1;
                        continue;
                } else if ((err == -ESTALE ||
-                               err == -NFS4ERR_OFFLOAD_DENIED) &&
+                               err == -NFS4ERR_OFFLOAD_DENIED ||
+                               err == -ENOTSUPP) &&
                                !nfs42_files_from_same_server(src, dst)) {
                        nfs42_do_offload_cancel_async(src, &args.src_stateid);
                        err = -EOPNOTSUPP;