-
Notifications
You must be signed in to change notification settings - Fork 17.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
os: copy_file_range system call fails on some file systems #44272
Comments
@gopherbot Please open backport to Go 1.15. This bug can cause file corruption when using |
Backport issue(s) opened: #44273 (for 1.15). Remember to create the cherry-pick CL(s) as soon as the patch is submitted to master, according to https://golang.org/wiki/MinorReleases. |
Change https://golang.org/cl/291989 mentions this issue: |
Change https://golang.org/cl/292289 mentions this issue: |
…assume it failed On current Linux kernels copy_file_range does not correctly handle files in certain special file systems, such as /proc. For those file systems it fails to copy any data and returns zero. This breaks Go's io.Copy for those files. Fix the problem by assuming that if copy_file_range returns 0 the first time it is called on a file, that that file is not supported. In that case fall back to just using read. This will force an extra system call when using io.Copy to copy a zero-sized normal file, but at least it will work correctly. For #36817 For #44272 Fixes #44273 Change-Id: I02e81872cb70fda0ce5485e2ea712f219132e614 Reviewed-on: https://go-review.googlesource.com/c/go/+/291989 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org> (cherry picked from commit 30641e3) Reviewed-on: https://go-review.googlesource.com/c/go/+/292289
On GNU/Linux systems we currently use the
copy_file_range
system call when copying from one open file to another viaio.Copy
or similar mechanisms. This seems to be exactly whatcopy_file_range
is for. Unfortunately, on current Linux kernel versions this fails to work on certain file systems. The failure mode is thatcopy_file_range
returns0
even if the file actually contains data. A sample file system for which this occurs is the procfs file system that implements/proc
.For example, this program fails on Linux kernel version 5.7.17.
It seems likely, though not certain, that we can detect this case by treating a zero return from
copy_file_range
as indicating thatcopy_file_range
is not supported for that file. In that case we can fall back to usingread
andwrite
as usual. For the case of an empty file this will introduce additional system calls, but at least it will work correctly.There is a mailing list discussion about this problem at https://lore.kernel.org/linux-fsdevel/20210126233840.GG4626@dread.disaster.area/T/#m05753578c7f7882f6e9ffe01f981bc223edef2b0.
The text was updated successfully, but these errors were encountered: