@@ -60,5 +60,7 @@ static inline u32 nfs42_listxattr_xdrsize(u32 buflen)
{
return ((buflen / (XATTR_USER_PREFIX_LEN + 2)) * 8) + 4;
}
+
+extern unsigned int nfs4_ssc_inter_server_min_size;
#endif /* CONFIG_NFS_V4_2 */
#endif /* __LINUX_FS_NFS_NFS4_2_H */
@@ -20,6 +20,12 @@
#ifdef CONFIG_NFS_V4_2
#include "nfs42.h"
+
+unsigned int nfs4_ssc_inter_server_min_size = (1024*1024*16);
+EXPORT_SYMBOL_GPL(nfs4_ssc_inter_server_min_size);
+module_param(nfs4_ssc_inter_server_min_size, uint, 0644);
+MODULE_PARM_DESC(nfs4_ssc_inter_server_min_size,
+ "threshold to do inter-server copy");
#endif
#define NFSDBG_FACILITY NFSDBG_FILE
@@ -158,13 +164,11 @@ static ssize_t __nfs4_copy_file_range(struct file *file_in, loff_t pos_in,
sync = true;
retry:
if (!nfs42_files_from_same_server(file_in, file_out)) {
- /* for inter copy, if copy size if smaller than 12 RPC
- * payloads, fallback to traditional copy. There are
- * 14 RPCs during an NFSv4.x mount between source/dest
- * servers.
+ /*
+ * for inter copy, if copy size is too small
+ * then fallback to generic copy.
*/
- if (sync ||
- count <= 14 * NFS_SERVER(file_inode(file_in))->rsize)
+ if (sync || count <= nfs4_ssc_inter_server_min_size)
return -EOPNOTSUPP;
cn_resp = kzalloc(sizeof(struct nfs42_copy_notify_res),
GFP_NOFS);
Replacing threshold computed in __nfs4_copy_file_range with a module configuration parameter, default to 16MB. This provides the user the option to configure the threshold to suite each specific configuration. Signed-off-by: Dai Ngo <dai.ngo@oracle.com> --- fs/nfs/nfs42.h | 2 ++ fs/nfs/nfs4file.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-)