2021-05-09 21:45:25

by Alejandro Colomar

[permalink] [raw]
Subject: [PATCH] copy_file_range.2: Update cross-filesystem support for 5.12

Linux 5.12 fixes a regression.

Cross-filesystem (introduced in 5.3) copies were buggy.

Move the statements documenting cross-fs to BUGS.
Kernels 5.3..5.11 should be patched soon.

State version information for some errors related to this.

Reported-by: Luis Henriques <[email protected]>
Reported-by: Amir Goldstein <[email protected]>
Related: <https://lwn.net/Articles/846403/>
Cc: Greg KH <[email protected]>
Cc: Michael Kerrisk <[email protected]>
Cc: Anna Schumaker <[email protected]>
Cc: Jeff Layton <[email protected]>
Cc: Steve French <[email protected]>
Cc: Miklos Szeredi <[email protected]>
Cc: Trond Myklebust <[email protected]>
Cc: Alexander Viro <[email protected]>
Cc: "Darrick J. Wong" <[email protected]>
Cc: Dave Chinner <[email protected]>
Cc: Nicolas Boichat <[email protected]>
Cc: Ian Lance Taylor <[email protected]>
Cc: Luis Lozano <[email protected]>
Cc: Andreas Dilger <[email protected]>
Cc: Olga Kornievskaia <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: ceph-devel <[email protected]>
Cc: linux-kernel <[email protected]>
Cc: CIFS <[email protected]>
Cc: samba-technical <[email protected]>
Cc: linux-fsdevel <[email protected]>
Cc: Linux NFS Mailing List <[email protected]>
Cc: Walter Harms <[email protected]>
Signed-off-by: Alejandro Colomar <[email protected]>
---
man2/copy_file_range.2 | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/man2/copy_file_range.2 b/man2/copy_file_range.2
index 467a16300..843e02241 100644
--- a/man2/copy_file_range.2
+++ b/man2/copy_file_range.2
@@ -169,6 +169,9 @@ Out of memory.
.B ENOSPC
There is not enough space on the target filesystem to complete the copy.
.TP
+.BR EOPNOTSUPP " (since Linux 5.12)"
+The filesystem does not support this operation.
+.TP
.B EOVERFLOW
The requested source or destination range is too large to represent in the
specified data types.
@@ -184,10 +187,17 @@ or
.I fd_out
refers to an active swap file.
.TP
-.B EXDEV
+.BR EXDEV " (before Linux 5.3)"
+The files referred to by
+.IR fd_in " and " fd_out
+are not on the same filesystem.
+.TP
+.BR EXDEV " (since Linux 5.12)"
The files referred to by
.IR fd_in " and " fd_out
-are not on the same mounted filesystem (pre Linux 5.3).
+are not on the same filesystem,
+and the source and target filesystems are not of the same type,
+or do not support cross-filesystem copy.
.SH VERSIONS
The
.BR copy_file_range ()
@@ -200,8 +210,11 @@ Areas of the API that weren't clearly defined were clarified and the API bounds
are much more strictly checked than on earlier kernels.
Applications should target the behaviour and requirements of 5.3 kernels.
.PP
-First support for cross-filesystem copies was introduced in Linux 5.3.
-Older kernels will return -EXDEV when cross-filesystem copies are attempted.
+Since Linux 5.12,
+cross-filesystem copies can be achieved
+when both filesystems are of the same type,
+and that filesystem implements support for it.
+See BUGS for behavior prior to 5.12.
.SH CONFORMING TO
The
.BR copy_file_range ()
@@ -226,6 +239,12 @@ gives filesystems an opportunity to implement "copy acceleration" techniques,
such as the use of reflinks (i.e., two or more inodes that share
pointers to the same copy-on-write disk blocks)
or server-side-copy (in the case of NFS).
+.SH BUGS
+In Linux kernels 5.3 to 5.11,
+cross-filesystem copies were implemented by the kernel,
+if the operation was not supported by individual filesystems.
+However, on some virtual filesystems,
+the call failed to copy, while still reporting success.
.SH EXAMPLES
.EX
#define _GNU_SOURCE
--
2.31.1


Subject: Re: [PATCH] copy_file_range.2: Update cross-filesystem support for 5.12

Hi Alex,

On 5/10/21 9:39 AM, Alejandro Colomar wrote:
> Linux 5.12 fixes a regression.
>
> Cross-filesystem (introduced in 5.3) copies were buggy.
>
> Move the statements documenting cross-fs to BUGS.
> Kernels 5.3..5.11 should be patched soon.
>
> State version information for some errors related to this.

Thanks. Patch applied.

Cheers,

Michael

>
> Reported-by: Luis Henriques <[email protected]>
> Reported-by: Amir Goldstein <[email protected]>
> Related: <https://lwn.net/Articles/846403/>
> Cc: Greg KH <[email protected]>
> Cc: Michael Kerrisk <[email protected]>
> Cc: Anna Schumaker <[email protected]>
> Cc: Jeff Layton <[email protected]>
> Cc: Steve French <[email protected]>
> Cc: Miklos Szeredi <[email protected]>
> Cc: Trond Myklebust <[email protected]>
> Cc: Alexander Viro <[email protected]>
> Cc: "Darrick J. Wong" <[email protected]>
> Cc: Dave Chinner <[email protected]>
> Cc: Nicolas Boichat <[email protected]>
> Cc: Ian Lance Taylor <[email protected]>
> Cc: Luis Lozano <[email protected]>
> Cc: Andreas Dilger <[email protected]>
> Cc: Olga Kornievskaia <[email protected]>
> Cc: Christoph Hellwig <[email protected]>
> Cc: ceph-devel <[email protected]>
> Cc: linux-kernel <[email protected]>
> Cc: CIFS <[email protected]>
> Cc: samba-technical <[email protected]>
> Cc: linux-fsdevel <[email protected]>
> Cc: Linux NFS Mailing List <[email protected]>
> Cc: Walter Harms <[email protected]>
> Signed-off-by: Alejandro Colomar <[email protected]>
> ---
> man2/copy_file_range.2 | 27 +++++++++++++++++++++++----
> 1 file changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/man2/copy_file_range.2 b/man2/copy_file_range.2
> index 467a16300..843e02241 100644
> --- a/man2/copy_file_range.2
> +++ b/man2/copy_file_range.2
> @@ -169,6 +169,9 @@ Out of memory.
> .B ENOSPC
> There is not enough space on the target filesystem to complete the copy.
> .TP
> +.BR EOPNOTSUPP " (since Linux 5.12)"
> +The filesystem does not support this operation.
> +.TP
> .B EOVERFLOW
> The requested source or destination range is too large to represent in the
> specified data types.
> @@ -184,10 +187,17 @@ or
> .I fd_out
> refers to an active swap file.
> .TP
> -.B EXDEV
> +.BR EXDEV " (before Linux 5.3)"
> +The files referred to by
> +.IR fd_in " and " fd_out
> +are not on the same filesystem.
> +.TP
> +.BR EXDEV " (since Linux 5.12)"
> The files referred to by
> .IR fd_in " and " fd_out
> -are not on the same mounted filesystem (pre Linux 5.3).
> +are not on the same filesystem,
> +and the source and target filesystems are not of the same type,
> +or do not support cross-filesystem copy.
> .SH VERSIONS
> The
> .BR copy_file_range ()
> @@ -200,8 +210,11 @@ Areas of the API that weren't clearly defined were clarified and the API bounds
> are much more strictly checked than on earlier kernels.
> Applications should target the behaviour and requirements of 5.3 kernels.
> .PP
> -First support for cross-filesystem copies was introduced in Linux 5.3.
> -Older kernels will return -EXDEV when cross-filesystem copies are attempted.
> +Since Linux 5.12,
> +cross-filesystem copies can be achieved
> +when both filesystems are of the same type,
> +and that filesystem implements support for it.
> +See BUGS for behavior prior to 5.12.
> .SH CONFORMING TO
> The
> .BR copy_file_range ()
> @@ -226,6 +239,12 @@ gives filesystems an opportunity to implement "copy acceleration" techniques,
> such as the use of reflinks (i.e., two or more inodes that share
> pointers to the same copy-on-write disk blocks)
> or server-side-copy (in the case of NFS).
> +.SH BUGS
> +In Linux kernels 5.3 to 5.11,
> +cross-filesystem copies were implemented by the kernel,
> +if the operation was not supported by individual filesystems.
> +However, on some virtual filesystems,
> +the call failed to copy, while still reporting success.
> .SH EXAMPLES
> .EX
> #define _GNU_SOURCE
>


--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/