summaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorOlga Kornievskaia <kolga@netapp.com>2017-09-25 15:59:44 -0400
committerOlga Kornievskaia <olga.kornievskaia@gmail.com>2019-10-09 12:06:00 -0400
commit7e350197a1c10ad137ec51689f317e3e94e4cc41 (patch)
treeda7d8b09f82bc3035012983848b389a0ae73e729 /fs/nfs
parent0b9018b9cab9b6a30fd6758ff0745ff74efcf374 (diff)
downloadlinux-stable-7e350197a1c10ad137ec51689f317e3e94e4cc41.tar.gz
linux-stable-7e350197a1c10ad137ec51689f317e3e94e4cc41.tar.bz2
linux-stable-7e350197a1c10ad137ec51689f317e3e94e4cc41.zip
NFS: for "inter" copy treat ESTALE as ENOTSUPP
If the client sends an "inter" copy to the destination server but it only supports "intra" copy, it can return ESTALE (since it doesn't know anything about the file handle from the other server and does not recognize the special case of "inter" copy). Translate this error as ENOTSUPP and also send OFFLOAD_CANCEL to the source server so that it can clean up state. Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs42proc.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index e34ade844737..6ed5a16dc511 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -391,6 +391,11 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
args.sync = true;
dst_exception.retry = 1;
continue;
+ } else if (err == -ESTALE &&
+ !nfs42_files_from_same_server(src, dst)) {
+ nfs42_do_offload_cancel_async(src, &args.src_stateid);
+ err = -EOPNOTSUPP;
+ break;
}
err2 = nfs4_handle_exception(server, err, &src_exception);