From ce3f3e2ae73dcc0c270bc73a59ea5e7be6cf6a8d Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 6 Aug 2025 17:50:14 +0200 Subject: cmd/link/internal/ld, internal/syscall/unix: use posix_fallocate on netbsd The posix_fallocate system call is available since NetBSD 7.0, see https://man.netbsd.org/posix_fallocate.2 Re-use the syscall wrappers already in place for freebsd. Note that posix_fallocate on netbsd also returns the result in r1 rather than in errno: > If successful, posix_fallocate() returns zero. It returns an error on failure, without > setting errno. Source: https://man.netbsd.org/posix_fallocate.2#RETURN%20VALUES Cq-Include-Trybots: luci.golang.try:gotip-netbsd-arm64 Change-Id: Iaa1f6a805d511645da7f1d2737235bfd42da3407 Reviewed-on: https://go-review.googlesource.com/c/go/+/480475 Reviewed-by: Cherry Mui Reviewed-by: Benny Siegert Auto-Submit: Tobias Klauser LUCI-TryBot-Result: Go LUCI --- src/cmd/link/internal/ld/fallocate_test.go | 2 +- src/cmd/link/internal/ld/outbuf_bsd.go | 21 +++++++++++++++++++++ src/cmd/link/internal/ld/outbuf_freebsd.go | 21 --------------------- src/cmd/link/internal/ld/outbuf_mmap.go | 2 +- src/cmd/link/internal/ld/outbuf_nofallocate.go | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 src/cmd/link/internal/ld/outbuf_bsd.go delete mode 100644 src/cmd/link/internal/ld/outbuf_freebsd.go (limited to 'src/cmd/link') diff --git a/src/cmd/link/internal/ld/fallocate_test.go b/src/cmd/link/internal/ld/fallocate_test.go index d95fec788a..163ffc26e8 100644 --- a/src/cmd/link/internal/ld/fallocate_test.go +++ b/src/cmd/link/internal/ld/fallocate_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build darwin || (freebsd && go1.21) || linux +//go:build darwin || (freebsd && go1.21) || linux || (netbsd && go1.25) package ld diff --git a/src/cmd/link/internal/ld/outbuf_bsd.go b/src/cmd/link/internal/ld/outbuf_bsd.go new file mode 100644 index 0000000000..5dce83fefd --- /dev/null +++ b/src/cmd/link/internal/ld/outbuf_bsd.go @@ -0,0 +1,21 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (freebsd && go1.21) || (netbsd && go1.25) + +package ld + +import ( + "internal/syscall/unix" + "syscall" +) + +func (out *OutBuf) fallocate(size uint64) error { + err := unix.PosixFallocate(int(out.f.Fd()), 0, int64(size)) + // ZFS on FreeBSD does not support posix_fallocate and returns EINVAL in that case. + if err == syscall.EINVAL { + return errNoFallocate + } + return err +} diff --git a/src/cmd/link/internal/ld/outbuf_freebsd.go b/src/cmd/link/internal/ld/outbuf_freebsd.go deleted file mode 100644 index 7e718c1408..0000000000 --- a/src/cmd/link/internal/ld/outbuf_freebsd.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build freebsd && go1.21 - -package ld - -import ( - "internal/syscall/unix" - "syscall" -) - -func (out *OutBuf) fallocate(size uint64) error { - err := unix.PosixFallocate(int(out.f.Fd()), 0, int64(size)) - // ZFS on FreeBSD does not support posix_fallocate and returns EINVAL in that case. - if err == syscall.EINVAL { - return errNoFallocate - } - return err -} diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go index b8b8dc5158..e92a06dcb2 100644 --- a/src/cmd/link/internal/ld/outbuf_mmap.go +++ b/src/cmd/link/internal/ld/outbuf_mmap.go @@ -28,7 +28,7 @@ func (out *OutBuf) Mmap(filesize uint64) (err error) { // Some file systems do not support fallocate. We ignore that error as linking // can still take place, but you might SIGBUS when you write to the mmapped // area. - if err != syscall.ENOTSUP && err != syscall.EPERM && err != errNoFallocate { + if err != syscall.ENOTSUP && err != syscall.EOPNOTSUPP && err != syscall.EPERM && err != errNoFallocate { return err } } diff --git a/src/cmd/link/internal/ld/outbuf_nofallocate.go b/src/cmd/link/internal/ld/outbuf_nofallocate.go index 435be5e09f..9169379e23 100644 --- a/src/cmd/link/internal/ld/outbuf_nofallocate.go +++ b/src/cmd/link/internal/ld/outbuf_nofallocate.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !darwin && !(freebsd && go1.21) && !linux +//go:build !darwin && !(freebsd && go1.21) && !linux && !(netbsd && go1.25) package ld -- cgit v1.3