aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2015-12-06 15:05:52 +0100
committerJakob Unterwurzacher2015-12-06 15:05:52 +0100
commit56888d83dd50a10bad56eaa512ce0b6a2f2d41ed (patch)
tree51343937e7347dfa2d79813bbf9dee8f63168e0f
parentedc289fb7578036ecc7571cb0207ceac17af9eec (diff)
fallocate the space needed for the file header beforehand
This makes sure writing to a file fails early if the underlying filesystem does not support fallocate. It also prevents partial header write due to ENOSPC.
-rw-r--r--cryptfs/names_diriv.go2
-rw-r--r--pathfs_frontend/file.go13
2 files changed, 14 insertions, 1 deletions
diff --git a/cryptfs/names_diriv.go b/cryptfs/names_diriv.go
index 3e24a73..035eac1 100644
--- a/cryptfs/names_diriv.go
+++ b/cryptfs/names_diriv.go
@@ -22,6 +22,7 @@ type DirIVCache struct {
lock sync.RWMutex
}
+// lookup - fetch entry for "dir" from the cache
func (c *DirIVCache) lookup(dir string) (bool, []byte, string) {
c.lock.RLock()
defer c.lock.RUnlock()
@@ -31,6 +32,7 @@ func (c *DirIVCache) lookup(dir string) (bool, []byte, string) {
return false, nil, ""
}
+// store - write entry for "dir" into the caches
func (c *DirIVCache) store(dir string, iv []byte, translatedDir string) {
c.lock.Lock()
defer c.lock.Unlock()
diff --git a/pathfs_frontend/file.go b/pathfs_frontend/file.go
index 5c76fb1..16d83c1 100644
--- a/pathfs_frontend/file.go
+++ b/pathfs_frontend/file.go
@@ -93,7 +93,18 @@ func (f *file) readHeader() error {
func (f *file) createHeader() error {
h := cryptfs.RandomHeader()
buf := h.Pack()
- _, err := f.fd.WriteAt(buf, 0)
+
+ // Prevent partially written (=corrupt) header by preallocating the space beforehand
+ f.fdLock.Lock()
+ defer f.fdLock.Unlock()
+ err := syscall.Fallocate(int(f.fd.Fd()), FALLOC_FL_KEEP_SIZE, 0, cryptfs.HEADER_LEN)
+ if err != nil {
+ cryptfs.Warn.Printf("createHeader: Fallocate failed: %s\n", err.Error())
+ return err
+ }
+
+ // Actually write header
+ _, err = f.fd.WriteAt(buf, 0)
if err != nil {
return err
}