diff options
| author | Jakob Unterwurzacher | 2016-01-07 21:39:41 +0100 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2016-01-07 21:39:41 +0100 | 
| commit | f93729f20da4a7416ec387d9d10a8776dba67c29 (patch) | |
| tree | 6b235af6df63fec4d48b487f545249fd23c89607 | |
| parent | 6a9da0db106494f5e7ce2c37e05bec02a9b08837 (diff) | |
Disable fallocate on OSX (not available and causes a build failure)
| -rw-r--r-- | pathfs_frontend/compat_darwin.go | 13 | ||||
| -rw-r--r-- | pathfs_frontend/compat_linux.go | 18 | ||||
| -rw-r--r-- | pathfs_frontend/file.go | 15 | 
3 files changed, 33 insertions, 13 deletions
| diff --git a/pathfs_frontend/compat_darwin.go b/pathfs_frontend/compat_darwin.go new file mode 100644 index 0000000..816ba88 --- /dev/null +++ b/pathfs_frontend/compat_darwin.go @@ -0,0 +1,13 @@ +package pathfs_frontend + +import "syscall" + +// 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) { +	// +	// Sorry, fallocate is not available on OSX at all and +	// fcntl F_PREALLOCATE is not accessible from Go. +	// +	// See https://github.com/rfjakob/gocryptfs/issues/18 if you want to help. +} diff --git a/pathfs_frontend/compat_linux.go b/pathfs_frontend/compat_linux.go new file mode 100644 index 0000000..7ed3c74 --- /dev/null +++ b/pathfs_frontend/compat_linux.go @@ -0,0 +1,18 @@ +package pathfs_frontend + +import "syscall" + +// 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) { +	for { +		err = syscall.Fallocate(fd, FALLOC_FL_KEEP_SIZE, off, len) +		if err == syscall.EINTR { +			// fallocate, like many syscalls, can return EINTR. This is not an +			// error and just signifies that the operation was interrupted by a +			// signal and we should try again. +			continue +		} +		return err +	} +} diff --git a/pathfs_frontend/file.go b/pathfs_frontend/file.go index d38a37b..911546d 100644 --- a/pathfs_frontend/file.go +++ b/pathfs_frontend/file.go @@ -99,7 +99,7 @@ func (f *file) createHeader() error {  	// Prevent partially written (=corrupt) header by preallocating the space beforehand  	f.fdLock.Lock()  	defer f.fdLock.Unlock() -	err := fallocateRetry(int(f.fd.Fd()), FALLOC_FL_KEEP_SIZE, 0, cryptfs.HEADER_LEN) +	err := prealloc(int(f.fd.Fd()), 0, cryptfs.HEADER_LEN)  	if err != nil {  		cryptfs.Warn.Printf("createHeader: fallocateRetry failed: %s\n", err.Error())  		return err @@ -207,17 +207,6 @@ func (f *file) Read(buf []byte, off int64) (resultData fuse.ReadResult, code fus  	return fuse.ReadResultData(out), status  } -// fallocateRetry - syscall.Fallocate() with retry for EINTR. -func fallocateRetry(fd int, mode uint32, off int64, len int64) (err error) { -	for { -		err = syscall.Fallocate(fd, mode, off, len) -		if err == syscall.EINTR { -			continue -		} -		return err -	} -} -  const FALLOC_FL_KEEP_SIZE = 0x01  // doWrite - encrypt "data" and write it to plaintext offset "off" @@ -270,7 +259,7 @@ func (f *file) doWrite(data []byte, off int64) (uint32, fuse.Status) {  		// Prevent partially written (=corrupt) blocks by preallocating the space beforehand  		f.fdLock.Lock() -		err := fallocateRetry(int(f.fd.Fd()), FALLOC_FL_KEEP_SIZE, int64(blockOffset), int64(blockLen)) +		err := prealloc(int(f.fd.Fd()), int64(blockOffset), int64(blockLen))  		f.fdLock.Unlock()  		if err != nil {  			cryptfs.Warn.Printf("doWrite: fallocateRetry failed: %s\n", err.Error()) | 
