syscallcompat: move syscall wrapper to their own package
We will get more of them as OSX also lacks support for openat.
This commit is contained in:
parent
0d5d6fc99b
commit
c9a472c12f
@ -16,6 +16,7 @@ import (
|
||||
"github.com/hanwen/go-fuse/fuse/nodefs"
|
||||
|
||||
"github.com/rfjakob/gocryptfs/internal/contentenc"
|
||||
"github.com/rfjakob/gocryptfs/internal/syscallcompat"
|
||||
"github.com/rfjakob/gocryptfs/internal/tlog"
|
||||
)
|
||||
|
||||
@ -100,7 +101,7 @@ func (f *file) createHeader() error {
|
||||
buf := h.Pack()
|
||||
|
||||
// Prevent partially written (=corrupt) header by preallocating the space beforehand
|
||||
err := prealloc(int(f.fd.Fd()), 0, contentenc.HEADER_LEN)
|
||||
err := syscallcompat.Prealloc(int(f.fd.Fd()), 0, contentenc.HEADER_LEN)
|
||||
if err != nil {
|
||||
tlog.Warn.Printf("ino%d: createHeader: prealloc failed: %s\n", f.ino, err.Error())
|
||||
return err
|
||||
@ -261,7 +262,7 @@ func (f *file) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
||||
f.ino, uint64(len(blockData))-f.contentEnc.BlockOverhead(), b.BlockNo)
|
||||
|
||||
// Prevent partially written (=corrupt) blocks by preallocating the space beforehand
|
||||
err := prealloc(int(f.fd.Fd()), int64(blockOffset), int64(len(blockData)))
|
||||
err := syscallcompat.Prealloc(int(f.fd.Fd()), int64(blockOffset), int64(len(blockData)))
|
||||
if err != nil {
|
||||
tlog.Warn.Printf("ino%d fh%d: doWrite: prealloc failed: %s", f.ino, f.intFd(), err.Error())
|
||||
status = fuse.ToStatus(err)
|
||||
|
@ -1,8 +1,8 @@
|
||||
package fusefrontend
|
||||
package syscallcompat
|
||||
|
||||
// prealloc - preallocate space without changing the file size. This prevents
|
||||
// us from running out of space in the middle of an operation.
|
||||
func prealloc(fd int, off int64, len int64) (err error) {
|
||||
func Prealloc(fd int, off int64, len int64) (err error) {
|
||||
//
|
||||
// Sorry, fallocate is not available on OSX at all and
|
||||
// fcntl F_PREALLOCATE is not accessible from Go.
|
@ -1,17 +1,19 @@
|
||||
package fusefrontend
|
||||
package syscallcompat
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/rfjakob/gocryptfs/internal/tlog"
|
||||
)
|
||||
|
||||
import "github.com/rfjakob/gocryptfs/internal/tlog"
|
||||
const FALLOC_FL_KEEP_SIZE = 0x01
|
||||
|
||||
var preallocWarn sync.Once
|
||||
|
||||
// prealloc - preallocate space without changing the file size. This prevents
|
||||
// us from running out of space in the middle of an operation.
|
||||
func prealloc(fd int, off int64, len int64) (err error) {
|
||||
func Prealloc(fd int, off int64, len int64) (err error) {
|
||||
for {
|
||||
err = syscall.Fallocate(fd, FALLOC_FL_KEEP_SIZE, off, len)
|
||||
if err == syscall.EINTR {
|
Loading…
Reference in New Issue
Block a user