go/src/os
Ian Lance Taylor 023c46676d [release-branch.go1.15] internal/poll: if copy_file_range returns 0, 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 30641e36aa)
Reviewed-on: https://go-review.googlesource.com/c/go/+/292289
2021-02-16 21:22:54 +00:00
..
exec os/exec: build TestExtraFiles subprocess without cgo 2020-04-18 19:58:12 +00:00
signal all: replace usages of whitelist/blacklist and master/slave 2020-06-08 01:03:14 +00:00
testdata/issue37161 os: seek should invalidate any cached directory reads 2020-03-01 22:26:33 +00:00
user syscall, internal/syscall/windows: remove utf16PtrToString parameter 2020-05-03 07:23:32 +00:00
dir.go os: change Readdirnames doc to follow that of Readdir 2019-08-02 21:52:01 +00:00
dir_darwin.go os: seek should invalidate any cached directory reads 2020-03-01 22:26:33 +00:00
dir_plan9.go
dir_unix.go os: seek should invalidate any cached directory reads 2020-03-01 22:26:33 +00:00
dir_windows.go
env.go
env_test.go
env_unix_test.go
error.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
error_errno.go os: don't consult Is methods on non-syscall error types 2019-08-02 21:09:50 +00:00
error_plan9.go os: don't consult Is methods on non-syscall error types 2019-08-02 21:09:50 +00:00
error_posix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
error_test.go os: don't consult Is methods on non-syscall error types 2019-08-02 21:09:50 +00:00
error_unix_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
error_windows_test.go
example_test.go os: don't leak file in ExampleOpenFile_append failure path 2019-04-11 21:47:52 +00:00
exec.go
exec_plan9.go os/exec: less allocs in the common case 2019-03-04 09:45:46 +00:00
exec_posix.go os/exec: use environment variables for user token when present 2020-02-25 02:05:29 +00:00
exec_unix.go internal/poll, os: loop on EINTR 2020-05-11 22:38:32 +00:00
exec_windows.go syscall, internal/syscall/windows: remove utf16PtrToString parameter 2020-05-03 07:23:32 +00:00
executable.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
executable_darwin.go
executable_freebsd.go
executable_path.go
executable_plan9.go
executable_procfs.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
executable_solaris.go
executable_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
executable_windows.go
export_linux_test.go os, internal/poll, internal/syscall/unix: use copy_file_range on Linux 2020-04-28 00:59:36 +00:00
export_test.go os: use an actual RemoveAll failure in TestRemoveAllWithMoreErrorThanReqSize 2019-10-26 01:46:02 +00:00
export_unix_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
export_windows_test.go
fifo_test.go
file.go os: use same link in UserCacheDir/UserConfigDir doc 2020-05-24 01:19:35 +00:00
file_plan9.go os: return *PathError error in File.Sync on Plan 9 2020-06-25 12:02:38 +00:00
file_posix.go os: merge common Unix/Windows methods 2020-03-20 00:26:13 +00:00
file_unix.go os: always check for EINTR in calls to open 2020-06-08 22:06:39 +00:00
file_windows.go os: in Symlink, stat the correct target path for drive-relative targets on Windows 2020-05-28 21:41:10 +00:00
getwd.go
getwd_darwin.go
os_test.go syscall: preserve Windows file permissions for O_CREAT|O_TRUNC 2020-05-20 21:52:34 +00:00
os_unix_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
os_windows_test.go os: in Symlink, stat the correct target path for drive-relative targets on Windows 2020-05-28 21:41:10 +00:00
path.go os: return from TestRemoveAllWithMoreErrorThanReqSize when RemoveAll succeeds on Windows 2019-10-29 18:24:40 +00:00
path_plan9.go
path_test.go all: remove scattered remnants of darwin/arm 2020-04-08 18:35:49 +00:00
path_unix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
path_windows.go
path_windows_test.go os: handle backslash and slash both in the path on Windows 2019-11-14 00:58:33 +00:00
pipe2_bsd.go
pipe_bsd.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
pipe_linux.go
pipe_test.go runtime: mark OpenBSD raise function nosplit 2020-07-08 19:50:20 +00:00
proc.go os: document exit status range value 2019-03-27 04:37:34 +00:00
rawconn.go
rawconn_test.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
readfrom_linux.go os: fix regression with handling of nil *File 2020-07-08 18:29:38 +00:00
readfrom_linux_test.go [release-branch.go1.15] internal/poll: if copy_file_range returns 0, assume it failed 2021-02-16 21:22:54 +00:00
readfrom_stub.go os, internal/poll, internal/syscall/unix: use copy_file_range on Linux 2020-04-28 00:59:36 +00:00
removeall_at.go os: always check for EINTR in calls to open 2020-06-08 22:06:39 +00:00
removeall_noat.go Revert "os: handle long path in RemoveAll for windows" 2020-01-13 23:35:18 +00:00
removeall_test.go Revert "os: handle long path in RemoveAll for windows" 2020-01-13 23:35:18 +00:00
stat.go
stat_aix.go
stat_darwin.go
stat_dragonfly.go
stat_freebsd.go
stat_js.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
stat_linux.go
stat_netbsd.go
stat_openbsd.go
stat_plan9.go
stat_solaris.go
stat_test.go
stat_unix.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
stat_windows.go os: return an error when the argument of Mkdir on Windows is os.DevNull 2019-08-29 09:53:56 +00:00
sticky_bsd.go os,syscall: implement functions related to uid, gid and pid on js/wasm 2019-03-22 15:40:37 +00:00
sticky_notbsd.go os,syscall: implement functions related to uid, gid and pid on js/wasm 2019-03-22 15:40:37 +00:00
str.go
sys.go
sys_aix.go
sys_bsd.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
sys_js.go
sys_linux.go
sys_plan9.go
sys_solaris.go
sys_unix.go
sys_windows.go
timeout_test.go os, net: define and use os.ErrDeadlineExceeded 2020-04-25 00:26:48 +00:00
types.go
types_plan9.go
types_unix.go
types_windows.go os: fix windows Lstat missing name for some files 2019-03-20 08:35:29 +00:00
wait_unimp.go all: remove the nacl port (part 1) 2019-10-09 06:14:44 +00:00
wait_wait6.go internal/poll, os: loop on EINTR 2020-05-11 22:38:32 +00:00
wait_waitid.go internal/poll, os: loop on EINTR 2020-05-11 22:38:32 +00:00