Instead of hardcoding always sending async copy, make it configurable. In case, we get ERR_OFFLOAD_NO_REQS and we need to resend the operation as synchronous. Signed-off-by: Olga Kornievskaia <kolga@xxxxxxxxxx> --- fs/nfs/nfs42proc.c | 2 ++ fs/nfs/nfs42xdr.c | 2 +- include/linux/nfs_xdr.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index 2ffd96d..32b08ea 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -204,6 +204,7 @@ static ssize_t _nfs42_proc_copy(struct file *src, size_t count = args->count; int status; uint64_t ret_count; + bool sync = false; status = nfs4_set_rw_stateid(&args->src_stateid, src_lock->open_context, src_lock, FMODE_READ); @@ -224,6 +225,7 @@ static ssize_t _nfs42_proc_copy(struct file *src, if (status) return status; + args->sync = sync; status = nfs4_call_sync(server->client, server, &msg, &args->seq_args, &res->seq_res, 0); switch (status) { diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 059d074..1f12574 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -158,7 +158,7 @@ static void encode_copy(struct xdr_stream *xdr, encode_uint64(xdr, args->count); encode_uint32(xdr, 1); /* consecutive = true */ - encode_uint32(xdr, 0); /* synchronous = false */ + encode_uint32(xdr, args->sync); encode_uint32(xdr, 0); /* src server list */ } diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 6c6130f..a04862c 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -1371,6 +1371,7 @@ struct nfs42_copy_args { u64 dst_pos; u64 count; + bool sync; }; struct nfs42_write_res { -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html