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/hanwen/go-fuse/fuse/nodefs"
|
||||||
|
|
||||||
"github.com/rfjakob/gocryptfs/internal/contentenc"
|
"github.com/rfjakob/gocryptfs/internal/contentenc"
|
||||||
|
"github.com/rfjakob/gocryptfs/internal/syscallcompat"
|
||||||
"github.com/rfjakob/gocryptfs/internal/tlog"
|
"github.com/rfjakob/gocryptfs/internal/tlog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ func (f *file) createHeader() error {
|
||||||
buf := h.Pack()
|
buf := h.Pack()
|
||||||
|
|
||||||
// Prevent partially written (=corrupt) header by preallocating the space beforehand
|
// 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 {
|
if err != nil {
|
||||||
tlog.Warn.Printf("ino%d: createHeader: prealloc failed: %s\n", f.ino, err.Error())
|
tlog.Warn.Printf("ino%d: createHeader: prealloc failed: %s\n", f.ino, err.Error())
|
||||||
return err
|
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)
|
f.ino, uint64(len(blockData))-f.contentEnc.BlockOverhead(), b.BlockNo)
|
||||||
|
|
||||||
// Prevent partially written (=corrupt) blocks by preallocating the space beforehand
|
// 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 {
|
if err != nil {
|
||||||
tlog.Warn.Printf("ino%d fh%d: doWrite: prealloc failed: %s", f.ino, f.intFd(), err.Error())
|
tlog.Warn.Printf("ino%d fh%d: doWrite: prealloc failed: %s", f.ino, f.intFd(), err.Error())
|
||||||
status = fuse.ToStatus(err)
|
status = fuse.ToStatus(err)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package fusefrontend
|
package syscallcompat
|
||||||
|
|
||||||
// prealloc - preallocate space without changing the file size. This prevents
|
// prealloc - preallocate space without changing the file size. This prevents
|
||||||
// us from running out of space in the middle of an operation.
|
// 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
|
// Sorry, fallocate is not available on OSX at all and
|
||||||
// fcntl F_PREALLOCATE is not accessible from Go.
|
// fcntl F_PREALLOCATE is not accessible from Go.
|
|
@ -1,17 +1,19 @@
|
||||||
package fusefrontend
|
package syscallcompat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/rfjakob/gocryptfs/internal/tlog"
|
||||||
)
|
)
|
||||||
|
|
||||||
import "github.com/rfjakob/gocryptfs/internal/tlog"
|
const FALLOC_FL_KEEP_SIZE = 0x01
|
||||||
|
|
||||||
var preallocWarn sync.Once
|
var preallocWarn sync.Once
|
||||||
|
|
||||||
// prealloc - preallocate space without changing the file size. This prevents
|
// prealloc - preallocate space without changing the file size. This prevents
|
||||||
// us from running out of space in the middle of an operation.
|
// 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 {
|
for {
|
||||||
err = syscall.Fallocate(fd, FALLOC_FL_KEEP_SIZE, off, len)
|
err = syscall.Fallocate(fd, FALLOC_FL_KEEP_SIZE, off, len)
|
||||||
if err == syscall.EINTR {
|
if err == syscall.EINTR {
|
Loading…
Reference in New Issue