Commit c20988c2 authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French
Browse files

ksmbd: copy overlapped range within the same file



cifs.ko request to copy overlapped range within the same file.
ksmbd is using vfs_copy_file_range for this, vfs_copy_file_range() does not
allow overlapped copying within the same file.
This patch use do_splice_direct() if offset and length are overlapped.

Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 3677ca67
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/sched/xacct.h>
#include <linux/crc32c.h>
#include <linux/namei.h>
#include <linux/splice.h>

#include "glob.h"
#include "oplock.h"
@@ -1829,6 +1830,17 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work,
		if (src_off + len > src_file_size)
			return -E2BIG;

		/*
		 * vfs_copy_file_range does not allow overlapped copying
		 * within the same file.
		 */
		if (file_inode(src_fp->filp) == file_inode(dst_fp->filp) &&
				dst_off + len > src_off &&
				dst_off < src_off + len)
			ret = do_splice_direct(src_fp->filp, &src_off,
					dst_fp->filp, &dst_off,
					min_t(size_t, len, MAX_RW_COUNT), 0);
		else
			ret = vfs_copy_file_range(src_fp->filp, src_off,
					dst_fp->filp, dst_off, len, 0);
		if (ret == -EOPNOTSUPP || ret == -EXDEV)