Bug 202935

Summary: CIFS: copy_file_range return "Invalid argument" when copy in the same file
Product: File System Reporter: Xiaoli Feng (fengxiaoli0714)
Component: CIFSAssignee: fs_cifs (fs_cifs)
Status: RESOLVED PATCH_ALREADY_AVAILABLE    
Severity: normal CC: alexander198961, lsahlber
Priority: P1    
Hardware: All   
OS: Linux   
Kernel Version: 5.0.0+ Subsystem:
Regression: No Bisected commit-id:
Attachments: reproducer c program

Description Xiaoli Feng 2019-03-15 06:51:36 UTC
Created attachment 281843 [details]
reproducer c program

Do the copy_file range operation on the same file. It return "Invalid argument".
[root@kvm-01-guest23 ~]# mount //localhost/cifs cifs -o vers=3.0,user=root,password=redhat
[root@kvm-01-guest23 ~]# dd if=/dev/zero of=cifs/file bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00542753 s, 193 MB/s
[root@kvm-01-guest23 ~]# ls -l cifs/file
-rwxr-xr-x. 1 root root 1048576 Mar 15 02:35 cifs/file
[root@kvm-01-guest23 ~]# gcc -o copy_offload_file copy_offload_file.c 
[root@kvm-01-guest23 ~]# ./copy_offload_file cifs/file
len=1048576,fd_in=3
copy_file_range: Invalid argument

It's successful for xfs,ext4,nfs filesystem.
Comment 1 Oleksandr 2019-04-12 12:14:47 UTC
I will take a look during weekend
Comment 2 Oleksandr 2019-04-17 03:27:22 UTC
The problem seems here 
        if (src_inode == target_inode) {
                rc = -EINVAL;
                goto out;
        }
Comment 3 Oleksandr 2019-04-17 05:15:26 UTC
Not sure if we can remove this check ?
Comment 4 Ronnie Sahlberg 2019-06-20 01:29:49 UTC
Checked in as:

commit 9ab70ca653307771589e1414102c552d8dbdbbef
Author: Kovtunenko Oleksandr <alexander198961@gmail.com>
Date:   Tue May 14 05:52:34 2019 +0000

    Fixed https://bugzilla.kernel.org/show_bug.cgi?id=202935 allow write on the same file
    
    Copychunk allows source and target to be on the same file.
    For details on restrictions see MS-SMB2 3.3.5.15.6