From 3ede9415944a55242a1888598c4bda00cc05d4ab Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 22 Mar 2024 13:39:13 +0100 Subject: [PATCH] =?utf8?q?internal/poll:=20use=20sync.OnceValue=20to=20det?= =?utf8?q?ermine=20kernel=20version=20=E2=89=A5=205.3=20in=20CopyFileRange?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: I13fdf86c3f46bf3c83cb116e9dd3bc4ab1a949d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/573755 Reviewed-by: Ian Lance Taylor Auto-Submit: Tobias Klauser Reviewed-by: Emmanuel Odeke Reviewed-by: David Chase LUCI-TryBot-Result: Go LUCI Reviewed-by: qiulaidongfeng <2645477756@qq.com> --- src/internal/poll/copy_file_range_linux.go | 26 +++++++++------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/internal/poll/copy_file_range_linux.go b/src/internal/poll/copy_file_range_linux.go index ba33f5145d..1a32236b12 100644 --- a/src/internal/poll/copy_file_range_linux.go +++ b/src/internal/poll/copy_file_range_linux.go @@ -10,27 +10,23 @@ import ( "syscall" ) -var ( - kernelVersion53Once sync.Once - kernelVersion53 bool -) +var isKernelVersionGE53 = sync.OnceValue(func() bool { + major, minor := unix.KernelVersion() + // copy_file_range(2) is broken in various ways on kernels older than 5.3, + // see https://go.dev/issue/42400 and + // https://man7.org/linux/man-pages/man2/copy_file_range.2.html#VERSIONS + if major > 5 || (major == 5 && minor >= 3) { + return true + } + return false +}) const maxCopyFileRangeRound = 1 << 30 // CopyFileRange copies at most remain bytes of data from src to dst, using // the copy_file_range system call. dst and src must refer to regular files. func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err error) { - kernelVersion53Once.Do(func() { - major, minor := unix.KernelVersion() - // copy_file_range(2) is broken in various ways on kernels older than 5.3, - // see issue #42400 and - // https://man7.org/linux/man-pages/man2/copy_file_range.2.html#VERSIONS - if major > 5 || (major == 5 && minor >= 3) { - kernelVersion53 = true - } - }) - - if !kernelVersion53 { + if !isKernelVersionGE53() { return 0, false, nil } -- 2.50.0