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 }