mirror of
https://github.com/hanzoai/go-fuse.git
synced 2026-10-30 14:46:18 +00:00
57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
package fallocate
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func fallocate(fd int, mode uint32, off int64, len int64) error {
|
|
// TODO: Handle `mode` parameter.
|
|
_ = mode
|
|
|
|
// From `man fcntl` on OSX:
|
|
// The F_PREALLOCATE command operates on the following structure:
|
|
//
|
|
// typedef struct fstore {
|
|
// u_int32_t fst_flags; /* IN: flags word */
|
|
// int fst_posmode; /* IN: indicates offset field */
|
|
// off_t fst_offset; /* IN: start of the region */
|
|
// off_t fst_length; /* IN: size of the region */
|
|
// off_t fst_bytesalloc; /* OUT: number of bytes allocated */
|
|
// } fstore_t;
|
|
//
|
|
// The flags (fst_flags) for the F_PREALLOCATE command are as follows:
|
|
//
|
|
// F_ALLOCATECONTIG Allocate contiguous space.
|
|
//
|
|
// F_ALLOCATEALL Allocate all requested space or no space at all.
|
|
//
|
|
// The position modes (fst_posmode) for the F_PREALLOCATE command indicate how to use the offset field. The modes are as fol-
|
|
// lows:
|
|
//
|
|
// F_PEOFPOSMODE Allocate from the physical end of file.
|
|
//
|
|
// F_VOLPOSMODE Allocate from the volume offset.
|
|
|
|
k := struct {
|
|
Flags uint32 // u_int32_t
|
|
Posmode int64 // int
|
|
Offset int64 // off_t
|
|
Length int64 // off_t
|
|
Bytesalloc int64 // off_t
|
|
}{
|
|
0,
|
|
0,
|
|
int64(off),
|
|
int64(len),
|
|
0,
|
|
}
|
|
_, _, errno := unix.Syscall(syscall.SYS_FCNTL, uintptr(fd), uintptr(unix.F_PREALLOCATE), uintptr(unsafe.Pointer(&k)))
|
|
if errno != 0 {
|
|
return errno
|
|
}
|
|
return nil
|
|
}
|