package ld
import (
+ "errors"
"os"
"path/filepath"
"syscall"
// Try fallocate first.
for {
err = out.fallocate(1 << 10)
- if err == syscall.EOPNOTSUPP { // The underlying file system may not support fallocate
+ if errors.Is(err, errors.ErrUnsupported) || err == errNoFallocate { // The underlying file system may not support fallocate
t.Skip("fallocate is not supported")
}
if err == syscall.EINTR {
package ld
-import "internal/syscall/unix"
+import (
+ "internal/syscall/unix"
+ "syscall"
+)
func (out *OutBuf) fallocate(size uint64) error {
- return unix.PosixFallocate(int(out.f.Fd()), 0, int64(size))
+ 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
}
AT_REMOVEDIR = 0x800
AT_SYMLINK_NOFOLLOW = 0x200
- unlinkatTrap uintptr = syscall.SYS_UNLINKAT
- openatTrap uintptr = syscall.SYS_OPENAT
+ unlinkatTrap uintptr = syscall.SYS_UNLINKAT
+ openatTrap uintptr = syscall.SYS_OPENAT
+ posixFallocateTrap uintptr = syscall.SYS_POSIX_FALLOCATE
)
+++ /dev/null
-// 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 && (386 || arm)
-
-package unix
-
-import "syscall"
-
-// FreeBSD posix_fallocate system call number.
-const posixFallocateTrap uintptr = 530
-
-func PosixFallocate(fd int, off int64, size int64) error {
- _, _, errno := syscall.Syscall6(posixFallocateTrap, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(size), uintptr(size>>32), 0)
- if errno != 0 {
- return errno
- }
- return nil
-}
--- /dev/null
+// 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.
+
+package unix
+
+import "syscall"
+
+func PosixFallocate(fd int, off int64, size int64) error {
+ // If successful, posix_fallocate() returns zero. It returns an error on failure, without
+ // setting errno. See https://man.freebsd.org/cgi/man.cgi?query=posix_fallocate&sektion=2&n=1
+ r1, _, _ := syscall.Syscall6(posixFallocateTrap, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(size), uintptr(size>>32), 0)
+ if r1 != 0 {
+ return syscall.Errno(r1)
+ }
+ return nil
+}
import "syscall"
-// FreeBSD posix_fallocate system call number.
-const posixFallocateTrap uintptr = 530
-
func PosixFallocate(fd int, off int64, size int64) error {
- _, _, errno := syscall.Syscall(posixFallocateTrap, uintptr(fd), uintptr(off), uintptr(size))
- if errno != 0 {
- return errno
+ // If successful, posix_fallocate() returns zero. It returns an error on failure, without
+ // setting errno. See https://man.freebsd.org/cgi/man.cgi?query=posix_fallocate&sektion=2&n=1
+ r1, _, _ := syscall.Syscall(posixFallocateTrap, uintptr(fd), uintptr(off), uintptr(size))
+ if r1 != 0 {
+ return syscall.Errno(r1)
}
return nil
}
--- /dev/null
+// 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.
+
+package unix
+
+import "syscall"
+
+func PosixFallocate(fd int, off int64, size int64) error {
+ // If successful, posix_fallocate() returns zero. It returns an error on failure, without
+ // setting errno. See https://man.freebsd.org/cgi/man.cgi?query=posix_fallocate&sektion=2&n=1
+ //
+ // The padding 0 argument is needed because the ARM calling convention requires that if an
+ // argument (off in this case) needs double-word alignment (8-byte), the NCRN (next core
+ // register number) is rounded up to the next even register number.
+ // See https://github.com/ARM-software/abi-aa/blob/2bcab1e3b22d55170c563c3c7940134089176746/aapcs32/aapcs32.rst#parameter-passing
+ r1, _, _ := syscall.Syscall6(posixFallocateTrap, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(size), uintptr(size>>32))
+ if r1 != 0 {
+ return syscall.Errno(r1)
+ }
+ return nil
+}